人们在Greasemonkey脚本中使用的一些鲜为人知但有用的功能和技术是什么?
(请注意,每个答案只有一个功能。)
类似的主题:
答案 0 :(得分:13)
Greasemonkey脚本通常需要搜索页面上的内容。而不是挖掘DOM,尝试使用XPath来定位感兴趣的节点。 document.evaluate()
方法允许您提供XPath表达式并返回匹配节点的集合。这是一个很好的tutorial来帮助你入门。作为一个例子,这里是我编写的一个脚本,它导致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表达式标识了1)没有a
属性的所有onclick
元素,2)其href
属性未设置为"#"
,{3}在div
属性设置为class
的{{1}}内找到。
答案 1 :(得分:13)
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
答案 2 :(得分:10)
您的脚本可以通过数据URI将图形添加到页面中,即使您没有任何地方来托管文件。
例如,这是一个小按钮图形:
var button = document.createElement("img"); button.src = "data:image/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(button);
以下是在线image encoder。
关于数据URI标准的wikipedia article。
答案 3 :(得分:8)
通过GM_setValue(keyname, value)
将数据存储为mozilla首选项值,可以跨页面加载持久保存数据。
这是一个简单的示例,用于计算脚本执行的次数 - 由给定的浏览器确定:
var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer=" + od);
GM值类似于Cookie,因为Cookie值只能由原始域访问,GM值只能由创建它们的脚本访问。
答案 4 :(得分:5)
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()要小心。
答案 5 :(得分:3)
匿名统计
假设您有一个提供访问日志记录的基本托管服务,您可以轻松跟踪脚本的基本使用情况统计信息。
var img = document.createElement("img"); img.src = "http://mysite.com/logo.gif"; document.body.appendChild(img);
现在,每次用户执行您的脚本时,您的托管服务都会在该gif文件上注册一个命中。
要跟踪多个脚本,请为每个脚本使用不同的gif文件。或者在URL中添加某种差异化参数(例如:http://mysite.com/logo.gif?zippyver=1.0
)。
答案 6 :(得分:2)
一种有用的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);
您可以在相对于contextNode,祖先,后代,之前,之后的任何方向上进行匹配。 这是一个有用的 XPath reference
答案 7 :(得分:2)
GreaseMonkey脚本在DOM准备就绪时运行,因此您不需要添加onload事件,只需在GreaseMonkey脚本中立即开始操作DOM。
答案 8 :(得分:1)
可以检索脚本标题值(@ name,@ description,@ version等)。这比在脚本中的多个位置保持相同的常量值更好。
答案 9 :(得分:1)
已过时: Firefox在Greasemonkey脚本中删除了对FF版本17的E4X支持。使用GM_info
获取元数据。
您可以使用e4x将== UserScript ==信息作为变量访问:
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();