Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 页面完全加载后如何执行内容脚本_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 页面完全加载后如何执行内容脚本

Javascript 页面完全加载后如何执行内容脚本,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在尝试编写一个GoogleChrome扩展,通过类名获取页面中的元素。其思想是使用内容脚本获取这些元素,并将消息传递给扩展和弹出窗口。但是,我的内容脚本总是在整个页面加载之前执行,因此我无法获取所需的元素。我尝试使用window.loaded和document.loaded但不起作用。我还尝试了等待一段时间,但脚本总是在完全相同的停止点执行 //我的内容脚本 if (document.readyState == "complete"){ var board_name_arr = []

我正在尝试编写一个GoogleChrome扩展,通过类名获取页面中的元素。其思想是使用内容脚本获取这些元素,并将消息传递给扩展和弹出窗口。但是,我的内容脚本总是在整个页面加载之前执行,因此我无法获取所需的元素。我尝试使用
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");
    }
}
if(document.readyState==“完成”){
var董事会名称arr=[];
var节点=document.getElementsByClassName('Board');
对于(变量i=0;i
有没有办法强迫它去追赶?或者我应该不使用内容脚本方法吗?

尝试使用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);
或者这样:

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动态加载其内容,因此当文档状态就绪时,您想要查找的元素可能仍然没有加载。即使在开始时加载了部分内容,以后也可能会加载更多内容。为了正确地解决这个问题,我向您推荐这些技术。我在我的Chrome扩展中使用它,在每个Facebook帖子中插入“Favorite”按钮,效果非常好

请参见代码示例:

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 });
var obs=新的突变观察者(功能(突变,观察者){
对于(var i=0;i<突变[0]。addedNodes.length;i++){
if(突变[0]。添加节点[i]。节点类型==1){
$(突变[0].addedNodes[i]).find(“.userContentWrapper”).each(函数(){
注入FBMbutton($(本));
});
}
}
injectMainButton();
});
obs.observe(document.body,{childList:true,subtree:true,attributes:false,characterData:false});

我知道,这个问题贴得太长了。 尽管如此,我还是希望它能对像我这样的球探有所帮助

Chrome扩展的ContentScript有一个名为run_at的选项,带有以下选项:document_start、document_idle和document_end。 文件:


这正是你需要的(是manifest.json文件的部分内容。

可能与此重复:这很有效!我使用了第一个,但我不太了解回调函数。是否等待所有页面加载,然后再次调用该函数(如果不是?
window)。onload
是一个事件,这意味着一旦加载页面就会调用它。您可以在这里或互联网上的任何地方获取更多关于活动的信息。建议查看run_at内容脚本选项。解决您的问题有效,这正是我需要的。谢谢。