存储来自网站的greasemonkey脚本中使用的变量

时间:2014-05-07 20:50:26

标签: javascript greasemonkey

在我访问的某个主页上,我想要隐藏我点击的所有链接。我的想法是使用像这样的Greasemonkey脚本:

var blocklist = JSON.parse(GM_getValue("blocklist"));
var as = document.getElementsByTagName('a');
var alength = as.length;   
for(var i=0; i<alength; i++) {
    var a = as[i];
    if(blocklist.indexOf(a.href) >= 0) {
        a.style.display='none';
    } else {
        a.setAttribute('onclick', 'alert("HELP"); return true;');
    }
}

在脚本中我可以调用它,没问题:

blocklist = blocklist.concat('http://someurl');
GM_setValue("blocklist", JSON.stringify(blocklist));

但是在网站本身(读到alert("HELP");的地方)我不能调用这个函数,因为函数和阻止列表都不存在。

有没有办法从网站访问该功能? (可能不是?)我还能在哪里存储这些值,以便让他们重新回到网站的下一个负载? firefox浏览器设置为在关机时进行清理,因此无法使用:访问过的或类似的。

2 个答案:

答案 0 :(得分:1)

您应该使用localStorage,以便在后续页面加载时保留列表。它与GM_setValue真的没什么不同。

localStorage.setItem("blocklist", JSON.stringify(blocklist));

var blocklist = JSON.parse(localStorage.getItem("blocklist"));

答案 1 :(得分:1)

  1. 请勿尝试从网页调用GM_个功能。 (1)这不是直接可能的,(2)这是一种安全风险,(3)几乎从来没有必要。

  2. 永远不要在Greasemonkey脚本中使用onclick(或者根本不使用)。一个简单的alert("HELP"); return true;可能会起作用,但无论如何,任何其他内容都会崩溃,而且形式也很糟糕。

  3. 此外,如果您使用querySelectorAllgetElementsByTagName,您可以微调您处理的链接,EG:document.querySelectorAll ("div.main a.user") - 这只会获得与位于&lt; div&gt;内的CSS类user与班级main

  4. 在这种情况下,使用addEventListener(或使用jQuery)来处理链接,以便您的脚本代码变为:

    var blocklist = JSON.parse (GM_getValue ("blocklist") );
    var targlinks = document.querySelectorAll ('a');
    for (var J = targlinks.length - 1;  J >= 0;  --J) {
        var targlink = targlinks[J];
    
        if (blocklist.indexOf (targlink.href) >= 0) {
            targlink.style.display = 'none';
        } else {
            targlink.addEventListener ('click', virginLinkHandler, false);
        }
    }
    
    function virginLinkHandler (zEvent) {
        var newURL  = zEvent.target.href;
        blocklist   = blocklist.concat (newURL);
        GM_setValue ("blocklist", JSON.stringify (blocklist) );
    }