这是一个奇怪的具体问题。
我正在编写一个将在十个域中运行的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
显然,如果我为所有十个域包含这三个路径,那么我需要列出30个URL作为@include
。
所以我想知道是否有办法做某事:
// 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
如果这样的事情成为可能,它会将@include
的列表从30减少到3。
这是可能的,还是我在做梦?
PS 我知道我可以@include http://first-domain.com/*
然后使用if
语句在该域内的某些路径上运行脚本的某些部分,但是该脚本只能在网站的2%左右运行,因此将脚本包含在每个网站的每个页面上似乎都是浪费。
答案 0 :(得分:21)
参考:
适用于Greasemonkey(Firefox)的解决方案在Chrome和Tampermonkey上可能有所不同。
三种基本方法:
使用30条不同的@include
行:虽然这在剪切和粘贴编码方面可能不合适,但它是一种在浏览器中运行相同的方法以及具有最佳浏览器性能的那个。其他方法要求浏览器对可能的每个页面或iframe进行(更多)检查。
使用正则表达式@include
:
@include /^http:\/\/(1stDomain\.com|2ndDomain\.com|3rdDomain\.net|etc.)\/(admin\/edit|blog|user\/.+?\/history)/
这是一行,并且表现相当不错,但该行可能变得笨拙,而仅适用于Greasemonkey和Tampermonkey (可能还有Scriptish)。
使用@match
,@include
和@exclude
的各种组合:我只提到这种可能性。它是直接Chrome上性能最佳的方法,但对于这类东西而言并不是非常跨浏览器。对于Greasemonkey或Tampermonkey,请使用方法1或方法2.
我建议您尽可能避免使用通配符。它们使浏览器速度降低最多。 EG,如果可以避免,请不要使用@include /^.+ .../
或@include http:/*/*
之类的内容。