来自:zip11 > 馆藏分类
配色: 字号:
深入浅出-油猴脚本
2022-11-01 | 阅:  转:  |  分享 
  
深入浅出 Greasemonkey目录http://www.ttlsa.com/docs/greasemonkey/1. 开始http://
www.ttlsa.com/docs/greasemonkey/1.1. Greasemonkey 是什么?http://www.
ttlsa.com/docs/greasemonkey/1.2. 安装 Greasemonkeyhttp://www.ttlsa.
com/docs/greasemonkey/1.3. 安装用户脚本http://www.ttlsa.com/docs/grease
monkey/1.4. 管理用户脚本http://www.ttlsa.com/docs/greasemonkey/2. 您的第一个
用户脚本http://www.ttlsa.com/docs/greasemonkey/2.1. Hello Worldhttp:/
/www.ttlsa.com/docs/greasemonkey/2.2. 用元数据描述您的用户脚本http://www.ttls
a.com/docs/greasemonkey/2.3. 编写用户脚本代码http://www.ttlsa.com/docs/gr
easemonkey/2.4. 修改用户脚本http://www.ttlsa.com/docs/greasemonkey/3. 调
试用户脚本http://www.ttlsa.com/docs/greasemonkey/3.1. 用错误控制台追踪错误http:/
/www.ttlsa.com/docs/greasemonkey/3.2. 用?GM_log?记日志http://www.ttls
a.com/docs/greasemonkey/3.3. 用 DOM 查看器查看元素http://www.ttlsa.com/do
cs/greasemonkey/3.4. 用 Javascript Shell 计算表达式http://www.ttlsa.com
/docs/greasemonkey/3.5. 其他调试工具http://www.ttlsa.com/docs/greasemon
key/4. 公共模式http://www.ttlsa.com/docs/greasemonkey/4.1. 在域名以及它所有子域
名上执行用户脚本http://www.ttlsa.com/docs/greasemonkey/4.2. 测试 Greasemonk
ey 函数是否有效http://www.ttlsa.com/docs/greasemonkey/4.3. 测试页面中是否有?HTM
L?元素http://www.ttlsa.com/docs/greasemonkey/4.4. 操作所有?HTML?元素http:
//www.ttlsa.com/docs/greasemonkey/4.5. 操作特定?HTML?元素的所有实例http://ww
w.ttlsa.com/docs/greasemonkey/4.6. 操作所有有特定属性的元素http://www.ttlsa.c
om/docs/greasemonkey/4.7. 在元素前插入内容http://www.ttlsa.com/docs/greas
emonkey/4.8. 在元素后插入内容http://www.ttlsa.com/docs/greasemonkey/4.9.
删除元素http://www.ttlsa.com/docs/greasemonkey/4.10. 替换元素为新内容http://w
ww.ttlsa.com/docs/greasemonkey/4.11. 快速插入复杂的?HTMLhttp://www.ttlsa
.com/docs/greasemonkey/4.12. 在没有服务器的情况下添加图片http://www.ttlsa.com/d
ocs/greasemonkey/4.13. 添加 CSS 样式http://www.ttlsa.com/docs/greasem
onkey/4.14. 获取元素样式http://www.ttlsa.com/docs/greasemonkey/4.15. 设置
元素样式http://www.ttlsa.com/docs/greasemonkey/4.16. 处理已渲染的页面http://w
ww.ttlsa.com/docs/greasemonkey/4.17. 匹配大小写无关的属性值http://www.ttlsa.
com/docs/greasemonkey/4.18. 获取当前域名http://www.ttlsa.com/docs/greas
emonkey/4.19. 改写链接http://www.ttlsa.com/docs/greasemonkey/4.20. 重定
向页面http://www.ttlsa.com/docs/greasemonkey/4.21. 俘获用户点击http://www.
ttlsa.com/docs/greasemonkey/4.22. 覆盖内建的 Javascript 方法http://www.t
tlsa.com/docs/greasemonkey/4.23. 解析?XMLhttp://www.ttlsa.com/docs/
greasemonkey/5. 实例教学http://www.ttlsa.com/docs/greasemonkey/5.1. 案
例:GMail Securehttp://www.ttlsa.com/docs/greasemonkey/5.2. 案例:Blog
lines Autoloadhttp://www.ttlsa.com/docs/greasemonkey/5.3. 案例:Ain''
t It Readablehttp://www.ttlsa.com/docs/greasemonkey/5.4. 案例:Offsi
te Blankhttp://www.ttlsa.com/docs/greasemonkey/5.5. 案例:Dumb Quote
shttp://www.ttlsa.com/docs/greasemonkey/5.6. 案例:Frownieshttp://ww
w.ttlsa.com/docs/greasemonkey/5.7. 案例:Zoom Textareahttp://www.ttl
sa.com/docs/greasemonkey/5.8. 案例:Access Barhttp://www.ttlsa.com/d
ocs/greasemonkey/6. 高级话题http://www.ttlsa.com/docs/greasemonkey/6.
1. 存取持久数据http://www.ttlsa.com/docs/greasemonkey/6.2. 在菜单栏上添加菜单项ht
tp://www.ttlsa.com/docs/greasemonkey/6.3. 整合其他网站的数据http://www.ttl
sa.com/docs/greasemonkey/6.4. 把您的用户脚本编译为扩展http://www.ttlsa.com/do
cs/greasemonkey/Greasemonkey API 参考http://www.ttlsa.com/docs/grea
semonkey/GM_log?- 记录日志到错误控制台http://www.ttlsa.com/docs/greasemonke
y/GM_getValue?- 读取脚本专用的配置值http://www.ttlsa.com/docs/greasemonkey/
GM_setValue?- 设置脚本专用的配置值http://www.ttlsa.com/docs/greasemonkey/GM
_registerMenuCommand?- 在 用户脚本命令 (C) 子菜单中添加菜单项http://www.ttlsa.com
/docs/greasemonkey/GM_xmlhttpRequest?- 进行任意的 HTTP 请求http://www.tt
lsa.com/docs/greasemonkey/GM_openInTab?- 在新标签中打开指定的 URLhttp://www
.ttlsa.com/docs/greasemonkey/GM_addStyle?- 给页面添加 CSS 样式http://www
.ttlsa.com/docs/greasemonkey/“参考资料”链接清单http://www.ttlsa.com/docs/
greasemonkey/技巧清单http://www.ttlsa.com/docs/greasemonkey/实例清单http:
//www.ttlsa.com/docs/greasemonkey/步骤清单http://www.ttlsa.com/docs/g
reasemonkey/修订历史http://www.ttlsa.com/docs/greasemonkey/关于本书http:/
/www.ttlsa.com/docs/greasemonkey/GNU 通用公共许可证http://www.ttlsa.com/
docs/greasemonkey/1. 序言http://www.ttlsa.com/docs/greasemonkey/2.
有关复制,发布和修改的条款和条件http://www.ttlsa.com/docs/greasemonkey/3. 如何将这些条款
用到你的新程序第?1?章?开始1.1.?Greasemonkey 是什么?Greasemonkey 是一个 Firefox 扩展,
它具有通过编写脚本来改变被访问网页的功能。使用它,能使您访问的网站更便于阅读或者更便于使用。使用它,您能修复网页渲染的缺陷,而无须
烦扰网站管理员。使用它,您能让网页更好地使用残疾人援助技术,清楚响亮地说出网页内容,或者将网页内容变为盲文。使用它,您能自动地获得
其它网站的数据,从而使两个网站更好地相互链接起来。然而 Greasemonkey 本身并没有作这些事。实际上,在您安装它之后,您注
意到根本没有任何变动...直到您开始安装一种叫做“用户脚本”的东西。用户脚本(user script)就是一大块 Javascri
pt 代码,还有些附加信息,用来告诉 Greasemonkey 脚本应该在何时何地运行。每个用户脚本能够针对具体页面,具体网站,或
者一批网站。用户脚本能做到您在 Javascript 中可做到的任何事情。实际上,它能做得更多,因为 Greasemonkey 提
供了专供用户脚本使用的函数。这里是http://dunck.us/collab/GreaseMonkeyUserScriptsGr
easemonkey 脚本库含了上百个用户脚本,这些都是用户为了满足自己的需要而写的。一旦您写了自己的用户脚本,只要您认为别人也许
发现它有用,您可以把它添加到脚本库中。您也可以自己使用,因为从编写过程中获得知识,获得满足感,才是更重要的。这是http://gr
easemonkey.mozdev.org/list.htmlGreasemonkey 的邮件列表,您可以在那里提问,发表用户脚本
,和讨论新特性的想法。Greasemonkey 开发人员常去这个邮件列表; 他们也许会回答您的问题!为什么写这本书?深入浅出 Gr
easemonkey 是从 Greasemonkey 邮件列表中的用户讨论和作者本人编写用户脚本的经验中发展而来。仅仅一个星期,作
者就发现,新用户经常会提出重复的问题,而这些问题是被回答过的。此外,在写了几个用户脚本以后,作者发现,一些常用的模式,以及可以解决
某一类问题的成块的可重用代码会反复出现。因此,作者开始整理这些有用的模式,解释编程思路,同时作者也从中写作中得到不少锻炼。如果没有
Greasemonkey 的开发者 Aaron Boodman 和 Jeremy Dunck 的大力帮助,没有那些对我的初稿提出
宝贵的反馈建议的用户,就不会有现在的这本书。谢谢大家。1.2.?安装 Greasemonkey要写用户脚本,您首先要安装 Grea
semonkey 扩展, 0.3 或以上版本。过程?1.1.?安装 Greasemonkey 扩展访问http://greasem
onkey.mozdev.org/Greasemonkey的主页。点击名为“Install Greasemonkey”的链接。Fi
refox会显示(可能在浏览器窗口的上方)阻止网站安装软件的信息。点击编辑选项...打开“允许的站点”对话框,点击允许,将 Gre
asemonkey 的网站添加到允许安装软件的网站列表中。点击确定,关闭“允许的站点”对话框。再次点击名为“Install Gre
asemonkey”的链接。将弹出安装对话框,确定您要安装。几秒钟后,安装按钮变亮,点击安装。重新启动 Firefox。当您重新启
动了 Firefox 后,选择工具 (T)单。您应该看到四个菜单项:启用 (E)、管理用户脚本 (U)...、新建用户脚本 (N)
...和用户脚本命令 (C)。 只要管理用户脚本 (U)...可以使用,那么就装好了。其他的两个要在特殊情况下才能使用。一般来说,
安装好 Greasemonkey,(除了四个菜单项外)并不会给浏览器添加任何功能。但是它能让您添加别的东西,名叫“用户脚本”,用户
脚本可以用来定制指定的网页。1.3.?安装用户脚本Greasemonkey “用户脚本”是用 Javascript 编写的独立文件
,用来定制一个或多个网页。http://www.ttlsa.com/docs/greasemonkey/您可以在http://du
nck.us/collab/GreaseMonkeyUserScriptsGreasemonkey脚本库,找到许多用户脚本。尽管没
人要求您必须把脚本放到那儿去,但是实际上,您可以把您的脚本共享到任何地方,这样别人就可以安装它了。甚至您根本不需要一台网络服务器,
因为你可以从本地文件中安装用户脚本。http://www.ttlsa.com/docs/greasemonkey/用户脚本的文件名
必须以.user.js结尾。我写的第一个用户脚本叫做“Butler”。它增强了Google的搜索结果的功能。过程?1.2.?安装
Butler 用户脚本访问http://diveintomark.org/projects/butler/Butler 的主页,可
看到有关 Butler 的功能简述。(并不是所有的用户脚本都有主页, Greasemonkey 只要有用户脚本就够了。)点击“Do
wnload version...”链接 (0.3截至发稿时)。弹出一个标题为“Greasemonkey 安装过程”的对话框,其中
显示了将要安装的用户脚本名称,简介以及作用与排除的页面列表。所有这些信息都包含在脚本之中;以后您会在http://www.ttls
a.com/docs/greasemonkey/用元数据描述您的用户脚本学到定义的方法。点击确定安装用户脚本。没有意外的话,Gre
asemonkey 会在状态栏滑出一个提示,“''Butler'' 安装成功”。现在,可以在?http://www.google.co
m/Google中任意搜索一些东西。在搜索结果页面的顶部会有一行文字:“Try your search on: Yahoo, As
k Jeeves, AlltheWeb, ...”。在其下面会有一个标签:“Enhanced by Butler”。这些都是由 B
utler 用户脚本加进去的。参考资料http://dunck.us/collab/GreaseMonkeyUserScripts
Greasemonkey 脚本库有上百个 Greasemonkey 脚本。1.4.?管理用户脚本如果愿意可以安装很多个 Greas
emonkey 脚本。 Greasemonkey 带有配置对话框来管理用户脚本:暂时禁用,改变配置或卸载脚本。过程?1.3.?暂时
禁用 Butler在菜单中,选择工具 (T)?→?Greasemonkey?→?管理用户脚本 (U)...,Greasemonke
y 会弹出一个对话框:“管理用户脚本”。在对话框左方一栏中列出了已安装的所有用户脚本 (如果您从http://www.ttlsa.
com/docs/greasemonkey/本文开始一步步来的话,这里只有一个脚本:Butler。)选中列表中的 Butler,然
后取消启用复选框。左方列表中的“Butler”就会由黑色转为灰色。(当它还是选中状态的时候,看起来比较费劲,但是当安装了很多脚本的
时候,这个特性就非常有用了。)点击?确定,退出“管理用户脚本”对话框。现在 Butler 已经安装,但是未被启用。您在Google
上随便搜索下就会发现确实如此。在页面顶端的“Enhanced by Butler”应该没有了。您可以在“管理用户脚本”对话框中重复
刚才的步骤,重新选中 Butler,重新启用启用复选框。http://www.ttlsa.com/docs/greasemonke
y/虽然我用“暂时”来形容禁用用户脚本,但是如果您不重新启用它,它就始终会被禁用。之所以是暂时,只因为您可以方便的启用它,而不需要
再到我的网站上来找原始脚本,而且还要重新安装。也可以用“管理用户脚本”对话框来彻底得卸载脚本。过程?1.4.?卸载 Butler在
菜单中,选择工具 (T)?→?Greasemonkey?→?管理用户脚本 (U)...。Greasemonkey 会弹出“管理用户
脚本”对话框。在左方列表栏中,选中 Butler 再点击卸载。不需要确认;用户脚本马上就被卸载掉了。第三步... 没有第三步!(感
谢 Jeff Goldblum。)先等一下,还没完呢!您也可以修改您之前安装过的用户脚本的配置。记得http://www.ttls
a.com/docs/greasemonkey/第一次安装 Butler 时看到的对话框吗,上面有两个列表:包含和排除的网站?嗯,
您可以在“管理用户脚本” 对话框中编辑这两个列表,不管是第一次安装时或者其它什么时候。好!继续。假如您觉得 Butler 不错,但
是它在http://froogle.google.com/Froogle上毫无用处。Google的商品对比网站。那么可以编辑用户脚
本的配置来排除这个网站,而让它在别的 Google 网站上仍然生效。过程?1.5.?重新配置 Butler 排除 Froogle在
菜单中,选择工具 (T)?→?Greasemonkey?→?管理用户脚本 (U).... Greasemonkey 会弹出“管理用
户脚本”对话框。在左方面板中,选择“Butler”。接着在右方面板中就会显示两个列表,一个是执行的页面(“http://.goo
gle./”),另一个是豁免的页面(空白)。接下来在“不包含下列网页”的列表中,点击添加...。Greasemonkey 会弹
出另一个对话框:“添加网页地址”,并提示您输入新的URL。在其中输入http://froogle.google.com/然后点击
确定。回到“管理用户脚本”对话框中,豁免页面列表中现在就有了您新添的?URL?和通配符,http://froogle.google
.com/,表示 Butler?不?会在froogle.google.com站点的任何页面上执行。星号被当做通配符使用,可以在?
URL: 域名,路径或者任意?URL?schema(http://)中使用 。点击确定,退出“管理用户脚本”对话框。在 Froog
le 中搜索一下,验证下 Butler 会不会执行。但是它仍然会在普通搜索、图片搜索以及 Google 站点的其他页面中执行。第?
2?章?您的第一个用户脚本2.1.?Hello World我们步入 Greasemonkey 美妙世界的万里长征将从第一步开始,所
有读过技术手册的读者都会很熟悉这一步:让您的电脑打出“Hello world”。例?2.1.?http://www.firefox
.net.cn/dig/download/helloworld.user.jshelloworld.user.js// Hello
World! example user script// version 0.1 BETA!// 2005-04-22// Co
pyright (c) 2005, Mark Pilgrim// Released under the GPL license//
http://www.gnu.org/copyleft/gpl.html//// -----------------------
---------------------------------------------//// This is a Greas
emonkey user script.//// To install, you need Greasemonkey: http:
//greasemonkey.mozdev.org/// Then restart Firefox and revisit thi
s script.// Under Tools, there will be a new menu item to "Instal
l User Script".// Accept the default configuration and install.//
// To uninstall, go to Tools/Manage User Scripts,// select "Hello
World", and click Uninstall.//// -------------------------------
-------------------------------------//// ==UserScript==// @name
Hello World// @namespace http://diveintogreasemonkey
.org/download/// @description example script to alert "Hello wo
rld!" on every page// @include // @exclude http://di
veintogreasemonkey.org/// @exclude http://www.diveintogrea
semonkey.org/// ==/UserScript==alert(''Hello world!'');正如您所见到的,这个H
ello World脚本的大部分都是注释。有些注释,比如如何安装,没什么特殊含义;那只是对初学者的一些指导。但是,有一节注释确实有
特殊含义,下一节会有详细的解释。要看到脚本的效果,您首先要http://www.ttlsa.com/docs/greasemonk
ey/安装,然后访问一个不在diveintogreasemonkey.org域名下的网站(例如,http://www.google
.com/Google)。这个页面将会像平时一样显示出来,还会弹出一个对话框:“Hello world!”下载http://www
.firefox.net.cn/dig/download/helloworld.user.jshelloworld.user.js
2.2.?用元数据描述您的用户脚本每个用户脚本都含有一段元数据,用来向 Greasemonkey 描述这个脚本自身的信息:发行者,
执行规则等等。例?2.2.?Hello World 元数据// ==UserScript==// @name H
ello World// @namespace http://diveintogreasemonkey.org/downl
oad/// @description example script to alert "Hello world!" on e
very page// @include // @exclude http://diveintogrea
semonkey.org/// @exclude http://www.diveintogreasemonkey.o
rg/// ==/UserScript==这里有六条独立的元数据信息,作为一个整体包含在注释中。现在让我们按顺序逐条解释。首先讲
最外面的这层包装。// ==UserScript==//// ==/UserScript==上述标记很重要,必须完全吻合。Grea
semonkey 用它们来标记用户脚本的元数据段。这段注释可以放在用户脚本的任何部位,但经常会放在靠近顶部的地方。在元数据段内,第
一项是名字。// @name Hello World这是您的用户脚本的名字。它将会在您第一次安装脚本时在安装对话
框(install dialog)中显示出来。之后会显示在“管理用户脚本”对话框中。这个名字应该言简意赅。@name可选的。如果存
在,它只能被定义一次。如果不存在,将会默认显示用户脚本的去掉扩展名.user.js的文件名。下一个是命名空间(namespace)
。// @namespace http://diveintogreasemonkey.org/download/这是一个?
URL,Greasemonkey 用它来区分名称相同但是作者不同的用户脚本。如果您有一个域名,您可以使用它作命名空间。另外您也可以
用http://taguri.org/?tag:?URI。@namespace是可选的。如果存在,它只能被定义一次。如果不存在,将
会默认使用下载用户脚本的网站域名。http://www.ttlsa.com/docs/greasemonkey/元数据可以以任意次
序排列。笔者推荐使用@name,@namespace,@description,@include,最后是@exclude,但是其它
的顺序也没关系。下一项是描述。// @description example script to alert "Hello w
orld!" on every page这是关于用户脚本功能的描述。在您第一次安装脚本时,它将会在安装对话框中显示,之后会在“管理
用户脚本”对话框中显示。描述不应多于两句。@description是可选的。如果使用它,那么它只能被定义一次。如果不使用,默认会显
示为空白。http://www.ttlsa.com/docs/greasemonkey/不要忘记写@description。即使您
所写的用户脚本是给自己用的。你最后很可能会拥有很多脚本,如果没有描述的话,在“管理用户脚本”对话框中管理脚本将会成为一件令人头疼的
事。下面三行是最重要的 (从 Greasemonkey 的角度来看):@include和@exclude?URL。// @incl
ude // @exclude http://diveintogreasemonkey.org///
@exclude http://www.diveintogreasemonkey.org/这几行让 Greasemo
nkey 知道在那些网站上执行您的用户脚本。您可以明确的指定一个?URL,或者用通配符来代替域名或路径中的部分字符。在这个例子中
,我们告诉 Greasemonkey 在除了http://diveintogreasemonkey.org/和http://www
.diveintogreasemonkey.org/的所有网站上执行。排除(Excludes)优先于包含(includes),所以
即使http://diveintogreasemonkey.org/download/匹配?(所有网站),它还是会被排除掉,因为
它还匹配http://diveintogreasemonkey.org/。@include和@exclude?是可选的,可以自定
义执行和豁免的?URL,但必须每条规则各占一行。如果您没有任何定义, Greasemonkey 将会对所有的网站执行您的用户脚本。
(等同于@include )。http://www.ttlsa.com/docs/greasemonkey/您需要定义非常精确的
@include和@exclude元数据。Greasemonkey 不会对域名作任何的假设,如果一个网站符合http://exam
ple.com/和http://www.example.com/,您需要把这两个网址都标示出来。参考资料http://taguri
.org/tag:?URIs2.3.?编写用户脚本代码我们的第一个用户脚本是在执行时简单地显示一条提示信息:“Hello worl
d!”。例?2.3.?显示“Hello world!”提示信息alert(''Hello world!'');尽管这段代码仿佛够用了,
而且也达到了目的。Greasemonkey 实际上在幕后做了很多的事情来确保用户脚本不会与页面所包含的原有脚本发生严重的冲突。特别
是它会自动的把您的用户脚本封装在一个匿名的函数包里。一般情况下,您可以忽视,但是终究有一天会让您遇到麻烦。所以最好现在就了解一下。
最经常遇到的麻烦之一是在用户脚本里定义的变量和函数不能被别的脚本访问。事实上,只要用户脚本运行完了,所有的变量和函数就都不能使用了
。如果您期望使用?window.setTimeout?函数,或者在链接挂上字符串式的?onclick?属性然后期望 Javascr
ipt 稍后调用您的函数,那么您会遇到问题。例如,下面这个用户脚本中定义了一个函数?helloworld, 然后尝试设置一个计数器
来在一秒后调用这个函数。例?2.4.?延迟调用函数的错误方法function helloworld() {alert(''Hello
world!'');}window.setTimeout("helloworld()", 60);这段代码没有起任何作用;不会弹出
提示窗口。如果您打开http://www.ttlsa.com/docs/greasemonkey/错误控制台,会看到一个异常:Er
ror: helloworld is not defined.这是因为当延迟结束,开始调用helloworld()时,hellow
orld函数已经不存在了。如果您需要引用用户脚本中的变量或者函数,应该显式的把它们定义为window对象的属性,它是始终存在的。例
?2.5.?延迟调用函数的更好方法window.helloworld = function() {alert(''Hello wor
ld!'');}window.setTimeout("helloworld()", 60);目的达到了!页面完成加载一秒后,一个提示
框骄傲的弹了出来,写着:“Hello world!”然而,在?window上设置属性依然不太理想;这有点像用全局变量来做局部变量该
做的事。(事实上,就是那么回事,window是全局的,可以被页面中的所有脚本访问。更实际的讲,它可能会与页面自身的脚本,甚至是其它
的用户脚本相互干扰。最佳的解决方案是定义匿名函数,把它作为第一个参数传递给?window.setTimeout。例?2.6.?延迟
调用函数的最好方法window.setTimeout(function() { alert(''Hello world!'') },
60);我在这里所做的是建立一个没有名字的函数(一个“匿名函数”),然后直接把它传递给?window.setTimeout。这样可
以完成与上个例子相同的事,而不会留下痕迹。例如不会被其它的脚本检测到。我发现我在写用户脚本时经常使用匿名函数。它们很适合创建“一次
性”函数,然后当作参数传递给类似window.setTimeout,document.addEventListener?或者赋值给
事件句柄像?click?或?submit。参考资料http://novemberborn.net/sifr/explained/t
erminologyJavascript 中的匿名函数http://youngpup.net/2004/jsblockscopeB
lock Scope in Javascript?和?http://youngpup.net/2004/jsblockscope/
commentsassociated discussion thread2.4.?修改用户脚本对于脚本的作者来讲,“管理用户脚本”
对话框有个很实用的功能:编辑按钮可以“动态的(live)”修改已安装的脚本。过程?2.1.?编辑 Hello World 的源代码
然后观察运行结果在菜单中,选择工具 (T)?→?Greasemonkey?→?管理用户脚本 (U).... Greasemonke
y 会弹出“管理用户脚本”对话框。在左方面板中,选择 Hello World 再点击编辑。Hello World 的已安装版本将会
在你喜好的文本编辑器中打开。(否则,请检查.js文件是否已经关联到您喜好的文本编辑器上。)修改alert语句,替换显示内容为“Li
ve editing!”。在编辑器中保存所做的更改,然后回到浏览器,随意刷新某个页面来测试所做的更改,你将能立刻看到效果。你不需要
重新安装或者“刷新”用户脚本,您是在“动态”修改。http://www.ttlsa.com/docs/greasemonkey/在
“管理用户脚本”对话框中,点击编辑,您正在“动态”修改脚本的副本,它在 Firefox 的个人配置文件夹中。我形成了一个习惯,每“
动态”修改完毕,又回到编辑器,选择文件(F)?→?另存为(a)...,把用户脚本保存到另一个文件夹中。尽管这不是必须的(Greas
emonkey 只会用您配置文件夹中的那个脚本),但是我喜欢在完成全部修改后把脚本在其它文件夹里保存一个“原本”。第?3?章?调试
用户脚本3.1.?用错误控制台追踪错误如果用户脚本好似没有正常执行,第一个要检查的地方是错误控制台,那里列出了所有与脚本有关的错误
,包括用户脚本在内。过程?3.1.?打开错误控制台在 Firefox 菜单中,选择?工具 (T)?→?错误控制台 (C)。控制台中
列出了从打开 Firefox 以来在所有页面上发生的所有错误,应该会有很多的(您会惊奇地发现,很多大的网站的脚本是那么的糟糕)。在
开始调试您的用户脚本前,请点击清空 (C)来清空列表。现在刷新页面来测试出现错误的用户脚本。如果它的确出错了,一条异常会显示在错误
控制台中。http://www.ttlsa.com/docs/greasemonkey/如果您的用户脚本出错了,错误控制台会显示一
条异常(exception)和一个行号。由于 Greasemonkey 将用户脚本插入到页面中,所以行号没有实际的用处,应该忽略这
个行号。这并不是您的用户脚本中发生异常的行号。3.2.?用?GM_log?记日志Greasemonkey 提供了一个记录用的函数,
GM_log,这个函数可以将消息写入错误控制台。这些消息在发布前应当剔出掉,不过在调试时却非常有用。此外,看调试信息比在调试用的警
告窗口中一次次点确定好得多。GM_log有一个参数:日志的字符串。在将信息输出到错误控制台后,用户脚本会一如既往地执行。例?3.1
.?记录到错误控制台然后继续(http://www.firefox.net.cn/dig/download/gmlog.user.
js?gmlog.user.js?)if (/^http:\/\/diveintogreasemonkey\.org\//.tes
t(window.location.href)) {GM_log(''running on Dive Into Greasemonk
ey site w/o www prefix'');} else {GM_log(''running elsewhere'');}GM_
log(''this line is always printed'');安装这个用户脚本后打开?http://diveintogre
asemonkey.org/http://diveintogreasemonkey.org/,这两行就会出现在错误控制台中:Gre
asemonkey: http://diveintomark.org/projects/greasemonkey//Test Lo
g:running on Dive Into Greasemonkey site w/o www prefixGreasemonk
ey: http://diveintomark.org/projects/greasemonkey//Test Log:this
line is always printed如您所见,Greasemonkey 从http://www.ttlsa.com/doc
s/greasemonkey/用户脚本元数据段中取得命名空间和脚本名称,再把作为传给GM_log的参数日志消息算进来,做为显示在错
误控制台中显示的信息。如果您访问的不是http://diveintogreasemonkey.org/http://diveint
ogreasemonkey.org/,那么下面这两条信息会显示在错误控制台中。Greasemonkey: http://divei
ntomark.org/projects/greasemonkey//Test Log:running elsewhereGrea
semonkey: http://diveintomark.org/projects/greasemonkey//Test Log
:this line is always printed我已经厌倦去挖掘日志信息的最大长度。它超过了255个字符。还有,输出的信息
在错误控制台中可以正确断行,可以向下滚动来查看日志消息其余部分。为日志着迷吧!http://www.ttlsa.com/docs/
greasemonkey/在错误控制台中可以用右键(Mac用户用 control-click)点击任意行选中,然后选择复制(C),
将信息复制到剪贴板。参见http://www.ttlsa.com/docs/greasemonkey/GM_log3.3.?用 D
OM 查看器查看元素DOM 查看器能够查看任何页面的已解析的文档对象模型(DOM)。可以获得每个?HTML?元素、属性和文本节点的
详细信息;也可以看到每个页面样式表中的所有 CSS 规则;也可以看到每个对象的所有脚本属性。它的功能非常强大。DOM 查看器包含在
Firefox 的安装程序中,但是由您的平台而定,它可能默认没装。如果您在工具 (T)菜单中看不到DOM 查看器(N),那么您需
要重新安装 Firefox。重新安装 Firefox 不会影响您现有的书签,设置,扩展以及用户脚本。过程?3.2.?安装 DOM
查看器运行 Firefox 的安装程序。接受用户协议后,选择定制 (C)安装。选择安装路径后,安装向导会询问安装的组件。选择开发工
具。安装结束后,运行 Firefox。您会看到工具 (T)?→?DOM 查看器 (N)。下面我们将要访问深入浅出 Greasemo
nkey的主页,让您了解 DOM 查看器的强大功能。过程?3.3.?查看和编辑深入浅出 Greasemonkey的主页访问http
://www.firefox.net.cn/dig/http://www.firefox.net.cn/dig/。在菜单中,选择工
具 (T)?→?DOM 查看器 (N)打开 DOM 查看器。在 DOM 查看器的左侧视图中,会看到 DOM 节点的树状图。如果看不
到,打开左上角的下拉菜单,选择DOM Nodes。DOM 的树状列表从 document 节点开始,标记为?#document。展
开此节点,可以看到?HTML?节点。展开?HTML?元素后可以看到三个节点:HEAD、#text?和?BODY。注意?BODY?的
?id?为?diveintogreasemonkey-org。如果没看到,调整一下列宽度。展开?BODY?可以看到五个节点:?#t
ext,?DIV id="intro",?#text,?DIV id="main"?和?#text。展开?DIV id="intr
o"?可以看到两个节点:?#text?和?DIV class="sectionInner"。展开?DIV class="secti
onInner"?可以看到两个节点:?#text?和?DIV class="sectionInner2"。展开?DIV class
="sectionInner2"?可以看到五个节点:?#text,?DIV class="s",?#text,?DIV class
="s"?和?#text。展开第一个?DIV class="s"?可以看到五个节点:?#text,?H1,?#text,?P?和?
#text。选择?H1?节点。在原始页面上(DOM 查看器后面),?H1?元素会闪现红色的边框。在右侧面板中可以看到节点的名称(“
H1”)、命名空间?URI?(空白,因为?HTML?没有命名空间 -- 只有在页面被当作?application/xhtml+xm
l?时有效,或者显示一些其他名字空间?XML?的页面)、节点类型(1代表元素)和节点值(空白,因为标题没有值 -- 标题上的文字有
自己的节点)。在右侧面板的顶部,有个下拉菜单,在其中可以看到数个选项:DOM Node,?Box Model,?XBL Bindi
ngs,?CSS Style Rules,?Computed Style?和?Javascript Object。它们提供了当前选
中的节点的不同信息。有些是可以修改的,变更会立即反映到原始页面上。选择?Javascript Object?可以看到选中的?H1?
元素的所有可脚本控制的的属性和方法。选择?CSS Style Rules。右侧面板会分为两部分,顶部的列出了所有可以作用于这个元素
的样式(包括浏览器已有的默认样式),下面的显示了样式所定义的属性。在右上方的视图中选中第二条规则,这条样式规则是在?http://
www.firefox.net.cn/dig/css/dig.csshttp://www.firefox.net.cn/dig/c
ss/dig.css?样式表中定义的。在右下面板中双击?font-variant?属性,然后输入新值:?normal。在原始页面中
(DOM查看器后面),“深入浅出 Greasemonkey” 标志文字会立即从 small-caps 变为正常的大小写字母。在右下
面板中任意位置点击右键(Mac 用户 control-click),然后选择?新建属性。会弹出一个对话框:“新样式规则”。输入属性
名称:?background-color,然后点击确定,接下来属性值:red,然后点击确定应用新属性。新属性会显示在右下面板中,并
且原始页面会立即变成红色背景。如果觉得依次展开 DOM 节点树中每层很不方便,那么我强烈推荐您使用 Inspect Element
扩展,它能迅速找到 DOM 查看器中的指定元素。http://www.ttlsa.com/docs/greasemonkey/安
装 Inspect Element 扩展前,您必须先安装 DOM 查看器,否则 Firefox 就不能正常启动。如果已经遇到了这种
情况,打开命令行窗口,进入 Firefox 的安装目录,输入?firefox -safe-mode?。Firefox 会以安全模式
启动,不加载任何扩展,然后选择工具 (T)?→?附加软件 (A)接着卸载 Inspect Element。过程?3.4.?用 In
spect Element 直接查看元素访问?https://addons.update.mozilla.org/extensio
ns/moreinfo.php?id=434Inspect Element?下载页面,然后点击?Install Now。重新启动
Firefox。再访问http://www.firefox.net.cn/dig/http://www.firefox.net.c
n/dig/。右击(Mac 用户 control-click) 标志语:深入浅出 Greasemonkey。在上下文菜单中,选择?
Inspect element。.DOM 查看器会打开,并且选中了?H1?元素,然后您可以马上开始查看和/或编辑它的属性。http
://www.ttlsa.com/docs/greasemonkey/DOM 查看器不会“跟着”您一起浏览网页。如果打开 DOM
查看器然后在原始窗口中浏览别的网页,DOM 查看器会变得非常困惑。好的做法是,去您想去的地方,查看您想查看的页面,在做别的事情前先
关闭 DOM 查看器。参考资料http://www.brownhen.com/DI.htmlDOM 查看器介绍https://ad
dons.update.mozilla.org/extensions/moreinfo.php?id=434Inspect Ele
ment 扩展http://www.projectit.com/freestuff.htmlInspector Widget 扩展
具有 Inspect Element 相同功能的扩展,它增加了一个工具条,而不是一个菜单项。3.4.?用 Javascript S
hell 计算表达式Javascript Shell 是一个 bookmarklet,可以在当前页面的内容中计算任意 Javasc
ript 表达式。过程?3.5.?安装 Javascript Shell访问?http://www.squarefree.com/
bookmarklets/webdevel.htmlJesse''s Web Development Bookmarklets。将?
Shell?bookmarklet 拖放到您的书签工具栏。访问一个网页(例如,http://www.firefox.net.cn/
dig/深入浅出 Greasemonkey?主页),然后点击书签工具栏上的?Shell?bookmarklet。Javascrip
t Shell 窗口会在后台打开。Javascript Shell 提供了与?http://www.ttlsa.com/docs/
greasemonkey/DOM 查看器一样强大的功能,但是环境更加宽松。就把它当作 DOM 的命令行版本吧。游戏开始。例?3.2
.?Javascript Shell 介绍document.title深入浅出 Greasemonkeydocument.titl
e = ''Hello World''Hello Worldvar paragraphs = document.getElements
ByTagName(''p'')paragraphs[object HTMLCollection]paragraphs.length5
paragraphs[0][object HTMLParagraphElement]paragraphs[0].innerHTML
教老网玩新把戏paragraphs[0].innerHTML = ''Live editing, baby!''Live editin
g, baby!当输入完上面的内容后,按回车键,变更就会反映到原始网页上。我想提一下 Javascript Shell 的?pro
ps?函数。例?3.3.?获取元素属性var link = document.getElementsByTagName(''a'')[
0]props(link)Methods of prototype: blur, focusFields of prototype
: id, title, lang, dir, className, accessKey,charset, coords, hre
f, hreflang, name, rel, rev, shape, tabIndex,target, type, protoc
ol, host, hostname, pathname, search, port,hash, text, offsetTop,
offsetLeft, offsetWidth, offsetHeight,offsetParent, innerHTML, s
crollTop, scrollLeft, scrollHeight,scrollWidth, clientHeight, cli
entWidth, styleMethods of prototype of prototype of prototype: in
sertBefore,replaceChild, removeChild, appendChild, hasChildNodes,
cloneNode,normalize, isSupported, hasAttributes, getAttribute, s
etAttribute,removeAttribute, getAttributeNode, setAttributeNode,r
emoveAttributeNode, getElementsByTagName, getAttributeNS,setAttri
buteNS, removeAttributeNS, getAttributeNodeNS,setAttributeNodeNS,
getElementsByTagNameNS, hasAttribute,hasAttributeNS, addEventLis
tener, removeEventListener, dispatchEvent,compareDocumentPosition
, isSameNode, lookupPrefix, isDefaultNamespace,lookupNamespaceURI
, isEqualNode, getFeature, setUserData, getUserDataFields of prot
otype of prototype of prototype: tagName, nodeName,nodeValue, nod
eType, parentNode, childNodes, firstChild, lastChild,previousSibl
ing, nextSibling, attributes, ownerDocument, namespaceURI,prefix,
localName, ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE,CDATA_SECTION
_NODE, ENTITY_REFERENCE_NODE, ENTITY_NODE,PROCESSING_INSTRUCTION_
NODE, COMMENT_NODE, DOCUMENT_NODE,DOCUMENT_TYPE_NODE, DOCUMENT_FR
AGMENT_NODE, NOTATION_NODE,baseURI, textContent, DOCUMENT_POSITIO
N_DISCONNECTED,DOCUMENT_POSITION_PRECEDING, DOCUMENT_POSITION_FOL
LOWING,DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY
,DOCUMENT_POSITION_IMPLEMENTATION_SPECIFICMethods of prototype of
prototype of prototype of prototype of prototype: toString“哇哦!”这
些是什么?它列出了元素??在 Javascript 中所有有效的属性和方法,并且按照 DOM 的对象层级分类。先列出的是链接
元素的特有方法和属性(比如?blur?和?focus?方法,?href?和?hreflang?属性),然后列出了所有节点公有的方法
和属性(比如?insertBefore),等等。此外,这和 DOM 查看器上的内容一样……只不过是多些打字多些试验,少点些鼠标。h
ttp://www.ttlsa.com/docs/greasemonkey/同?http://www.ttlsa.com/docs
/greasemonkey/DOM 查看器一样,Javascript Shell 也不会“跟着”您浏览网页。如果打开 Javasc
ript Shell 然后在原始窗口中浏览别的网页,Javascript Shell 会变得非常困惑。好的做法是,去您想去的地方,
查看您想查看的页面,在做别的事情前先关闭 Javascript Shell。3.5.?其他调试工具下面是我觉得有用的其他调试工具,
由于时间有限,我没有全部列出。参考资料http://chrispederick.com/work/firefox/webdevel
oper/Web Developer 扩展?有很多分析页面的函数。http://www.karmatics.com/aardvar
k/Aardvark?互动的显示标签名称、id?和?class?的属性。http://www.hacksrus.com/~gind
a/venkman/Venkman Javascript Debugger?完整的 Javascript 运行时调试器。http:
//www.squarefree.com/bookmarklets/webdevel.htmlWeb Development Bo
okmarklets?有一些有用的函数,可以把它们拖放到工具栏中。http://www.edwardh.com/jsunit/JS
Unit?是 Javascript 单元测试框架。http://www.crockford.com/javascript/lint
.htmljs-lint?可检查出 Javascript 代码的常见错误。第?4?章?公共模式4.1.?在域名以及它所有子域名上执
行用户脚本对于许多网站,无论是否有?www.?前缀,访问网站都是等效的。如果要为这样的站点写用户脚本,需要能匹配这两种地址。例?4
.1.?匹配域名和它所有子域名的元数据标签// ==UserScript==// @include http://example.
com/// @include http://.example.com/// ==/UserScript==实例http:/
/diveintomark.org/projects/butler/butler.user.jsButlerhttp://www.
firefox.net.cn/dig/download/salonautopass.user.jsSalon Auto-Pass4
.2.?测试 Greasemonkey 函数是否有效Greasemonkey 的新版本给用户脚本提供了新函数。如果准备发布用户脚本
,那么应该测试下所用的 Greasemonkey 函数是否存在。例?4.2.?GM_xmlhttpRequest?函数无效时警告用
户if (!GM_xmlhttpRequest) {alert(''请升级到最新版本的 Greasemonkey.'');return
;}// 使用 GM_xmlhttpRequest 的其他代码4.3.?测试页面中是否有?HTML?元素可以用?getElemen
tsByTagName?函数来测试页面中是否有?HTML?元素。例?4.3.?检查页面中是否有?