1、每个用户脚本都含有一段元数据,用来向 Greasemonkey 描述这个脚本自身的信息:发行者,执行规则等等。
元数据可以以任意次序排列。笔者推荐使用@name,@namespace,@description,@include,最后是@exclude,但是其它的顺序也没关系。
// @name HelloWorld // @namespace http://diveintogreasemonkey.org/download/ // @description 描述 // @include * // @exclude http://diveintogreasemonkey.org/* // @exclude http://www.diveintogreasemonkey.org/* @include URL和@exclude URL最重要,在这个例子中,我们告诉 Greasemonkey 在除了http://diveintogreasemonkey.org/和http://www.diveintogreasemonkey.org/的所有网站上执行。排除(Excludes)优先于包含(includes),所以即使http://diveintogreasemonkey.org/download/匹配* (所有网站),它还是会被排除掉,因为它还匹配http://diveintogreasemonkey.org/*@include和@exclude 是可选的,可以自定义执行和豁免的 URL,但必须每条规则各占一行。如果您没有任何定义, Greasemonkey 将会对所有的网站执行您的用户脚本。(等同于@include *)。
用户脚本的名字:@name可选的。如果存在,它只能被定义一次。如果不存在,将会默认显示用户脚本的去掉扩展名.user.js的文件名
@namespace是可选的。如果存在,它只能被定义一次。如果不存在,将会默认使用下载用户脚本的网站域名。
2、调试用户脚本-用错误控制台追踪错误-F12
如果用户脚本好似没有正常执行,第一个要检查的地方是错误控制台,那里列出了所有与脚本有关的错误,包括用户脚本在内。
3、日志函数GM_log(String str),这个函数可以将消息写入错误控制台。GM_log有一个参数:日志的字符串。在将信息输出到错误控制台
二、使用当中遇到的问题:
1、延迟调用函数的错误方法
function helloworld() {alert(‘Hello world!‘);}
window.setTimeout("helloworld()", 60);
这段代码没有起任何作用;不会弹出提示窗口。如果您打开错误控制台,会看到一个异常:Error: helloworld is not defined.这是因为当延迟结束,开始调用helloworld()时,helloworld函数已经不存在了。
如果您需要引用用户脚本中的变量或者函数,应该显式的把它们定义为window对象的属性,它是始终存在的。
window.helloworld = function() { //显式的把它们定义为window对象的属性
alert(‘Hello world!‘);
}
window.setTimeout("helloworld()", 60)
然而,在 window上设置属性依然不太理想;这有点像用全局变量来做局部变量该做的事。(事实上,就是那么回事,window是全局的,可以被页面中的所有脚本访问。更实际的讲,它可能会与页面自身的脚本,甚至是其它的用户脚本相互干扰。
最佳的解决方案是定义匿名函数,把它作为第一个参数传递给 window.setTimeout。
延迟调用函数的最好方法:
window.setTimeout(function() { alert(‘Hello world!‘) }, 60);
我在这里所做的是建立一个没有名字的函数(一个“匿名函数”),然后直接把它传递给 window.setTimeout。这样可以完成与上个例子相同的事,而不会留下痕迹。例如不会被其它的脚本检测到。
我发现我在写用户脚本时经常使用匿名函数。它们很适合创建“一次性”函数,然后当作参数传递给类似window.setTimeout,document.addEventListener 或者赋值给事件句柄像click 或 submit。
2、对于许多网站,无论是否有 www. 前缀,访问网站都是等效的。如果要为这样的站点写用户脚本,需要能匹配这两种地址。
例:匹配域名和它所有子域名的元数据标签 // ==UserScript== // @include http://example.com/* // @include http://*.example.com/* // ==/UserScript==