1

Web サイト (フラッシュ ブラウザ ゲーム) のタイトルからすべてを削除するユーザー スクリプトをコーディングしようとしていますが、アクションを開始するときに表示されるカウントダウンです。

私はJavascriptが初めてで、助けが必要です。

アップデート

正規表現の問題は解決されましたが、このスクリプトでタイトルを「監視」するための助けが必要なので、ゲームによって変更されるたびにスクリプトが再度実行されます。

主なタイトルは次のようになります。

Shakes & Fidget - The Game (強化強化)

アクションが開始されるとすぐにカウントダウンが最初に追加され、タイトルが

02:26 - Shakes & Fidget - The Game (強化強化)

タイトルにカウントダウンのみを表示したい。

私はネットを検索し、これを行うさまざまな方法を見つけましたが、どれもうまくいきません。

これが私が現在持っているものです:

// ==UserScript==
// @name       Shakes & Fidget Buffed title shortener
// @namespace  http://släcker.de
// @version    0.1
// @description  Removes the page title of Shakes & Fidget to only display left time if it exists
// @include        *.sfgame.*
// @exclude        www.sfgame.*
// @exclude        sfgame.*
// @copyright  2013+, slaecker
// ==/UserScript==

var regex = [^0-9:]

function cleanTitle() { 
    var oldTitle = document.title; 
    var oldTitleRX = oldTitle.match(regex);
    document.title = oldTitle.replace(oldTitleRX,""); 
    return oldTitle; 
} 


cleanTitle()

Javascript コンソールに正規表現に関するエラーが表示されます。文字をエスケープしようとしましたが、エラーは同じです:

env: ERROR: Syntax error @ 'Shakes & Fidget Buffed title shortener'!
Unexpected token ^
SyntaxError: Unexpected token ^
    at Window.Function (<anonymous>)
    at L (eval at <anonymous> (eval at <anonymous> (chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/content.js:51:21)), <anonymous>:156:21)
    at n (eval at <anonymous> (eval at <anonymous> (chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/content.js:51:21)), <anonymous>:384:2)
    at R (eval at <anonymous> (eval at <anonymous> (chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/content.js:51:21)), <anonymous>:388:86)
    at Q (eval at <anonymous> (eval at <anonymous> (chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/content.js:51:21)), <anonymous>:194:40)
Uncaught SyntaxError: Unexpected token ^
L
n
R
Q

含まれる文字列「(buffed buffed)」が変更されるため、正規表現一致である必要があります (サーバー名が表示されます)。

もう1つの問題は、新しいアクションが開始または終了するたびに変更されるため、スクリプトがタイトルを「監視」する必要があることですが、スクリプトは1回しか実行されません(正規表現なしでテストしました)。

よろしくお願いいたします。

スラッカー

4

3 に答える 3

2

正規表現には、次を使用します。

document.title = document.title.replace (/[^0-9:]/g, "");

タイトルの変更を検出するには、MutationObserversを使用します。これは、Google ChromeとFirefox(2つの主要なブラウザ)の両方に実装されている新しいHTML5機能です。

この完全なスクリプトは機能します:

// ==UserScript==
// @name        Shakes & Fidget Buffed title shortener
// @namespace   http://släcker.de
// @version     0.1
// @description  Removes the page title of Shakes & Fidget to only display left time if it exists
// @include     *.sfgame.*
// @exclude     www.sfgame.*
// @exclude     sfgame.*
// @copyright   2013+, slaecker, Stack Overflow
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var myObserver       = new MutationObserver (titleChangeDetector);
var obsConfig        = {
    //-- Subtree needed.
    childList: true, characterData: true, subtree: true
};

myObserver.observe (document, obsConfig);

function titleChangeHandler () {
    this.weInitiatedChange      = this.weInitiatedChange || false;
    if (this.weInitiatedChange) {
        this.weInitiatedChange  = false;
        //-- No further action needed
    }
    else {
        this.weInitiatedChange  = true;
        document.title = document.title.replace (/[^0-9:]/g, "");
    }
}

function titleChangeDetector (mutationRecords) {

    mutationRecords.forEach ( function (mutation) {
        //-- Sensible, Firefox
        if (    mutation.type                       == "childList"
            &&  mutation.target.nodeName            == "TITLE"
        ) {
            titleChangeHandler ();
        }
        //-- WTF, Chrome
        else if (mutation.type                      == "characterData"
            &&  mutation.target.parentNode.nodeName == "TITLE"
        ) {
            titleChangeHandler ();
        }
    } );
}

//-- Probably best to wait for first title change, but uncomment the next line if desired.
//titleChangeHandler ();

他のブラウザを使用している場合(質問にその旨を記載)、を使用するようにフォールバックしsetInterval()ます。

于 2013-01-15T01:25:20.823 に答える
2

正規表現リテラルにはいくつかの問題があります。/-es にラップする必要があります。1 つの文字にしか一致しない乗数がありません。数値の両側の文字列部分を一致させるには、「g」修飾子を使用してグローバルにする必要があります。

var regex = /[^0-9:]+/g;

function cleanTitle() { 
    document.title = document.title.replace(regex, ""); 
}
于 2013-01-14T15:41:05.903 に答える
1

タイマー/カウンターには明確な形式があるようです。形式が であると仮定すると、次の##:##ように正規表現を作成できます。

var regex = /\d\d:\d\d/g;

これにより、特定のタイマー パターンが取得されます (タイトルの先頭にある数字やコロンではなく)。

正規表現ステートメントをスラッシュで囲むことを忘れないでください。gスラッシュの後に (上記のように) を使用すると、タイトル内のタイマーの他のインスタンスが見つかります。1つしか持っていないことがわかっている場合はg、端を外すのが最善かもしれません.

于 2013-01-14T15:55:37.587 に答える