如何在页面完全加载后执行内容脚本
How to execute content script after the page is loaded completely
我正在尝试编写一个 Google chrome 扩展,通过其 class 名称获取页面中的元素。这个想法是使用内容脚本来获取这些元素并将消息传递给扩展并弹出。但是,我的内容脚本总是在加载整个页面之前结束执行,所以我无法获取我想要的元素。我尝试使用 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");
}
}
有没有办法强制它在 运行 之后?还是我不应该使用内容脚本方法?
尝试使用Jquery
$(document).ready(function(){ //your code here });
如果没有 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);
可能页面通过 AJAX 动态加载其内容,因此当文档状态准备就绪时,您想要查找的元素可能仍未加载。即使部分内容在开始时加载,更多内容可能会在稍后出现。为了正确解决这个问题,我向您推荐 MutationObserver 技巧。我在我的 Chrome 扩展中使用它来将 'Favorite' 按钮注入到每个 Facebook post 并且它工作得很好。
查看代码示例:
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 });
我知道,这个问题发布的时间太长了。
尽管如此,希望它能对像我这样的球探有所帮助。
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文件的部分内容。
我正在尝试编写一个 Google chrome 扩展,通过其 class 名称获取页面中的元素。这个想法是使用内容脚本来获取这些元素并将消息传递给扩展并弹出。但是,我的内容脚本总是在加载整个页面之前结束执行,所以我无法获取我想要的元素。我尝试使用 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");
}
}
有没有办法强制它在 运行 之后?还是我不应该使用内容脚本方法?
尝试使用Jquery
$(document).ready(function(){ //your code here });
如果没有 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);
可能页面通过 AJAX 动态加载其内容,因此当文档状态准备就绪时,您想要查找的元素可能仍未加载。即使部分内容在开始时加载,更多内容可能会在稍后出现。为了正确解决这个问题,我向您推荐 MutationObserver 技巧。我在我的 Chrome 扩展中使用它来将 'Favorite' 按钮注入到每个 Facebook post 并且它工作得很好。
查看代码示例:
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 });
我知道,这个问题发布的时间太长了。 尽管如此,希望它能对像我这样的球探有所帮助。
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文件的部分内容。