1

我有一个 Greasemonkey 脚本,可以跟踪unicreatures.com.

我想计算的一件事是点击页面上的某些链接,但不是所有链接。

这些需要计算, http://unicreatures.com/explore.php?area=sea&id=89&key=bf12 这些不应该计算, http://unicreatures.com/explore.php?area=sea&gather=5&enc=394844&r=

有人帮我找出了一个可以满足我要求的正则表达式,但我必须将每个不同的探索位置 ( area=**) 编码到其中,所以我认为这行不通。

正则表达式版本

var links = document.getElementsByTagName( 'a' );

for ( var i = 0; i < links.length; i++ ) {
var link = links[i];
if ( /area=sea(?!\&gather)/.test( link.href )) {
    link.addEventListener( 'click', function () {
localStorage.steps=Number(localStorage.steps)+1
       // alert(localStorage.steps + ' in Sargasso' );
    }, true );
}
}

显然,我不想要十亿个 if 语句用于 的不同值area=,而且我找不到将变量添加到正则表达式的方法。

所以我终于找到了一些字符串操作命令并将其放在一起:

var url = window.location.href;
var startOf=url.indexOf("=")+1;
var endOf=url.indexOf("&");
var loc =url.substring(startOf,endOf);

var links = document.getElementsByTagName( 'a' );

for ( var i = 0; i < links.length; i++ ) {
var link = links[i];
if (url.indexOf("area=")>=0 && url.indexOf("gather=")<0) {
    link.addEventListener( 'click', function () {
localStorage.steps=Number(localStorage.steps)+1
localStorage[loc+"Steps"]=Number(localStorage[loc+"Steps"])+1
        alert(localStorage[loc+"Steps"] +" in local"+loc);
    }, true );
}
}  

出于某种原因,即使第二个条件为假,它也很重要。这是我在某处出现语法错误的简单案例,还是Greasemonkey错误?我在控制台中没有任何错误。

4

2 回答 2

1

尝试调整您的正则表达式版本,而不是这样:

if ( /area=sea(?!\&gather)/.test( link.href )) {

使用这个正则表达式:

if ( /area=(\w*)&id=/.test( link.href )) {

这将匹配所有具有“area”参数后跟“id”参数的链接,这似乎足以匹配您想要的链接。

于 2012-09-12T07:53:25.000 回答
1

预过滤链接并测试link.href,而不是url之前代码设置的页面地址。

var linksWithArea   = document.querySelectorAll ("a[href*='area=']");

for (var J = linksWithArea.length - 1;  J >= 0;  --J) {
    var link        = linksWithArea[J];
    if ( ! /gather=/i.test (link.href) ) {
        link.addEventListener ('click', function () {
            localStorage.steps          = Number(localStorage.steps) + 1;
            localStorage[loc+"Steps"]   = Number(localStorage[loc+"Steps"]) + 1;
            alert(localStorage[loc+"Steps"] +" in local"+loc);
        }, true );
    }
}
于 2012-09-12T08:07:02.203 回答