Скрипт Greasemonkey выдает ошибку при неверном вводе

У меня есть скрипт Greasemonkey с такой логикой:

  1. Если зарегистрированный пользователь не входит в привилегированную группу (JOHN, LUKE, JEFF, MAX, ANDY), отключите <input> с name="prio",

  2. Если не привилегированный пользователь, заблокируйте выбор значений из <input name="dest">,
    В частности, блок "12" или "22" и написать сообщение об ошибке.


Скрипт работает нормально, но есть ошибка:

Когда я вставляю текст в другое поле ввода или меняю поле выбора и нажимаю Enter, отправка останавливается, и я получаю сообщение об ошибке в консоли:

Ошибка: destInput[0] не имеет свойств. Исходный файл: file:///E:/FirefoxPortable2.x/Data/profile/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%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

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 ();
Другие вопросы по тегам