26

这是一个有点奇怪的具体问题。

我正在编写一个将跨十个域运行的 Greasemonkey 脚本。这些网站都有相同的结构,但每个网站的域名不同。例如,脚本将在以下位置运行:

http://first-domain.com/
http://another-one.com/
http://you-get-the-point.com/

我还需要它在相同域的其他页面上运行,因此这些域之一的列表将类似于:

http://first-domain.com/admin/edit/*
http://first-domain.com/blog/*
http://first-domain.com/user/*/history

显然,如果我为所有 10 个域包括这三个路径,那么我需要将 30 个 URL 列为@includes。

所以我想知道是否有办法做类似的事情:

// Obviously fake code:

var list_of_sites = ["first-domain", "another-one", "you-get-the-point"];

@include http:// + list_of_sites[any] + .com/admin/edit/*
@include http:// + list_of_sites[any] + .com/blog/*
@include http:// + list_of_sites[any] + .com/user/*/history

如果这样的事情可能,它会将@includes 的列表从 30 减少到 3。

这是可能的,还是我在做梦?

PS我知道我可以@include http://first-domain.com/*然后使用if语句在该域内的某些路径上运行脚本的某些部分,但是脚本打算在其上运行的页面数量仅为站点的 2% 左右,因此看起来很浪费将脚本包含在每个网站的每个页面上。

4

1 回答 1

33

参考:

适用于 Greasemonkey(即 Firefox)的解决方案在 Chrome 和 Tampermonkey 上可能有所不同。

三种基本方法:

  1. 使用 30 行不同的@include:虽然这在剪切和粘贴编码方面可能令人不快,但它是一种在浏览器中工作相同的方法,也是具有最佳浏览器性能的一种方法。其他方法要求浏览器对可能访问的每个页面或 iframe 进行(更多)检查。

  2. 使用正则表达式@include

    @include /^http:\/\/(1stDomain\.com|2ndDomain\.com|3rdDomain\.net|etc.)\/(admin\/edit|blog|user\/.+?\/history)/
    

这是一条线,性能相当不错,但这条线可能会变得笨拙,而且这只适用于 Greasemonkey 和 Tampermonkey(可能还有 Scriptish)。

  1. 使用@match,@include@exclude的各种组合:我只提到这是一种可能性。这是直接 Chrome 上性能最好的方法,但对于这种事情不是很跨浏览器。对于 Greasemonkey 或 Tampermonkey 使用方法 1 或方法 2。

我建议您尽可能避免使用前导通配符。它们使浏览器的速度减慢最多。EG,不要使用类似的东西@include /^.+ .../,或者@include http:/*/*如果你可以避免它。

于 2013-06-21T06:31:43.443 回答