in javascript

chrome.tabs.create 的 callback 不执行?

在写 chrome 插件的过程中,不知道你有没有遇到使用 chrome.tabs.create 创建一个新的 tab,但是这个方法的 callback 却不执行,具体说来,在调试的时候是可以执行的,关掉 chrome  的 DEBUG 工具后,就不可以了。

前几天我也遇到了这个麻烦,可能出现这种问题的情况为:在点击浏览器上插件的图标后,打开一个 popup 的页面,在这个页面里点击某按钮后执行 chrome.tabs.create 方法新建一个新的 tab 页,关掉 DEBUG 工具后,此方法的 callback 函数就无法执行。

我们先来观察这种 popup 的页面的行为,随便找一个会 popup 页面的扩展,点击,让页面弹出,然后你切换下浏览器上已经打开的 tab 页,看看发生了什么?是不是这个 popup 出来的页面会关闭掉?然后在那个扩展上右键,选择“审查弹出内容”,再切换下 tab,发现了什么?是不是这个弹出的页面依然打开?

这就是问题所在了,默认情况下,chrome.tabs.create 创建新的 tab 后,会自动切换到那个新建的 tab,在不打开 DEBUG 工具的情况下,原先弹出的页面会关闭,也就是被 unload 了,页面中 js 的宿主已经不在了,当然也就不会执行 callback 了。那应该怎么办呢?很简单,不切换 tab 就OK了。在 chrome.tabs.create 的第一个参数中,是有个 selected 的可选属性的,把这个属性置为 false,就不会自动切换到新窗口去了。例如下面的代码:

chrome.tabs.create( { url:chrome.extension.getURL('./html/testy.html'), index:(S.tab.index+1), selected:false }, function(tab){
				setTimeout(function(){_send2Spliter(tab); },50 );
});

我的 callback 中,使用了 setTimeout,是因为我遇到的另外一个问题,我需要在新的 tab 打开后,向新的 tab 发送一点数据,但是大部分时候会失败。经过测试,发送数据的程序是执行了,但是 tab 中接收数据的 callback 未能执行。于是猜测,是新的 tab 中的  chrome.extension.onRequest.addListener 还没来得及执行造成的,于是就稍稍延迟下,再发送数据,这样就OK了。

如果你遇到向新建的 tab 中发送数据失败的情况,不妨也试试这个方法。