2009-06-16 3 views
188

Ниже мой JavaScript (MooTools) Код:event.preventDefault() функция не работает в IE

$('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).

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

+0

Он делает; в соответствии с документами (http://mootools.net/docs/core/Native/Event#Event:preventDefault), что он должен работать: «Метод событий: preventDefault - метод перекрестного браузера, чтобы предотвратить действие по умолчанию для события». –

+0

Мой плохой, я удалил свой комментарий, который был «у mootools есть способ остановить события?». Так что проблема с mootools на ie8 ... – Alsciende

+2

Невозможно воспроизвести эту проблему. [Эта скрипка] (http://jsfiddle.net/tofu/6E4Eq/show/) «работает для меня, например, 8». Не могли бы вы настроить сниженный скрипт, чтобы показать ошибку? http://jsfiddle.net/ – eerne

ответ

448

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

event.returnValue = false; 

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

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

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

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

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

Для меня работал следующий код: if (event.preventDefault) { event.preventDefault(); } Остальные { event.returnValue = false; } –

+223

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

+29

Стоит отметить, что« событие »должно быть глобальным объектом события в IE8. Вы не можете использовать событие, переданное в обработчик событий, например e.preventDefault, оно должно быть event.preventDefault, чтобы это работало в IE8. – jmort253

6

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

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

Док говорит

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

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

new Event(event).preventDefault(); 
+1

Возникла некоторая проблема при обертке, подобной этому, и в IE. О, Боже мой! Почему IE? –

+0

новое событие (e) .stop(); работает в IE6 и далее –

+0

Она не хочет останавливать событие, однако, просто предотвращает его действие по умолчанию. – Alsciende

2

Вот функция, я тестировал с 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

+0

'.stop()' генерирует исключение, потому что его не существует. Любое исключение будет иметь желаемый эффект. –

23

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

+1

+1 для удивительного исправления jQuery :) – Evildonald

+1

К сожалению, этот трюк не работает для меня. Я использую IE 10 и перед вызовом e.preventDefault(); Я кулачок, вызывающий $ .event.fix (e); без успеха :( – Beatles1692

+0

Возможно, он был удален из jquery 2? Но IE10 не нуждается в исправлении. – oldwizard

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

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

3

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

Ссылка: How to disable keyboard shortcuts in IE7/IE8

11

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

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

Давайте предположим, что у нас есть этот код:

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

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

Даже если установить returnValue свойство непосредственно ложным:

$('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.

+0

Вы также можете получить исходный объект события браузера из 'event.originalEvent'. Дополнительная информация: http://stackoverflow.com/a/16675056/22550 –

+0

Спасибо за информацию. Я обновлю свой пост. – muffir

0

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

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

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

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

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

0

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

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

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

0

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

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