Javascript Greasemonkey的隐藏特征
人们在Greasemonkey脚本中使用的一些鲜为人知但有用的特性和技术是什么 (请,每个答案只有一个功能。) 类似的线程:Javascript Greasemonkey的隐藏特征,javascript,greasemonkey,Javascript,Greasemonkey,人们在Greasemonkey脚本中使用的一些鲜为人知但有用的特性和技术是什么 (请,每个答案只有一个功能。) 类似的线程: 可以通过GM_setValue(keyname,value)将数据存储为mozilla首选项值,从而在页面加载过程中保持数据 下面是一个简单的示例,用于统计给定浏览器执行脚本的次数: var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer="
GM_setValue(keyname,value)
将数据存储为mozilla首选项值,从而在页面加载过程中保持数据
下面是一个简单的示例,用于统计给定浏览器执行脚本的次数:
var od = GM_getValue("odometer", 0);
od++;
GM_setValue("odometer", od);
GM_log("odometer=" + od);
var od=GM_getValue(“里程表”,0);
od++;
GM_设定值(“里程表”,od);
GM_日志(“里程表=“+od”);
GM值与cookie类似,因为cookie值只能由原始域访问,GM值只能由创建它们的脚本访问。匿名统计信息
假设您有一个提供访问日志记录的基本托管服务,您可以轻松地跟踪脚本的基本使用统计信息
要跟踪多个脚本,请为每个脚本使用不同的gif文件。或者在URL中添加某种区别参数(例如:
http://mysite.com/logo.gif?zippyver=1.0
)。Greasemonkey脚本通常需要搜索页面上的内容。尝试使用XPath来定位感兴趣的节点,而不是通过DOM进行挖掘。document.evaluate()
方法允许您提供XPath表达式并返回匹配节点的集合。这是一个很好的开始。例如,我编写了一个脚本,该脚本使phpBB3文章中的链接在新选项卡(默认皮肤)中打开:
/==UserScript==
//@name phpBB3中的新选项卡
//@名称空间http://robert.walkertribe.com/
//@description使phpBB3板中帖子中的链接打开新选项卡。
//==/UserScript==
var newWin=功能(ev){
var win=window.open(ev.target.href);
if(win)ev.preventDefault();
};
var links=document.evaluate(
“//div[@class='content']//a[非(@onclick)和非(@href='#')]”,
文档,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
对于(var i=0;i
代码中使用的XPath表达式标识了所有a
元素,这些元素1)没有onclick
属性,2)其href
属性未设置为“#”
,3)位于div
中,其类属性设置为“content”
脚本头值,(@name、@description、@version等)可以进行检索。这比在脚本的多个位置保持相同的常量值更可取
请参见您的脚本可以通过数据URI将图形添加到页面中,即使您没有任何存放文件的位置
例如,下面是一个小按钮图形:
var button = document.createElement("img");
button.src = "data:image/gif;base64,"
+ "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx"
+ "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=="
somenode.appendChild(button);
var按钮=document.createElement(“img”);
button.src=“数据:image/gif;base64,”
+“R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yh5baeaaamalaaaaqaaaaaaaihni+pywOtwINHTmpvy3rx”
+“nnablauckzkygitjzzutcmfach+h09wdgltaxplzcbiesbvbgvhzcbtbwfydfynhdmvyiqaow=”
appendChild(按钮);
这是一个在线的例子
一种有用的XPath技术是指定与已找到的节点相关的匹配项。作为stackoverflow的人为示例:
// first we got the username link at the top of the page
var hdrdiv = document.evaluate(
"//div[@id='headerlinks']/a[1]", document, null,
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
// now we can retrieve text that follows it, (user's reputation score)
// (note that hdrdiv is now the contextNode argument, rather than document)
var reptext = document.evaluate(
"following-sibling::span", hdrdiv, null,
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
alert("Reputation Score: " + reptext.textContent);
//首先,我们在页面顶部找到了用户名链接
var hdrdiv=document.evaluate(
//div[@id='headerlinks']/a[1],文档,空,
XPathResult.FIRST\u ORDERED\u NODE\u TYPE,null);
//现在我们可以检索它后面的文本(用户的声誉分数)
//(注意,hdrdiv现在是contextNode参数,而不是document)
var reptext=document.evaluate(
“以下同级::span”,hdrdiv,null,
XPathResult.FIRST\u ORDERED\u NODE\u TYPE,null);
警报(“声誉分数:+reptext.textContent”);
您可以在相对于contextNode、祖先、后代、上一代、下一代的任何方向上进行匹配。
这里有一个有用的例子
.GreaseMonkey脚本在DOM就绪时运行,因此您不需要添加onload事件,只需在GreaseMonkey脚本中立即开始操作DOM。GM_setValue通常只存储32位整数、字符串和布尔值,但您可以利用uneval()方法(以及稍后检索时的eval()方法)存储任何对象。如果您处理的是纯JSON值(而不是JavaScript对象),请使用JSON.stringify进行存储,使用JSON.parse进行检索;这将更快、更安全
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
var foo={people:['Bob','George','Smith','Grognak the Destroyer'],pie:true};
GM_setValue('myVeryOwnFoo',uneval(foo));
var fooReborn=eval(GM_getValue('myVeryOwnFoo','new Object()'));
GM_log('People: '+fooReborn.people+' Pie:'+fooReborn.pie);
在本例中,我倾向于使用“new Object()”作为默认值,但您也可以使用“({})”。请记住“{}”作为字符串计算,而不是对象。像往常一样,小心地使用eval()。过时:Firefox放弃了对E4X的支持,在Greasemonkey脚本中,FF版本17。使用gmu info
获取元数据
您可以使用e4x作为变量访问==用户脚本==信息:
var metadata=<>
// ==UserScript==
// @name search greasemonkey
// @namespace foo
// @include http://*.google.com/*
// @include http://*.google.ca/*
// @include http://search.*.com/*
// @include http://*.yahoo.com/*
// ==/UserScript==
</>.toString();
var元数据=
//==用户脚本==
//@name search greasemonkey
//@foo
//@include http://*.google.com/*
//@include http://*.google.ca/*
//@包括http://search.*网站/*
//@include http://*.yahoo.com/*
//==/UserScript==
.toString();
还有10个问题被标记为隐藏特性。这真的是一个隐藏特性还是鲜为人知的特性?这是Greasemonkey的API文档的一部分,它本身非常小。同意这本身不是隐藏的。但它属于惯用语范畴。是的,GM的API真的不是
var foo={people:['Bob','George','Smith','Grognak the Destroyer'],pie:true};
GM_setValue('myVeryOwnFoo',uneval(foo));
var fooReborn=eval(GM_getValue('myVeryOwnFoo','new Object()'));
GM_log('People: '+fooReborn.people+' Pie:'+fooReborn.pie);
var metadata=<>
// ==UserScript==
// @name search greasemonkey
// @namespace foo
// @include http://*.google.com/*
// @include http://*.google.ca/*
// @include http://search.*.com/*
// @include http://*.yahoo.com/*
// ==/UserScript==
</>.toString();