当前位置:  开发笔记 > 编程语言 > 正文

Greasemonkey的隐藏功能

如何解决《Greasemonkey的隐藏功能》经验,为你挑选了5个好方法。

人们在他们的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表达式标识a1)没有onclick属性的所有元素,2)其href属性未设置为"#",以及3)在divclass属性设置为的s 中找到"content".



1> Robert J. Wa..:

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表达式标识a1)没有onclick属性的所有元素,2)其href属性未设置为"#",以及3)在divclass属性设置为的s 中找到"content".



2> mislav..:
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==



3> Chris Noe..:

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

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

var button = document.createElement("img");
button.src = "data:image/gif;base64,"
    + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx"
    + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=="
somenode.appendChild(button);

这是一个在线图像编码器.

以及关于数据URI标准的维基百科文章.


如果你确实有一个托管文件的地方,但是没有太多的带宽,你可以使用相对最近添加的@resource和GM_getResourceURL函数,这样用户可以在安装你的图像(或其他资源)时下载它们.脚本.它之后被保存在本地

4> Chris Noe..:

通过将数据存储为mozilla首选项值,可以跨页面加载持久保存数据GM_setValue(keyname, value).

下面是一个简单的示例,通过给定的浏览器计算脚本执行的次数:

var od = GM_getValue("odometer", 0);
od++;
GM_setValue("odometer", od);
GM_log("odometer=" + od);

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



5> PotatoEngine..:

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()小心翼翼.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有