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

Ire*_*Yeh 6 javascript google-chrome-extension

我正在尝试编写一个 Google chrome 扩展,它通过类名获取页面中的元素。这个想法是使用内容脚本来获取这些元素并将消息传递给扩展并弹出。但是,我的内容脚本总是在加载整个页面之前执行完毕,因此我无法获取所需的元素。我尝试使用window.loadedanddocument.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");
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法强迫它追赶?或者我不应该使用内容脚本方法?

Ale*_*yan 7

可能页面通过 AJAX 动态加载其内容,因此当文档状态准备好时,您要查找的元素可能仍未加载。即使部分内容在开始时加载,更多内容可能会在以后出现。为了正确解决这个问题,我建议你使用MutationObserver技术。我在我的 Chrome 扩展程序中使用它为每个 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 });
Run Code Online (Sandbox Code Playgroud)


Neo*_*Pix 5

如果没有 jQuery,您可以在页面加载事件上定义回调函数。你可以这样做:

var loadfunction = window.onload;
window.onload = function(event){
    //enter here the action you want to do once loaded

    if(loadfunction) loadfunction(event);
}
Run Code Online (Sandbox Code Playgroud)

或者这样:

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);
Run Code Online (Sandbox Code Playgroud)