3

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

我有一个 Safari 扩展程序,它监听“打开”、“之前导航”、“导航”和“激活”事件。当这些事件中的任何一个被触发时,我想跟踪 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
4

1 回答 1

0

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

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

如果它仍然是一个问题,一个更复杂的替代方法是使用注入脚本,该脚本在页面加载时向全局页面发送消息。在注入脚本中使用 DOM 就绪事件,然后将消息发送到包含页面标题的全局页面。用于if (window == window.top)防止嵌入的 iframe 也发送消息。

于 2013-09-16T20:42:48.287 回答