人们在他们的Greasemonkey脚本中使用了哪些鲜为人知但有用的功能和技术?
(请注意,每个答案只有一个功能.)
类似主题:
JavaScript的隐藏功能
Java的隐藏功能
C++的隐藏特性
C#的隐藏功能
Robert J. Wa.. 13
Greasemonkey脚本通常需要在页面上搜索内容.而不是挖掘DOM,尝试使用XPath来定位感兴趣的节点.该document.evaluate()
方法允许您提供XPath表达式并返回匹配节点的集合.这是一个很好的教程,可以帮助您入门.作为一个例子,这里是我编写的一个脚本,它导致phpBB3帖子中的链接在新选项卡中打开(在默认皮肤中):
// ==UserScript== // @name New Tab in phpBB3 // @namespace http://robert.walkertribe.com/ // @description Makes links in posts in phpBB3 boards open new tabs. // ==/UserScript== var newWin = function(ev) { var win = window.open(ev.target.href); if (win) ev.preventDefault(); }; var links = document.evaluate( "//div[@class='content']//a[not(@onclick) and not(@href='#')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0; i < links.snapshotLength; i++) { var link = links.snapshotItem(i); link.addEventListener("click", newWin, true); }
代码中使用的XPath表达式标识a
1)没有onclick
属性的所有元素,2)其href
属性未设置为"#"
,以及3)在div
其class
属性设置为的s 中找到"content"
.
Greasemonkey脚本通常需要在页面上搜索内容.而不是挖掘DOM,尝试使用XPath来定位感兴趣的节点.该document.evaluate()
方法允许您提供XPath表达式并返回匹配节点的集合.这是一个很好的教程,可以帮助您入门.作为一个例子,这里是我编写的一个脚本,它导致phpBB3帖子中的链接在新选项卡中打开(在默认皮肤中):
// ==UserScript== // @name New Tab in phpBB3 // @namespace http://robert.walkertribe.com/ // @description Makes links in posts in phpBB3 boards open new tabs. // ==/UserScript== var newWin = function(ev) { var win = window.open(ev.target.href); if (win) ev.preventDefault(); }; var links = document.evaluate( "//div[@class='content']//a[not(@onclick) and not(@href='#')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0; i < links.snapshotLength; i++) { var link = links.snapshotItem(i); link.addEventListener("click", newWin, true); }
代码中使用的XPath表达式标识a
1)没有onclick
属性的所有元素,2)其href
属性未设置为"#"
,以及3)在div
其class
属性设置为的s 中找到"content"
.
==UserScript== ... @require http://ajax.googleapis.com/ajax/framework-of-your/choice.js ==/UserScript==
即使您没有任何地方通过数据URI来托管文件,您的脚本也可以将图形添加到页面中.
例如,这是一个小按钮图形:
var button = document.createElement("img"); button.src = "data:image/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(button);
这是一个在线图像编码器.
以及关于数据URI标准的维基百科文章.
通过将数据存储为mozilla首选项值,可以跨页面加载持久保存数据GM_setValue(keyname, value)
.
下面是一个简单的示例,通过给定的浏览器计算脚本执行的次数:
var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer=" + od);
GM值类似于cookie,因为cookie值只能由原始域访问,GM值只能由创建它们的脚本访问.
GM_setValue通常只存储32位整数,字符串和布尔值,但您可以利用uneval()方法(以及稍后检索的eval())来存储任何对象.如果您正在处理纯JSON值(而不是JavaScript对象),请使用JSON.stringify存储并使用JSON.parse进行检索; 这将更快更安全.
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()小心翼翼.