Firefox WebExtension,在页面加载时运行脚本一次

时间:2017-08-22 13:39:50

标签: javascript firefox-addon firefox-webextensions

我的当前脚本旨在重定向页面,如果它在数组中有URL。我的脚本将(我认为)重定向页面,然后继续重定向它(导致不断加载的页面)。有没有办法只运行一次脚本或结束脚本?

脚本:

var blocked = ["http://example.org", "http://example.com"];
function check () {
    for (i = 0; i < blocked.length; i++ ) {
        var item = blocked[i];
        var url = window.location.href;
        if (blocked[i] == url) {
            return "interface/redirect.html";
        }
    }
    return url;
}
window.location = chrome.runtime.getURL(check());

以下两种尝试都不起作用:

var blocked = ["http://example.org", "http://example.com"];
var ran = false;
function check () {
    for (i = 0; i < blocked.length; i++ ) {
        var item = blocked[i];
        var url = window.location.href;
        if (blocked[i] == url) {
            return "interface/redirect.html"
        }
    }
    return url;
}
if (ran == false) {
    window.location = chrome.runtime.getURL( check () );
    ran = true;
}

var blocked = ["http://example.org", "http://example.com"];
function check () {
    for (i = 0; i < blocked.length; i++ ) {
        var item = blocked[i];
        var url = window.location.href;
        if (blocked[i] == url) {
            return "interface/redirect.html";
        }
    }
    return url;
}
window.location = chrome.runtime.getURL(check());
var x = 0;
while (x == 0) {

};

我的脚本目前通过"content_scripts"运行:

"content_scripts": [
    {
        "matches": ["<all_urls>"],
        "run_at": "document_start",
        "js": ["redirect.js"]
    }
]

1 个答案:

答案 0 :(得分:3)

首先,由于内容脚本未注入chrome-extension:页面,因此对于已阻止的网址,您将无法获得任何循环。

但是,对于未被阻止的网址存在循环风险,因为即使您为window.location分配了相同的值,它也会重新加载页面。

此外,将真实的URL传递给chrome.runtime.getURL()会破坏它 - 所以,幸运的是,你不会得到循环,但你也无法访问任何页面。

因此,您的代码应该只是在“允许”情况下分配。

function check () {
    if (blocked.includes(window.location.href)) {
        window.location = chrome.runtime.getURL("interface/redirect.html");
    }
}
check();

(使用的方法:Array.prototype.includes

那就是说,你正在使用错误的工具来完成工作。正确的方法是使用webRequest API。它可以让你更有效地重定向,并且专门为工作而设计。请参阅Chrome文档中的examples