0

次のようなロジックを持つ Greasemonkey スクリプトがあります。

  1. ログインしているユーザーが特権グループ (JOHN、LUKE、JEFF、MAX、ANDY) に属していない限り、 with を無効に<input>name="prio"ます。

  2. 特権ユーザーでない場合は、から値を選択してブロックします<input name="dest">
    具体的には「12」か「22」をブロックしてエラーメッセージを書きます。


スクリプトは問題なく動作しますが、バグがあります:

他の入力フィールドにテキストを挿入するか、選択フィールドを変更して を押すEnterと、送信が停止し、コンソールにエラー メッセージが表示されます。

エラー: destInput[0] にプロパティがありません ソース ファイル: file:///E:/​​FirefoxPortable2.x/Data/profile/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee​​082ba24781%7D/components/greasemonkey.js 行: 379

var err = this.findError(script, line - lineFinder.lineNumber - 1);

name="dest"のルールはすべての入力フィールドと選択フィールドで機能していると思いますか? しかし、「dest」入力のみのルールが必要です。

ここに私のスクリプトコードがあります:

// ==UserScript==
// @name           _SO Block submit on custom FF2 page.
// @namespace      PC
// @include        file:///D:/temp/foo%20SO/task*
// @include        file:///D:/temp/foo%20SO/fixture*
// @include        file:///D:/temp/foo%20SO/pallet*
// ==/UserScript==

GM_log ("Script start.");

unsafeWindow._oldSubmit  = unsafeWindow.document.forms[0].submit;
unsafeWindow.document.forms[0].submit = function () {
    GM_log ("Submit function fired.");

    var destInput   = document.getElementsByName ("dest");
    if ( ! destInput  ||  destInput.length == 0) {
        //unsafeWindow._oldSubmit ();
    }

    var destValue   = destInput[0].value;
    if (    /^\s*$/.test (destValue)
            ||  excludedDestinations.indexOf (destValue) > -1
    ) {
        GM_log ("Submit should be blocked! (1)");
    }
    else {
        //unsafeWindow._oldSubmit ();
    }
};


//--- Make sure this list of names is all uppercase.
var usersWhoCanSetPriority  = ['JOHN', 'LUKE', 'JEFF', 'MAX', 'ANDY'];
var excludedDestinations    = ['12', '22'];

var bDisablePrio    = true;
var tdNodes         = document.getElementsByTagName ("TD");
for (var J = tdNodes.length - 1;  J >= 0;  --J) {
    var tdNode      = tdNodes[J];
    if (tdNode.className == "user") {
        var userName        = tdNode.textContent.replace (
            /^(?:.|\n|\r)+\(User:\s+([^)]+)\)(?:.|\n|\r)+$/i, "$1"
        ).toUpperCase ();
        if (usersWhoCanSetPriority.indexOf (userName) > -1) {
            bDisablePrio = false;
        }
    }
}

if (bDisablePrio) {
    var oldInput    = document.getElementsByName ("prio");
    if (oldInput  &&  oldInput.length) {
        oldInput[0].setAttribute ("disabled", "disabled");
    }

    var destInput   = document.getElementsByName ("dest");
    if (destInput  &&  destInput.length) {
        destInput[0].addEventListener (
            "change",
            function (zEvent) {
                bCheckdestinationValue (destInput[0]);
                GM_log ("Change handler fired.");
            },
            false
        );

        destInput[0].form.addEventListener (
            "submit",
            function (zEvent) {
                GM_log ("Submit handler fired.");
                var destValue   = destInput[0].value;
                if (    /^\s*$/.test (destValue)
                        ||  excludedDestinations.indexOf (destValue) > -1
                ) {
                    //--- Stop the submit
                    zEvent.preventDefault ();
                    //zEvent.stopPropagation ();
                    GM_log ("Submit should be blocked! (2)");
                    return false;
                }
            },
            true
        );
    }
}

function bCheckdestinationValue (destInputNd) {
    //--- Returns true if value is bad.
    if (excludedDestinations.indexOf (destInputNd.value) > -1) {
        destInputNd.value = ''; // Blank input

        //--- Add or show Error message.
        var destErrNode = document.getElementById ("gmDestErrorDisp");
        if (destErrNode) {
            destErrNode.style.display = "inline";
        }
        else {
            destErrNode             = document.createElement ('b');
            destErrNode.id          = "gmDestErrorDisp";
            destErrNode.style.color = "red";
            destErrNode.textContent = "12 and 22 are forbidden";
            destInputNd.parentNode.appendChild (destErrNode);
        }
        return true;
    }
    else {
        var destErrNode = document.getElementById ("gmDestErrorDisp");
        if (destErrNode) {
            destErrNode.style.display = "none";
        }
    }
    return false;
}

これは、理解を深めるための jsFiddle の古い作業バージョンです。

PS: ペーストビン コード (unsafeWindow ..) は、私の古いシステムで動作する唯一のバージョンです。システムは FF 2.0.0.11 と Greasemonkey 0.8 を実行しており、更新できません。

バグを取り除く方法はありますか?:D

4

1 に答える 1

1

forms[0].submit コードを次のように変更します。

if (unsafeWindow.document.forms[0]) {
    unsafeWindow._oldSubmit  = unsafeWindow.document.forms[0].submit;
    unsafeWindow.document.forms[0].submit = function () {
        GM_log ("Submit function fired.");

        var destInput   = document.getElementsByName ("dest");
        if ( ! destInput  ||  destInput.length == 0) {
            unsafeWindow._oldSubmit ();
        }
        else {
            var destValue   = destInput[0].value;
            if (    /^\s*$/.test (destValue)
                    ||  excludedDestinations.indexOf (destValue) > -1
            ) {
                GM_log ("Submit should be blocked! (1)");
            }
            else {
                unsafeWindow._oldSubmit ();
            }
        }
    };
}

それらを使用する前に、それらが存在することを確認する適切な仕事をします。

また、次の行のコメントを外します。

//zEvent.stopPropagation ();
于 2012-10-19T01:48:44.460 に答える