Greasemonkey脚本在错误的输入上给出错误

时间:2012-10-18 16:27:54

标签: javascript greasemonkey firefox2

我有一个Greasemonkey脚本,其逻辑如下:

  1. 除非已登录的用户位于特权组(JOHN,LUKE,JEFF,MAX,ANDY),否则请<input> name="prio"停用。

  2. 如果不是特权用户,请阻止从<input name="dest">中选择值 具体来说,阻止“12”或“22”并写入错误消息。


  3. 该脚本工作正常,但有一个错误:

    当我在其他输入字段中插入文本或更改选择字段并按 Enter 时,提交停止并在控制台中收到错误消息:

      

    错误:destInput [0]没有属性源文件:   文件:/// 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”输入的规则。

    以下是my script code

    // ==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;
    }
    

    Here is an old working version on jsFiddle for a better understanding

    PS:pastebin代码(unsafeWindow ..)是我旧系统上唯一的工作版本。系统运行FF 2.0.0.11和Greasemonkey 0.8并且无法更新。

    有没有办法删除错误? :d

1 个答案:

答案 0 :(得分:1)

将表单[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 ();