从SafariNavigateEvent获取URL和页面标题数据

时间:2013-09-16 17:57:59

标签: safari-extension

我正在为正在度假的同事调试一些事情,并且对Safari扩展开发知之甚少。

我有一个Safari扩展程序,可以侦听'open','beforeNavigate','navigate'和'activate'事件。当触发任何这些事件时,我想跟踪activeTab的url和页面标题。

然而,似乎在某些情况下(即在打开新选项卡之前导航和导航),页面标题并不总是在safari.application.activeBrowserWindow.activeTab对象或传递给我的event对象中定义处理程序。

当我将事件对象打印到控制台时,它会正确填充,但如果我直接在事件处理程序中访问event['target']['title'],它将返回Untitled。我当时会想到填充数据会有延迟,但我无法弄清楚如何处理延迟,也无法找到任何文档。

仅供参考我在我的info.plist中将网站访问权限设置为ALL。

有没有人遇到这个问题?有关如何解决它的任何想法?

他是一段代码:

safari.application.addEventListener("beforeNavigate", function (event) {
    console.log('//-- Event Data -------------------------------------');
    console.log(event);
    console.log(event['target']);
    console.log('Url: ' + event['target']['url']);
    console.log('Title: ' + event['target']['title']);

    console.log('//-- Tab Data -------------------------------------');
    console.log('Url: ' + safari.application.activeBrowserWindow.activeTab.url);
    console.log('Title: ' + safari.application.activeBrowserWindow.activeTab.title);
}, true);

输出到控制台:

//-- Event Data -------------------------------------
SafariBeforeNavigateEvent
    BUBBLING_PHASE: 3
    CAPTURING_PHASE: 1
    TARGETING_PHASE: 2
    bubbles: true
    cancelable: true
    currentTarget: null
    defaultPrevented: false
    eventPhase: 0
    target: SafariBrowserTab
        browserWindow: SafariBrowserWindow
        page: SafariWebPageProxy
        reader: SafariReader
        title: "Google"
        url: "https://www.google.ca/"
        __proto__: CallbackObject
    timeStamp: 1379353767889
    type: "beforeNavigate"
    url: "http://www.google.ca/"
    __proto__: CallbackObject

SafariBrowserTab
    browserWindow: SafariBrowserWindow
    page: SafariWebPageProxy
    reader: SafariReader
    title: "Google"
    url: "https://www.google.ca/"
    __proto__: CallbackObject
Url:
Title: Untitled
//-- Tab Data -------------------------------------
Url: 
Title: Untitled

1 个答案:

答案 0 :(得分:0)

我猜测问题是标题实际上是在页面HTML中定义的。由于这是beforeNavigate事件,因此页面尚未加载,因此通常标题尚不可用,只有URL。

一种解决方案可能是使用navigate事件而不是beforeNavigate,前提是您在页面实际加载之前没有特别需要做任何事情。但是我不确定实际上是否会保证页面会被加载,但确实更有可能。

如果它仍然是一个问题,更复杂的选择是使用injected script,只要页面加载,它就会向全局页面发送消息。在注入的脚本中使用DOM ready事件,然后只将消息发送到包含页面标题的全局页面。使用if (window == window.top)阻止嵌入式iframe也发送消息。