4

我现在正在开发一个 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扩展,javascript:为什么会触发两次?

此页面与我的问题类似,但此页面正在讨论“tabs.onUpdated”事件。

由于“tabs.onUpdated”事件不提供事件过滤器,我更喜欢使用“webNavigation”API。

4

1 回答 1

6

来自http://developer.chrome.com/extensions/webNavigation.html#event-onCommitted

frameId ( 整数 )

0 表示导航发生在标签内容窗口中;正值表示在子帧中导航。框架 ID 在选项卡中是唯一的。

如果console.log(e)在事件处理程序中添加,您会看到第一个事件有frameId= 0,而第二个事件有一个正数,这意味着它属于 iframe。如果您只对主窗口导航感兴趣,只需e.frameId === 0在事件处理程序的开头添加一个检查。

于 2013-09-07T08:52:24.347 回答