在编写第二个用户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越来越有意思了(雾)……
// ==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...
})();