在编写第二个用户JavaScript脚本时,遇到了一个问题,在主要的HTML中无法调用Tampermonkey 中的函数与变量。通过对为数不多的文档的查询,发现可能是处于某些目的网页自带的JavaScript脚本以及控制台所处环境与用户脚本在不同的命名空间,两者函数变量并不互通。

为了解决这个问题,经过多方查阅资料,直到看到了这个,发现要从网页自带的HTML里面调用用户脚本里的函数需要挂靠到window对象上面,但给的例子实在是不明白,经过尝试也并不管用。后来发现Tampermonkey里面有一个unsafeWindow,经过尝试发现在Tampermonkey脚本里面的unsafeWindow对象和网页控制台里面的window对象是一个东西,通过这个桥梁可以实现JavaScript在两个不同环境里面的数据交换与函数调用。

具体的操作就是在Tampermonkey脚本里面把函数给安排成unsafeWindow的成员,在控制台或html里面通过window来调用函数或使用变量。

// 在Tampermonkey脚本这样安排
    unsafeWindow.ccat=777;
    unsafeWindow.getDog=getDog;
    unsafeWindow.hideDog=hideDog;
    unsafeWindow.showDog=showDog;
    unsafeWindow.getCookie=getCookie;
    unsafeWindow.setCookie=setCookie;
    unsafeWindow.cgDog=cgDog;

// 在控制台里这样调用
window.cgDog();
//在HTML里面这样写
fff.innerHTML="<a hidefocus=\"true\" id=\"btdoge\"  class=\"returnlist\"  onclick=\"window.cgDog()\" style=\"background-color: #f26c4f;\" title=\"切换状态\"><b>切换状态</b></a>";

现在发现JavaScript越来越有意思了(雾)……

下面是整个脚本的代码:

th2.jpeg
th2.jpeg


// ==UserScript==
// @name         北朝论坛(northdy.com)签名档图片一键隐藏
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  一个简单的单一功能脚本,可以将北朝论坛(northdy.com)签名档图片一键隐藏。
// @author       dogcraft
// @match        https://bbs.northdy.com/thread*
// @grant        unsafeWindow
// ==/UserScript==

function getDog() {
    var dog1=document.getElementsByClassName("sign");
    var dogList=[]
    for (let index = 0; index < dog1.length; index++) {
        const element = dog1[index];
        var dog2 = element.getElementsByTagName("img");
        // dogList.push(dog2)
        for (let icat = 0; icat < dog2.length; icat++) {
            const element2 = dog2[icat];
            dogList.push(element2)
        }
    }
    return dogList;
}

// cat1[0].style.display="none"

function hideDog(qingdan) {
    for (let incat = 0; incat < qingdan.length; incat++) {
        const du = qingdan[incat];
        du.style.display="none"
    }
}

function showDog(qingdan) {
    for (let incat = 0; incat < qingdan.length; incat++) {
        const du = qingdan[incat];
        du.style.display=""
    }
}

function crDog() {
    var fff=document.createElement("span");
    var aaa=document.getElementById("scrolltop");
    fff.innerHTML="<a hidefocus=\"true\" id=\"btdoge\"  class=\"returnlist\"  onclick=\"window.cgDog()\" style=\"background-color: #f26c4f;\" title=\"切换状态\"><b>切换状态</b></a>";
    aaa.appendChild(fff);
}
// onclick
function cgDog(params) {
    var flagdog=getCookie("sigpicdog");
    var sso=document.getElementById("btdoge");
    if (flagdog=="dog") {
        setCookie("sigpicdog","cat",180);
        hideDog(getDog());
        sso.style.backgroundColor="rgb(0,180,0)";
    } else {
        setCookie("sigpicdog","dog",180);
        showDog(getDog());
        //var sso=document.getElementById("btdoge");
        sso.style.backgroundColor="rgb(180,0,0)";
    }

}
function setCookie(cname,cvalue,exdays)
{
    var d = new Date();
    d.setTime(d.getTime()+(exdays*24*60*60*1000));
    var expires = "expires="+d.toGMTString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
}

function getCookie(cname)
{
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++)
    {
        var c = ca[i].trim();
        if (c.indexOf(name)==0) return c.substring(name.length,c.length);
    }
    return "";
}
crDog();


(function() {
    'use strict';
    unsafeWindow.ccat=777;
    unsafeWindow.getDog=getDog;
    unsafeWindow.hideDog=hideDog;
    unsafeWindow.showDog=showDog;
    unsafeWindow.getCookie=getCookie;
    unsafeWindow.setCookie=setCookie;
    unsafeWindow.cgDog=cgDog;
    var xxdog=getCookie("sigpicdog")
    if (xxdog=="cat") {
        hideDog(getDog());
        var llodog = document.getElementById("btdoge");
        llodog.style.backgroundColor="rgb(0,180,0)";
    }
    console.log("欢迎使用签名档图片一键隐藏脚本 -- dogcraft(https://dogcraft.top)");
    // Your code here...
})();