Кросс-браузерный способ определить, было ли отменено событие DOM - PullRequest
0 голосов
/ 05 февраля 2009

Существует ли кросс-браузерный способ из обработчика событий javascript, чтобы определить, было ли событие отменено предыдущим обработчиком? IE и другие браузеры, такие как Chrome и т. Д., Имеют свойство event.returnValue, которое можно проверить, но FireFox, по-видимому, не имеет такого свойства.

Вот пример сценария, о котором я говорю. У вас есть такая форма:

<form id="test" name="test" onsubmit="return false;" />

И вы подключаете к нему событие в javascript с помощью addEventListener / attachEvent (подключение для краткости опущено). Событие должно знать, возвращало ли что-либо ранее в цепочке значение false или иным образом отменяло его. Версия IE выглядит так:

function onSubmitHandler(e) {
    alert("event was cancelled prior to this handler: " + e.returnValue);
}

Это работает в IE, Chrome и т. Д., Но, конечно, не в FireFox, так как не имеет event.returnValue. Я прочесал intarwebs для любого другого способа определить это в FireFox и ничего не придумал. Есть ли решение этой проблемы, которое не предполагает непосредственного задания атрибута onsubmit формы?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2009

Вот способ обойти это. Я надеялся на метод, соответствующий чистым стандартам, но, похоже, его нет.

function onSubmitHandler()
{
    // only called if the other onsubmit handlers succeed
}

// hook in submit
var originalOnSubmit = form.onsubmit;

form.onsubmit = function(e)
{
    var ret;

    if (originalOnSubmit)
        ret = originalOnSubmit();

    if (ret != false)
    {
        return onSubmitHandler(e);
    }
};
0 голосов
/ 06 февраля 2009

Насколько я понимаю, основное использование event.returnValue - это предотвращение действия по умолчанию для этого события (то есть его отмена). Например, в таком обработчике, как ваш выше:

function onSubmitHandler(e) {
    e.returnValue = false;
}

Приведенный выше код в IE будет препятствовать действию по умолчанию, предотвращая отправку формы. Эквивалентный код в Firefox в соответствии с Gecko DOM Reference :

e.preventDefault();

Если вы хотите проверить, было ли отменено событие, и сделать это кросс-браузерным способом, будет ли вариант использования библиотеки, такой как jQuery , как вариант? Использование jQuery для привязки функции к событию onsubmit формы и вызова этого обработчика .preventDefault () позволит выполнить то же самое во всех поддерживаемых браузерах. Кроме того, вы можете затем использовать метод .isDefaultPrevented () объекта события jQuery, чтобы определить, было ли событие отменено, предположительно выполняя то, что вы пытаетесь, с помощью lhs = e.returnValue.

...