событие.функция 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 я обнаружил, что

1118   11  

11 ответов:

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

event.returnValue = false;

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

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

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

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

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

Если вы свяжете событие через функцию 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 (); работает нормально.

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

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

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

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

обновление:

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

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

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

врач говорит

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

но в случае, если это не так, вы можете захотеть попробуй

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

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

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

чтобы отключить a обычная клавиша клавиатуры под 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

вот функция, которую я тестировал с помощью 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;
})

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

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

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

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

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

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

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

просто кое-что проверить.

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

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

Comments

    Ничего не найдено.