【发布时间】:2015-09-06 12:47:04
【问题描述】:
我正在构建一个 chrome 扩展,它应该查看包含超过 12,000 个值的数组并将其与网页 p 标签进行比较,如果数组中的值在 p 标签内,它应该突出显示文本和悬停时应该显示一些信息。所以,我想使用内容脚本很容易,但使用"run_at": "document_end" 会使网页加载速度慢 3 倍,我的扩展程序加载时间增加了近 10 秒。显然不理想。
这是我的内容脚本代码:
jQuery(document).ready(function($) {
var $all_p = $("p");
$.each(arrayObj, function(key, value) {
$all_p.highlight(key, {caseSensitive: true, className: 'highlight-882312', wordsOnly:true });
});
$('.highlight-882312').each(function() {
var currentKey = $(this).text();
console.log(currentKey);
//Create tooltip on hover.
Tipped.create(this, "<iframe id='cardiFrame' src='https://mywebsite.com/word?q="+footballers[currentKey]+"'></iframe>", {
skin: "white",
hook: 'rightmiddle',
maxWidth: 306,
maxHeight: 365,
background: '#eee',
});
});
});
无论如何,这对我来说太慢了,但我仍然想构建扩展,所以我想我可以将所有 p 标签的数组发送到我的背景/弹出窗口,以便在背景/弹出窗口中它会循环查找关键字,然后在弹出窗口中显示匹配的关键字,并将消息发送回关键字匹配的内容脚本,以便突出显示它们。这会减少加载时间吗?由于额外的 10 秒加载时间根本不理想,这对我的问题来说是一个很好的解决方法吗?
我真的很感激任何建议。
编辑:arrayObj:
var arrayObj = {
"word1": 'word_word1',
"word2": 'word_word2',
"word3": 'word_word3',
// extra 12K lines...
}
Manifest.json:
我的manifest很典型,但是内容脚本信息是:
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"css": ["styles.css", "tipped.css"],
"js": ["jquery.min.js", "jquery-highlight1.js", "spinners.min.js", "tipped.js", "word.js", "script.js"],
"run_at": "document_end"
}
],
【问题讨论】:
-
欢迎来到 SO。不幸的是,“建议”在这个网站上做得不好。另一方面,需要 10 秒的扩展是我们可以提供帮助的。但我无法理解你想要做什么。你能发布你的清单吗?还有
arrayObj?我的猜测是您正在创建 12,000 个 iframe,这会减慢速度。 -
@Teepeemm 进行了编辑。
-
.highlight是做什么的?您不能只在一个循环中进行 12000 次 DOM 访问,一次获取 Ps,将文本放入哈希中,然后(使用 trie)将您的文本与 Ps 匹配,然后再次找到 Ps(您有来自哈希)并为它们着色。这将读取 Ps 一次,然后对每个 P 进行 trie 搜索。比每个 P 标签上的 12000 个 dom 操作快得多。
标签: javascript jquery google-chrome google-chrome-extension