Функція 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).

Будь-яка допомога?


Це робить; згідно з документами ( mootools.net/docs/core/Native/Event#Event:preventDefault ) те, що він має працювати: "Метод події: prevenDefault - метод перехресного браузера для запобігання дії події за замовчуванням."
Паоло Бергантіно

Мій поганий, я видалив свій коментар, який був "не має у mootools методу зупинити події?" Тож є проблема з мутулами на ie8 ...
Alsciende

2
Неможливо відтворити цю проблему. Ця скрипка "працює для мене, тобто 8". Чи можете ви встановити скорочену скрипку, щоб показати помилку? jsfiddle.net
eerne

Відповіді:


472

в IE ви можете використовувати

event.returnValue = false;

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

А щоб не отримати помилку, ви можете протестувати на наявність prevenDefault:

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

Ви можете комбінувати два з:

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

48
Наступний код працював для мене: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = помилково; }
sv_in

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

31
Варто зазначити, що "подія" повинна бути об'єктом глобальної події в IE8. Ви не можете використовувати подію, передану в обробник подій, наприклад e.preventDefault, вона повинна бути event.preventDefault, щоб це працювало в IE8.
jmort253

event.preventDefault();чомусь перестали працювати у FireFox чомусь із синіх тонів. Використовували код mority, і він чудово працював. Спасибі ~
Джеймс

8
Просто для додання ясності коментарю @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Люк

23

Якщо пов'язувати подію за допомогою функції addEvent mootools, обробник подій отримає фіксовану (розширену) подію, передану як параметр. Він завжди буде містити метод prevenDefault ().

Спробуйте цю загадку, щоб побачити різницю в прив'язці подій. 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 подію, якій не вистачає prevenDefault (), просто використовуйте цей код, щоб отримати його.

e = $.event.fix(e);

Після цього e.preventDefault (); працює чудово.


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.


1
Ви також можете отримати оригінальний об'єкт події браузера від event.originalEvent. Додаткова інформація: stackoverflow.com/a/16675056/22550
sv_in

6

Mootools переосмислює запобігання за замовчуванням в об'єктах події. Тож ваш код повинен справно працювати у кожному браузері. Якщо це не так, то існує проблема із підтримкою ie8 у mootools.

Ви протестували свій код на ie6 та / або ie7?

Доктор каже

Кожна подія, додана разом з addEvent, автоматично отримує метод mootools, без необхідності вручну встановлювати його.

але якщо цього не відбувається, ви можете спробувати

new Event(event).preventDefault();

1
Виникла якась проблема, коли подібне обгортання було також в IE. Боже мій! Чому IE?
sv_in

Вона не хоче зупиняти подію, проте просто запобігає дії за замовчуванням.
Alsciende

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

Тестували на IE 9 та Chrome.


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


Ви єдиний відповідальний, хто вдарив цвяхом по голові. Єдиною причиною, коли хтось тут говорить про раннє 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. Що це робить?
Оріол

1
.stop()кидає виняток, тому що його не існує. Будь-який виняток матиме бажаний ефект.
Джей Базузі

і чому ви хочете кинути виняток? Я маю на увазі, якщо ви хочете викинути виняток, ви можете просто зателефонувати, e.preventDefault()оскільки він все одно кине виняток ...
Matthias Burger

2

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

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

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


0

return false у вашому слухачі слід працювати у всіх браузерах.

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

0

FWIW, якщо хтось перегляне це питання пізніше, ви також можете перевірити, що ви передаєте вашій функції обробника onKeyPress.

Я зіткнувся з цією помилкою, коли помилково передав OnKeyPress (це) замість onKeyPress (подія).

Просто ще щось перевірити.


0

Мені допоміг метод з перевіркою функції. Цей метод працює в IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.