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

202

Вот мой код 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).

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

sv_in
источник
Оно делает; в соответствии с документами ( mootools.net/docs/core/Native/Event#Event:preventDefault ), что он должен работать: «Метод события: protectDefault - кросс-браузерный метод, чтобы предотвратить действие по умолчанию для события».
Паоло Бергантино,
Мой плохой, я удалил свой комментарий, который был "разве у mootools нет способа остановить события?". Так что есть проблема с mootools на ie8 ...
Alsciende
2
Не могу воспроизвести эту проблему. Эта скрипка «работает на меня, т.е. на 8». Не могли бы вы настроить уменьшенную скрипку, чтобы показать ошибку? jsfiddle.net
Eerne

Ответы:

472

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

event.returnValue = false;

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

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

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

Вы можете объединить два с:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Alsciende
источник
48
Следующий код работал для меня: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in
229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
Морти
31
Стоит отметить, что «событие» должно быть глобальным объектом события в IE8. Вы не можете использовать событие, переданное в обработчик события, например e.preventDefault, это должно быть event.preventDefault, чтобы это работало в IE8.
jmort253
event.preventDefault();перестал работать на меня в FireFox по какой-то причине, на ровном месте. Использовал код Морити, и он отлично работал. Спасибо ~
Джеймс
8
Просто чтобы внести некоторую ясность в комментарий @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Лука
23

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

Попробуйте эту скрипку, чтобы увидеть разницу в привязке событий. 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 событие, в котором отсутствует функция protectDefault (), просто используйте этот код для его получения.

e = $.event.fix(e);

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

oldwizard
источник
2
К сожалению, этот трюк не работает для меня. Я использую IE 10 и перед вызовом e.preventDefault (); Я могу позвонить $ .event.fix (e); безуспешно :(
Beatles1692
Возможно, он был удален из JQuery 2? Но IE10 не нуждается в исправлении.
oldwizard
Вы снова присвоили фиксированное событие переменной e?
oldwizard
11

Я знаю, что это довольно старый пост, но я потратил некоторое время, пытаясь заставить это работать в 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 скоро ужасно умрет мучительной смертью.

ОБНОВИТЬ:

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

muffir
источник
1
Вы также можете получить исходный объект события браузера из event.originalEvent. Больше информации: stackoverflow.com/a/16675056/22550
sv_in
6

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

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

Док говорит

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

но если это не так, вы можете попробовать

new Event(event).preventDefault();
Alsciende
источник
1
Возникла некоторая проблема при переносе в IE. О Боже! Почему IE?
sv_in
Однако она не хочет останавливать событие, просто предотвращает его действие по умолчанию.
Alsciende
5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

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

RolandoCC
источник
2
Не работает в IE 11 (e.preventDefault - функция, хотя, похоже, ничего не делает)
GreySage
4

Чтобы отключить клавиатуру после 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

JBE
источник
Вы единственный ответчик, который ударил ногтем по голове. Единственная причина, по которой кто-то здесь говорит о раннем IE, заключается в том, что им нужна межплатформенная функциональность. "e.keyCode = 0;" убьет любое действие по умолчанию в раннем IE.
www-0av-Com
3

Вот функция, которую я тестировал с 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;
})
Элиран Малка
источник
1
Я никогда не видел этот stopметод раньше, и я не мог найти его в MSDN. Что оно делает?
Oriol
1
.stop()выдает исключение, потому что его не существует. Любое исключение будет иметь желаемый эффект.
Джей Базузи
и с чего бы вы хотели выбросить исключение? Я имею в виду, если вы хотите e.preventDefault()вызвать исключение, вы можете просто позвонить, потому что оно все равно вызовет исключение ...
Матиас Бургер
2

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

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

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

EliuX
источник
0

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

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}
daemon1981
источник
0

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

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

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

Кирби Л. Уоллес
источник
0

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

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Pablo
источник