Hacking with JavaScript――在浏览器之内,网页之外,运行JavaScript(二)

2014-11-24 03:00:26 · 作者: · 浏览: 4
栏,只选择标题格式类似"26. XXXX"的文章。 //第一部分,获取文章的地址。 var l=$('.link_title a'); //CSDN博客站点用了jQuery,所以在这里可以很方便地调用。 var urls=[]; for (i=0; i

运行……所有文章自动添加成功!

Greasemonkey

和互联网最初阶段的静态网页相比,动态网页的出现部分就是为了个性化,也就是对不同的用户呈现不同的内容。这种个性化不仅体现在功能上,还越来越多地体现在视觉外观上,各种博客、个人空间、社交网站都是典型。但所有这些个性化都有一个共同点,即都是网站的开发者预先设计的。如果网站的用户对操作和界面有不满,他们会抱怨,还可能会想要是怎样怎样就好了;如果这些用户本身也是设计者和开发者,他们就可能把自己的改进想法付诸实践。有人想到了这一点,更有人做出来,这就是Greasemonkey――一个Firefox的插件,能在网页打开时加载和执行用户创建的java script脚本(称为用户脚本)。上一节提到在控制台里对网页的修改是临时的、一次性的,Greasemonkey则将这类修改固定下来并可以分享给别人,从而带给网站用户创造的巨大可能性,“油猴”的诞生和不少优秀的用户脚本都是不折不扣的精彩hacking。Greasemonkey风靡一时,出现了专门的聚合网站userscripts.org供人上传、下载和讨论用户脚本,不少其它浏览器也开始支持用户脚本。

和普通的网页上的JavaScript代码相比,用户脚本有几个特点:

1. 在浏览器的DOMContentLoaded事件发生时运行。DOMContentLoaded在一个网页的DOM载入后触发,而传统的window.onload事件则要等到页面上所有资源,包括图片和脚本都载入完成才触发,因而可能被延迟到很晚。

2. 脚本在Greasemonkey提供的沙盒模型的运行,以保证安全性,如不会直接读取和篡改原页面脚本中的变量和函数,但在必要的情况下仍然可以越过这个限制。

3. 脚本开头支持很多指令,包括@require可以引用其他java script文件,例如CDN上的各种脚本库。

除了一般的java script和网页知识外,为Greasemonkey编写用户脚本需要学习的内容不多,在wiki.greasespot.net网站上都有介绍。userscripts.org上则有大量针对某个网站或者一般性的浏览的网友们的作品。像“热键翻页”(为大量列表网页提供左右键翻页的功能,http://userscripts.org/scripts/show/87895)、Clear Radio Button(清除选中的单选框,http://userscripts.org/scripts/show/6540)都是很方便的工具。

用户脚本虽然可以实现页面的自定义,但所有改动的基础仍然是原来的网页,因此脚本的开发很大程度上受到它的影响。如果原网页结构和代码混乱,编写用户脚本也会多费神;反之,一个清晰的网页则是良好的基础。此外原网页的修改往往会导致用户脚本失效,因此为了保持可用,用户脚本的作者必须跟上该网站的更新速度。对一些频繁修改的网站,这对相关脚本的作者意味着持续的投入。最后,网站的修改还可能使脚本的功能彻底失去可能,或者加入脚本的功能使其失去必要。例如,几年前我曾为了天涯论坛写了一个“天涯精灵”的脚本,功能包括高亮或单独显示某位用户的帖子和快速回帖等很多论坛都具备的特性,后来因为天涯的改版,这些功能或者失效,或者网站本身增添了。

注1:实际上这些特点都是紧密联系在一起的,单纯为了实用是产生不了最具创造性的成果的,普林斯顿高级研究所创始人之一的Abraham Flexner的名言“无用的知识的有用性”(THE USEFULNESS OF USELESS KNOWLEDGE)就是有趣的注脚。

注2:对服务器端运行的java script的探讨不在本文范围以内,如最初的Netscape公司的LiveWire和现在引人关注的Node.js。

注3:曾经的IE 6可以。在我最新做的测试中,IE 11仍然可以,而Firefox 26则无法访问当前页面的环境变量,但这仅限于在地址栏里直接输入脚本,如果采用下面所说的“书签小程序”,仍然可以访问。

注4:人们最初想到这种hacking时,在IE 6里保存这样一个bookmarklet,还会被提示“java script没有已注册的协议……”。

注5:我检查过几页为102,101,102,102,99,100,99。