12

人们在他们的 Greasemonkey 脚本中使用了哪些鲜为人知但有用的功能和技术?

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

类似主题:

4

10 回答 10

13
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
于 2008-09-27T20:34:26.400 回答
13

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) 在divs 中找到其class属性设置为"content"

于 2008-09-23T15:06:50.663 回答
10

即使您没有任何地方可以通过数据 URI 托管文件,您的脚本也可以将图形添加到页面中。

例如,这是一个小按钮图形:

var button = document.createElement("img");
button.src = "数据:图像/gif;base64,"
    + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx"
    + "nnABlAUCKZkYoGitJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=="
somenode.appendChild(按钮);

这是一个在线图像编码器

还有一篇关于数据 URI 标准的维基百科文章。

于 2008-09-24T15:31:44.667 回答
8

数据可以通过GM_setValue(keyname, value).

下面是一个简单的例子,它计算了你的脚本被给定浏览器执行的次数:

var od = GM_getValue("里程表", 0);
od++;
GM_setValue("里程表", od);
GM_log("里程表=" + od);

GM 值类似于 cookie,cookie 值只能由原始域访问,GM 值只能由创建它们的脚本访问。

于 2008-09-23T14:06:37.577 回答
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() 小心。

于 2009-03-19T23:49:02.093 回答
3

匿名统计

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

  1. 在您自己的网站上放置一个 gif 文件(例如,徽标图像)。
  2. 在您的脚本中,将 img 元素附加到引用 gif 的页面:
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

于 2008-09-23T14:27:16.063 回答
2

GreaseMonkey 脚本在 DOM 准备就绪时运行,因此您无需添加 onload 事件,您只需在 GreaseMonkey 脚本中立即开始操作 DOM。

于 2008-09-26T00:20:37.537 回答
2

一个有用的 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 参考

于 2008-09-25T14:09:35.760 回答
1

可以使脚本头值(@name、@description、@version 等)可检索。这比在脚本的多个位置保持相同的常量值更可取。

请参阅从脚本中访问 Greasemonkey 元数据?

于 2008-09-24T02:07:21.697 回答
1

已过时: 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();
于 2012-01-06T21:33:24.247 回答