我正在开发Chrome扩展程序。
我遇到了这个问题,当我访问facebook时,“webNavigation.onComitted”事件在facebook.com上被触发两次。
这是我现在的代码,但它在控制台中两次打印“Facebook”。
// while logging in facebook.com, it prints "facebook" in console.
chrome.webNavigation.onCommitted.addListener(function(e) {
console.log("Facebook");
}, {url: [{urlPrefix : 'https://www.facebook.com/'}]})
另一方面,此代码可以正常工作。 当我访问youtube.com时,它会像我预期的那样在控制台中打印一次“youtube”。
// on accessing youtube.com, it prints "youtube" in console.
chrome.webNavigation.onCommitted.addListener(function(e) {
console.log("youtube");
}, {url: [{urlPrefix : 'http://www.youtube.com/'}]})
无论如何,我希望它在访问facebook.com时只加载一次 我怎样才能让它发挥作用?
如果有人知道如何解决这个问题,请帮帮我!!
提前致谢!!
我尝试了什么
http://developer.chrome.com/extensions/webNavigation.html#events
我尝试了所有其他事件类型,例如“onBeforeNavigate”,“onCompleted”。 但它并没有解决我的问题。
有关stackoverflow的相关帖子
Chrome extension, javascript: Why is this firing twice?
此页面与我的问题类似,但此页面讨论的是“tabs.onUpdated”事件。
由于“tabs.onUpdated”事件不提供事件过滤器,我更喜欢使用“webNavigation”API。
答案 0 :(得分:5)
来自http://developer.chrome.com/extensions/webNavigation.html#event-onCommitted:
frameId(整数)
0表示导航发生在选项卡内容窗口中;正值表示子帧中的导航。框架ID在选项卡中是唯一的。
如果在事件处理程序中添加console.log(e)
,您会看到第一个事件有frameId
= 0,而第二个事件有一个正数,这意味着它属于iframe。如果您只对主窗口导航感兴趣,只需在事件处理程序的开头添加e.frameId === 0
的检查。