FireFox НЕ отменяет отправку формы из скрипта jQuery - PullRequest
2 голосов
/ 16 декабря 2011

У меня такая ситуация:

<form class="reqSnip" action="snipvw" method="post" target="_blank">
    <input type="hidden" name="a_snip" value="0">
    <input type="hidden" name="b_snip" value="1">
    <input type="hidden" name="fullDoc" value="true">
    <button type="submit" class="getFullSnippet"></button>
</form>

Итак - базовая форма с 3 скрытыми полями + кнопка для отправки.С помощью jQuery я связываюсь с моментом отправки этой формы и настраиваю процесс:

jQuery('.reqSnip').submit(function() {
    jQuery('#snipDIV').jqmShow(); // 1
    return false; // 2
});

Чтобы прояснить картинку:

  • // 1 - открыть некоторую "поп"-подобное "окно" над веб-страницей
  • // 2 - отменить отправку формы.Я делаю это, так как форма просто запрашивает некоторую Ajax-информацию и НЕ должна выполнять стандартную форму.На мой вопрос вы можете подумать, так как я просто не хочу, чтобы отправка формы происходила, все Ajax-вещи не имеют значения для вопроса.

Как все это работает вместе:

  • В IE7 / 8/9 / Chrome / Opera - все как положено, всплывающее окно открыто, форма не отправлена ​​
  • В FireFox (версия 8.0.1 в Windows XP SP3) - всплывающее окнооткрыто и из DO отправлено (поэтому в браузере появляется новая вкладка)

Я провожу небольшое исследование в отладчиках javascript (я просто помещаю 2 точки останова (BP) в строки // 1 и // 2)и факты, которые я обнаружил:

  • IE7 / 8/9 / Chrome / Opera - нажмите BP в строке // 1, затем BP в строке // 2
  • FireFox - нажмите BP встрока // 1 и НИКОГДА не нажимает BP в строке // 2, поэтому команда return false просто никогда не выполняется: (

Итак, как сделать поведение FF таким же, как во всех других браузерах?

PS Библиотеки, используемые в строке 1:

  • jQuery - вы это знаете:)
  • jqmShow - команда из jqModal, это плагин для jQuery.Это домашняя страница: http://dev.iceburg.net/jquery/jqModal

ОБНОВЛЕНИЕ

Я обнаружил корень проблемы ... Согласно документации jqModal (см. Ссылку выше), если вы связываетесь сСобытие onShow, которое вы должны показать (сделать видимым) диалоговое окно (мое «всплывающее окно») внутри обработчик события.Таким образом, общая схема будет

var myOpen=function(hash){ hash.w.css('opacity',0.88).show(); }; 
$('#dialog').jqm({onShow:myOpen}); 
....
$('#dialog').jqmShow();

Я написал свой код очень близко к этому.Все браузеры принимают этот подход.FF "не нравится" это.Понятия не имею почему.Итак, для решения моей проблемы достаточно не связываться с событием onShow.То есть!

1 Ответ

0 голосов
/ 16 декабря 2011

Попробуйте это:

jQuery('.reqSnip').submit(function(e) {
    jQuery('#snipDIV').jqmShow(); // 1
    e.preventDefault(); // 2
});
...