在我的 Chrome 扩展程序上 Copy All Urls ,我开发了一种“粘贴”功能来打开剪贴板中找到的所有 URL,每个 URL 一个选项卡。
但此功能无法正常工作,有时工作正常,有时仅打开应打开的所有 URL 的几个子集。
我怀疑 Chrome API,更具体地说是 chrome.tabs.create
造成了这个错误,所以我编写了一小段代码来测试它:
popup.html:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="vendor/jquery-1.7.2_min.js"></script>
<script type="text/javascript" src="popup.js"></script>
</head>
<body>
<button id="actionTest">Test</button>
</body>
</html>
popup.js:
jQuery(function($){
$('#actionTest').click(function(e){
var urlList = ["http://stackoverflow.com/","http://en.wikipedia.org/wiki/Main_Page","http://www.codinghorror.com/blog/","http://nodejs.org/","https://github.com/","http://wallbase.cc/","http://www.chromium.org/Home","http://www.photoshoptuto.com/?s=test+chrome+tabs","http://www.youtube.com/","https://www.tumblr.com/","http://www.imdb.com/","http://www.flickr.com/","http://kickass.to/","https://www.dropbox.com/","http://fr.slideshare.net/","http://www.deviantart.com/","http://www.livejournal.com/","http://ohnotheydidnt.livejournal.com/82624099.html","http://www.etsy.com/","http://www.mediafire.com/","http://www.foxnews.com/","http://www.foxnews.com/politics/2013/10/21/obama-addresses-problems-with-health-care-website/"];
$.each(urlList, function(key, val){
chrome.tabs.create({ url: val}, function(tab){
// console.log('openned: '+tab.url);
});
});
});
});
如您所见,urlList 包含 22 个 URL,但是当我按下测试按钮时,我并不总是打开 22 个新选项卡。
怎么了? 谢谢
最佳答案
我自己没有测试过(由于时间不够),但我相信问题是这样的:
问题
您正在从 popup.js
创建选项卡。一旦新选项卡获得焦点,弹出窗口 (popup.html
) 就会关闭/隐藏,并且所有 JavaScript 执行都会停止。这意味着在第一个选项卡获得焦点之前,将打开尽可能多的 popup.js
设法创建的选项卡。所以,有时是全部,有时是一些等等。
解决方案
解决方案是将“选项卡创建”代码放在后台页面(或者更好的是事件页面)中。例如:
// ...in popup.js
...
chrome.runtime.getBackgroundPage(function(bgPage) {
bgPage.openAllURLsInTabs();
});
...
(当然,有很多可能的方法,例如消息传递等)
演示
出于演示目的,我整理了一个小扩展程序,可以打开 22 个 URL 的新选项卡。为简单起见,它没有弹出窗口,只有浏览器操作。
文件结构如下:
TestCX
|__background.js
|__jquery-1.7.2_min.js
|__manifest.json
background.js:
var urlList = [
"http://stackoverflow.com/",
"http://en.wikipedia.org/wiki/Main_Page",
"http://www.codinghorror.com/blog/",
"http://nodejs.org/",
"https://github.com/",
"http://wallbase.cc/",
"http://www.chromium.org/Home",
"http://www.photoshoptuto.com/?s=test+chrome+tabs",
"http://www.youtube.com/",
"https://www.tumblr.com/",
"http://www.imdb.com/",
"http://www.flickr.com/",
"http://kickass.to/",
"https://www.dropbox.com/",
"http://fr.slideshare.net/",
"http://www.deviantart.com/",
"http://www.livejournal.com/",
"http://ohnotheydidnt.livejournal.com/82624099.html",
"http://www.etsy.com/",
"http://www.mediafire.com/",
"http://www.foxnews.com/",
"http://www.foxnews.com/politics/2013/10/21/obama-addresses-problems-with-health-care-website/"
];
chrome.browserAction.onClicked.addListener(function() {
$.each(urlList, function(key, val) {
chrome.tabs.create({ url: val }, function(tab) {
console.log("Opened: " + tab.url);
});
});
});
manifest.json:
{
"manifest_version": 2,
"name": "Paste All URLs",
"version": "2.5",
"browser_action": {
"default_title": "Paste many URLs"
},
"background": {
"scripts": [
"jquery-1.7.2_min.js",
"background.js"
]
},
"permissions": [
"tabs"
]
}
<小时/>
希望这能帮助您解决问题。如果没有回来获取更多:)
关于jquery - 循环中 chrome.tabs.create 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19503326/