5.4. 案例:Offsite Blank

强制外站链接在新窗口中打开

因为有人在 Greasemonkey 脚本库发帖求助,我就写了 Offsite Blank。我个人喜欢在新标签页中打开链接,但是有的人更喜欢为每个站点各开一个窗口。Offsite Blank 可以帮您自动完成,强制外站链接在新窗口中打开。

例 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://*

这段代码分为四步实现:

  1. 获得当前页面的域名。
  2. 获得页面中所有链接的列表。
  3. 比较每个链接的域名与当前页面的域名。
  4. 如果域名不匹配,设置这个链接的目的地(target),这样就会在新窗口中打开。

获取当前页面的域名很容易。更多的信息请阅读获取当前域名

thisdomain = window.location.host;

获取页面中所有链接也一样容易,尽管我应该注意到我忽视了自己的建议简单地使用 document.getElementsByTagName('a') 而不用 XPath 查询。其实也没什么不同……

links = document.getElementsByTagName('a');

接下来,我遍历了所有的链接(实际上是所有的 <a> 元素,它们中的一些可能是链接)然后检查链接的域名和当前页面的域名是否匹配。由于一些链接可能指向非 HTTPURL(例如,本地文件或者 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";
← 案例:Ain't It Readable
案例:Dumb Quotes →