Greasemonkey的隐藏功能

时间:2008-09-23 13:59:37

标签: javascript greasemonkey

人们在Greasemonkey脚本中使用的一些鲜为人知但有用的功能和技术是什么?

(请注意,每个答案只有一个功能。)

类似的主题:

10 个答案:

答案 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)

匿名统计

假设您有一个提供访问日志记录的基本托管服务,您可以轻松跟踪脚本的基本使用情况统计信息。

  1. 在您自己的网站上放置一个gif文件(例如徽标图片)。
  2. 在您的脚本中,将img元素附加到引用gif的页面:
  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等)。这比在脚本中的多个位置保持相同的常量值更好。

请参阅Accessing Greasemonkey metadata from within your script?

答案 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();