Функция event.preventDefault() не работает в IE

Ниже приведен мой код JavaScript (mootools):

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

Во всех браузерах, кроме IE, это работает отлично. Но в IE это вызывает ошибку. У меня IE8, поэтому, используя его отладчик JavaScript, я обнаружил, что объект event не имеет метода preventDefault, который вызывает ошибку, и поэтому форма отправляется. Метод поддерживается в случае Firefox (который я обнаружил с помощью Firebug).

Любая помощь?

Ответ 1

в IE вы можете использовать

event.returnValue = false;

для достижения того же результата.

И чтобы не получить ошибку, вы можете проверить наличие preventDefault:

if(event.preventDefault) event.preventDefault();

Вы можете комбинировать два с помощью:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

Ответ 2

Если вы связываете событие с помощью функции addEvent mootools, ваш обработчик событий получит фиксированное (дополненное) событие, переданное в качестве параметра. Он всегда будет содержать метод preventDefault().

Попробуйте эту скрипту, чтобы увидеть разницу в привязке событий. http://jsfiddle.net/pFqrY/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

Для всех пользователей jQuery вы можете исправить событие, когда это необходимо. Скажем, что вы использовали HTML onclick = ".." и получили специальное событие IE, которое не имеет preventDefault(), просто используйте этот код, чтобы получить его.

e = $.event.fix(e);

После этого e.preventDefault(); отлично работает.

Ответ 3

Я знаю, что это довольно старый пост, но я просто потратил некоторое время на то, чтобы сделать эту работу в IE8.

Похоже, что есть некоторые отличия в версиях IE8, потому что решения, размещенные здесь и в других потоках, не работали для меня.

Скажем, что у нас есть этот код:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

В моем методе IE8 preventDefault() существует из-за jQuery, но не работает (возможно, из-за точки ниже), поэтому это не удастся.

Даже если я устанавливаю свойство returnValue непосредственно на false:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

Это также не сработает, потому что я просто установил какое-то свойство специального объекта события jQuery.

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

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

Просто, чтобы облегчить для кого-то, кто попытается убедить IE8 работать. Я надеюсь, что IE8 скоро умрет от мучительной смерти.

UPDATE:

Как sv_in, вы можете использовать event.originalEvent для получения исходного объекта события и установить свойство returnValue в исходном. Но я еще не тестировал его в своем IE8.

Ответ 4

Mootools переопределяет preventDefault в объектах Event. Таким образом, ваш код должен работать нормально в каждом браузере. Если это не так, то проблема с поддержкой ie8 в mootools.

Вы проверили свой код на ie6 и/или ie7?

Док говорит

Каждое событие, добавленное с помощью addEvent, автоматически получает метод mootools без необходимости вручную его экземпляра.

но в противном случае вы можете попробовать

new Event(event).preventDefault();

Ответ 5

if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Протестировано в IE 9 и Chrome.

Ответ 6

Чтобы отключить клавиатуру после IE9, используйте: e.preventDefault();

Чтобы отключить обычную клавишу клавиатуры в IE7/8, используйте: e.returnValue = false; или return false;

Если вы попытаетесь отключить сочетание клавиш (с помощью Ctrl, например Ctrl+F), вам нужно добавить эти строки:

try {
    e.keyCode = 0;
}catch (e) {}

Вот полный пример только для IE7/8:

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

Ссылка: Как отключить быстрые клавиши в IE7/IE8

Ответ 7

Здесь функция, которую я тестировал с помощью jquery 1.3.2 и 09-18-2009 ночной сборки. Дайте мне знать ваши результаты. В этом случае все выполняется отлично в Safari, FF, Opera на OSX. Он предназначен исключительно для исправления проблемной ошибки IE8 и может иметь непреднамеренные результаты:

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

Использование:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})

Ответ 8

preventDefault - широко распространенный стандарт; использование adhoc каждый раз, когда вы хотите быть совместимым со старыми версиями IE, громоздко, лучше использовать polyfill:

if (typeof Event.prototype.preventDefault === 'undefined') {
    Event.prototype.preventDefault = function (e, callback) {
        this.returnValue = false;
    };
}

Это изменит прототип события и добавит эту функцию, отличную особенность javascript/DOM в целом. Теперь вы можете использовать e.preventDefault без проблем.

Ответ 9

return false в вашем слушателе должен работать во всех браузерах.

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}

Ответ 10

FWIW, в случае, если кто-либо повторит этот вопрос позже, вы также можете проверить, что вы передаете функции onKeyPress-обработчика.

Я столкнулся с этой ошибкой, когда я ошибочно передал onKeyPress (это) вместо onKeyPress (событие).

Просто что-то еще, чтобы проверить.

Ответ 11

Мне помог метод с проверкой функции. Этот метод работает в IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}