我试图编写一个Google Chrome扩展程序,通过其类名抓取页面中的元素。我们的想法是使用内容脚本来获取这些元素并将消息传递给扩展并弹出。但是,我的内容脚本总是在加载整个页面之前最终执行,因此我无法抓取我想要的元素。我尝试使用window.loaded
和document.loaded
,但它没有用。我也试过等待一段时间,但脚本总是在完全相同的停止点处执行。
//我的内容脚本
if (document.readyState == "complete"){
var board_name_arr = [];
var node = document.getElementsByClassName('Board');
for (var i = 0; i < node.length; ++i){
var board_name = node[i].getElementsByClassName('boardName')[0].textContent;
board_name_arr[i] = board_name;
}
if (Object.keys(board_name_arr).length){
alert("found board");
}
}
有没有办法强迫它运行?或者我不应该使用内容脚本方法吗?
答案 0 :(得分:3)
可能页面通过AJAX动态加载其内容,因此当文档状态准备好时,您仍可能无法加载要查找的元素。即使内容的某些部分在开始时加载,更多内容可能会在以后出现。要正确解决此问题,我建议您使用MutationObserver技术。我在Chrome扩展程序中使用它来注入“收藏夹”#39;每个Facebook帖子的按钮都很完美。
参见代码示例:
var obs = new MutationObserver(function (mutations, observer) {
for (var i = 0; i < mutations[0].addedNodes.length; i++) {
if (mutations[0].addedNodes[i].nodeType == 1) {
$(mutations[0].addedNodes[i]).find(".userContentWrapper").each(function () {
injectFBMButton($(this));
});
}
}
injectMainButton();
});
obs.observe(document.body, { childList: true, subtree: true, attributes: false, characterData: false });
答案 1 :(得分:2)
如果没有jQuery,您可以在页面加载事件上定义回调函数。你可以这样做:
var loadfunction = window.onload;
window.onload = function(event){
//enter here the action you want to do once loaded
if(loadfunction) loadfunction(event);
}
或者这样:
window.addEventListener("load", function load(event){
window.removeEventListener("load", load, false); //remove listener, no longer needed
//enter here the action you want to do once loaded
},false);
答案 2 :(得分:0)
我知道,这个问题发布得太久了。 不过,希望这对像我这样搜寻的人有所帮助。
Chrome扩展程序的ContentScript具有一个名为run_at的选项,其选项为:document_start,document_idle和document_end。 文档:https://developer.chrome.com/extensions/content_scripts#run_time
.
.
.
"content_scripts": [
{
"js": ["PATH_TO_YOUR_SCRIPT.JS"],
"run_at": "document_end"
}
]
.
.
.
正是您所需要的(是manifest.json文件的部分内容。
答案 3 :(得分:-2)
尝试使用Jquery
$(document).ready(function(){ //your code here });