我正在为正在度假的同事调试一些事情,并且对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
答案 0 :(得分:0)
我猜测问题是标题实际上是在页面HTML中定义的。由于这是beforeNavigate
事件,因此页面尚未加载,因此通常标题尚不可用,只有URL。
一种解决方案可能是使用navigate
事件而不是beforeNavigate
,前提是您在页面实际加载之前没有特别需要做任何事情。但是我不确定实际上是否会保证页面会被加载,但确实更有可能。
如果它仍然是一个问题,更复杂的选择是使用injected script,只要页面加载,它就会向全局页面发送消息。在注入的脚本中使用DOM ready事件,然后只将消息发送到包含页面标题的全局页面。使用if (window == window.top)
阻止嵌入式iframe也发送消息。