В следующем коде (JSFiddle here):Удаления предка во время фазы событий кипящего
<form>
<button>ok</button>
</form>
$(function(){
$('form').submit(false) ;
$('button').click(function(){ $('form').remove() }) ;
}) ;
При щелчок по кнопке в Google Chrome 48, это вызывает форму представление.
Если вы делаете это в Firefox 43, однако отправка формы отсутствует.
Мне кажется, что поведение Firefox должно быть правильным, но поскольку у меня нет такого глубокого знания стандарта, я действительно не знаю.
Является ли поведение неправильным или ошибочным?
Развейте:
Я только что узнал, что же тест, но без использования JQuery не влечет за собой представление формы ни в одном браузере.
<form onsubmit="return false">
<button onclick="form.remove()">ok</button>
</form>
Это не может быть проблемой синхронизации, поскольку в Javascript нет параллелизма потоков. События потоков всегда будут выполняться последовательно, поэтому обработчик события button
должен завершиться до запуска обработчика событий form
.
Я слепой здесь. jQuery должен делать некоторые странные громоздкие вещи, чтобы это произошло в Chrome.
Последующие 2:
Это не проблема JQuery. В JQuery багтрекер мне сказали, что встроенные обработчики событий не следуют той же спецификации, привязанных с addEventListener
, поэтому истинный функционально эквивалентный код должен быть таким:
<form>
<button>ok</button>
</form>
<script>
document.querySelector('form').addEventListener('submit',function(){ return false }) ;
document.querySelector('button').addEventListener('click',function(evt){ evt.target.form.remove() }) ;
</script>
И это действительно ведет себя как JQuery версия.
@Oriol, говорится в документе: «Этот метод является ярлыком для' .on («submit», handler) '" – GetFree
О, я вижу. Я не могу найти его в документах, но 'on' does' if (fn === false) fn = returnFalse'. Я добавил ответ. – Oriol
@Oriol, документация для этого описана в параметре 'handler'. – GetFree