例 5.4.
offsiteblank.user.js
// ==UserScript==
// @name Offsite Blank
// @namespace http://diveintogreasemonkey.org/download/
// @description force offsite links to open in a new window
// @include http://*
// @include https://*
// ==/UserScript==
var a, thisdomain, links;
thisdomain = window.location.host;
links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
a = links[i];
if (a.host && a.host != thisdomain) {
a.target = "_blank";
}
}首先,我声明这个用户脚本将在所有的网页上执行(但是不是全部,例如,本地机器上储存的 HTML 文档,可以从文件 (F) → 打开 (Open 菜单中打开)。
// @include http://* // @include https://*
这段代码分为四步实现:
- 获得当前页面的域名。
- 获得页面中所有链接的列表。
- 比较每个链接的域名与当前页面的域名。
- 如果域名不匹配,设置这个链接的目的地(target),这样就会在新窗口中打开。
获取当前页面的域名很容易。更多的信息请阅读获取当前域名。
thisdomain = window.location.host;
获取页面中所有链接也一样容易,尽管我应该注意到我忽视了自己的建议简单地使用 document.getElementsByTagName('a') 而不用 XPath 查询。其实也没什么不同……
links = document.getElementsByTagName('a');接下来,我遍历了所有的链接(实际上是所有的 <a> 元素,它们中的一些可能是链接)然后检查链接的域名和当前页面的域名是否匹配。由于一些链接可能指向非 HTTP 的 URL(例如,本地文件或者 FTP 服务器),我需要检查 a.host 是否存在,然后再检查它与当前域名是否相等.。
for (var i = 0; i < links.length; i++) {
a = links[i];
if (a.host && a.host != thisdomain) {
...
}如果我找到一个包含域名的链接,但是它的域名与当前域名不相同,我只需设置它的 target 属性为 "_blank" 就可以强制链接在新窗口打开了。
a.target = "_blank";