1

でさまざまなことを追跡する Greasemonkey スクリプトがありますunicreatures.com

カウントしたかったことの 1 つは、ページ上の一部のリンクのクリック数でしたが、すべてのリンクではありませんでした。

これらは数える必要がある、 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 );
}
}

明らかに、 のさまざまな値に対して 10 億の 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 );
}
}  

何らかの理由で、2 番目の条件が false の場合でもカウントされます。これはどこかで構文が間違っている単純なケースですか、それとも 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 に答える