Chrome扩展程序:从标签中提取关键字不起作用
Chrome Extension: extracting keywords from tab not working
我正在编写一个Chrome扩展程序,以类似于Delicious的方式存储链接。作为扩展的一部分,我想保存我正在存储的链接的关键字。为了获得此关键字,我使用以下函数:
EXT.get_keywords = function (tab) {
var keywords = [];
if(tab) {
chrome.tabs.executeScript(tab.id, {file:"js/keywords.js"},
(function(keywords) {
return function (res) {
var kw_str = res && res[0];
if (kw_str) {
keywords.push.apply(keywords, kw_str.split(","));
}
}
})(keywords));
}
console.log(keywords);
return keywords;
}
"js/关键字.js"文件的内容如下:
var metas = document.getElementsByTagName('meta'),
i = 0,
result = "";
for (i = 0; i < metas.length; i++) {
if (metas[i].getAttribute("name") === "keywords") {
result = metas[i].getAttribute("content");
break;
}
}
result;
"js/关键字.js"脚本运行良好,回调函数从关键字标签中获取内容字符串(如果存在),但是在执行回调后,关键字变量始终[]
。知道吗?
PS:这很奇怪,因为如果我在console.log(keywords)
行执行带有断点的脚本,它可以工作,但如果断点不存在,它就不会:S。
这是
由于chrome.tabs.executeScript()的异步性质。您无法从get_keywords
函数返回关键字 - 实际上您可以返回一个空的keywords
数组,但在函数退出之前不会填充它。
(大多数 chrome.* API 都是异步的,因此您必须调整整个扩展"样式"以符合此要求。
那么,会发生什么呢?
这是执行顺序:
- 空的
keywords
数组被初始化(var keywords = [];
)。 -
executeScript
被称为在后台启动一些令人讨厌的东西。 - 调用
(function(keywords) {...})(keywords)
,返回并注册一个回调(绑定到仍然为空的keywords
数组)。每次注入和执行结束后,将调用回调。 -
executeScript
返回(请注意,尚未执行回调 - 不合时宜地仍在后台执行操作,即注入和执行 JS)。 -
console.log(keywords);
记录(仍然为空的)keywords
数组。 - 返回仍然为空的
keywords
数组 (return keywords;
)。 - 异步注入/执行结束,调用回调,填充
keywords
数组。
如果激活断点,则在到达步骤 5 之前有时间完成注入/执行,因此在返回 keywords
数组之前填充它。
演示这一点的示例扩展:
在后台.js,keywords
数组被记录两次:一次在getKeywords()
返回之前,一次在回调中填充之后。如您所见,在返回空数组后getKeywords()
执行回调日志记录。
内容.js:
var metas = document.getElementsByTagName("meta");
var result = "";
for (var i = 0; i < metas.length; i++) {
var meta = metas[i];
if (meta.name && (meta.name.toLowerCase() === "keywords")) {
result = meta.content;
break;
}
}
result;
背景.js:
function getKeywords(tab) {
var keywords = [];
chrome.tabs.executeScript(
tab.id,
{ file: "/fg/content.js" },
(function(keywords) {
return function(resultArr) {
if (!chrome.runtime.lastError && resultArr[0]) {
keywords.push.apply(keywords, resultArr[0].split(","));
}
console.log("After: ", keywords);
}
})(keywords));
console.log("Before: ", keywords);
}
chrome.browserAction.onClicked.addListener(getKeywords);
manifest.json:
{
"manifest_version": 2,
"name": "Test Extension",
"version": "0.0",
"background": {
"persistent": false,
"scripts": ["./bg/background.js"]
},
"browser_action": {
"default_title": "Test Extension"
},
"permissions": ["activeTab"]
}
相关文章:
- 使用“;这个“;JavaScript原型方法中的关键字
- delete关键字在全局变量上的不同行为
- 在数据提取完成之前进行页面渲染
- JavaScript 中的嵌套函数和 “this” 关键字
- 如何在Javascript中从字符串中提取某些单词
- RegEx JavaScript:数字后的符号提取
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- Regex提取URL返回数组的一部分;未定义”;
- 从对象数组中提取关键字和值
- Chrome扩展程序:从标签中提取关键字不起作用
- 从远程存储库中提取并得到:“解析错误:关键字'import'被保留”
- 使用递归和 yield 关键字提取嵌套列表的 Typescript 函数
- 如何使用 JavaScript 从 tynt API 中提取关键字
- 在提取的文本 JavaScript 中搜索关键字
- 提取搜索引擎'关键字与javascript和HTTP-referer
- 当在数组中找到关键字时,在对象中循环以提取属性名称的问题
- 检测谷歌即时搜索并从URL中提取搜索关键字
- 从字符串中提取关键字:Javascript
- Angular:从用户输入中提取关键字并显示它
- 尝试从 js this 关键字中提取字符串