人们在他们的 Greasemonkey 脚本中使用了哪些鲜为人知但有用的功能和技术?
(请,每个答案只有一个功能。)
类似主题:
人们在他们的 Greasemonkey 脚本中使用了哪些鲜为人知但有用的功能和技术?
(请,每个答案只有一个功能。)
类似主题:
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
Greasemonkey 脚本通常需要在页面上搜索内容。尝试使用 XPath 定位感兴趣的节点,而不是挖掘 DOM。该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
s 中找到其class
属性设置为"content"
。
即使您没有任何地方可以通过数据 URI 托管文件,您的脚本也可以将图形添加到页面中。
例如,这是一个小按钮图形:
var button = document.createElement("img"); button.src = "数据:图像/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGitJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(按钮);
这是一个在线图像编码器。
还有一篇关于数据 URI 标准的维基百科文章。
数据可以通过GM_setValue(keyname, value)
.
下面是一个简单的例子,它计算了你的脚本被给定浏览器执行的次数:
var od = GM_getValue("里程表", 0); od++; GM_setValue("里程表", od); GM_log("里程表=" + 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() 小心。
匿名统计
假设您有一个提供访问日志的基本托管服务,您可以轻松跟踪脚本的基本使用统计信息。
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
。
GreaseMonkey 脚本在 DOM 准备就绪时运行,因此您无需添加 onload 事件,您只需在 GreaseMonkey 脚本中立即开始操作 DOM。
一个有用的 XPath 技术是指定相对于您已经找到的节点的匹配。作为stackoverflow的人为示例:
// 首先我们在页面顶部获得用户名链接 var hdrdiv = document.evaluate( "//div[@id='headerlinks']/a[1]", 文档, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; // 现在我们可以检索它后面的文本,(用户的信誉分数) //(注意 hdrdiv 现在是 contextNode 参数,而不是文档) var reptext = document.evaluate( "following-sibling::span", hdrdiv, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; alert("声誉分数:" + reptext.textContent);
您可以在相对于 contextNode、祖先、后代、上一个、下一个的任何方向上进行匹配。这是一个有用的 XPath 参考。
可以使脚本头值(@name、@description、@version 等)可检索。这比在脚本的多个位置保持相同的常量值更可取。
已过时: Firefox 在 Greasemonkey 脚本中放弃了对 E4X 的支持,FF 版本为 17。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();