使用if语句混淆错误

时间:2012-09-12 07:29:41

标签: javascript regex if-statement greasemonkey

我有一个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 );
}
}

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

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

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错误?我在控制台中没有出现任何错误。

2 个答案:

答案 0 :(得分:1)

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

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

使用此正则表达式:

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

将匹配所有包含'area'参数后跟'id'参数的链接,该参数似乎足以匹配您想要的链接。

答案 1 :(得分: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 );
    }
}