2016-04-11 6 views
2

У меня есть глобальный скрипт для проверки форм с jqueryvalidation:JQuery Validate плагин, как остановить форму Подавать с внешним обработчиком

$("form").validate({ 
    submitHandler: function(form) { 
     $("body").append("<p>validate</p>"); 
     form.submit(); 
    } 
    }); 

В определенной форме мне нужно добавить еще один «второй» обработчик этой формы :

$("#myform").submit(function(){ 
    $("body").append("<p>other handler</p>"); 
    return false; 
    }); 

Почему return false; второго обработчика не блокирует форму отправки? Я также пробовал с preventDefault и stopProparation, но он не работает.

https://jsfiddle.net/brj7ttdn/5/

+0

я не могу видеть эту ситуацию на вашем jsfiddle? –

+0

Извините, моя скрипка была обновлена ​​только для моей сессии, теперь я обновляю ссылку на последнюю версию. – Tobia

+0

@Tobia дайте мне знать, если мой ответ вам поможет –

ответ

-1

Вы можете попробовать preventDefault() правильно, как показано ниже:

$(function(){ 
    $("form").submit(function(event){ 
    $("body").append("<p>other handler</p>"); 
    event.preventDefault(); 
    }); 
}); 

Проверьте Fiddle.

+0

Вы играете, потому что вы удалили первый обработчик проверки. В моем случае у меня есть 2 обработчика, первый (глобальный основной проект и я не могу его изменить) и свой пользовательский в одну форму. – Tobia

+0

Извините, моя скрипка была обновлена ​​только для моей сессии, теперь я обновляю ссылку на последнюю версию, и теперь я думаю, что вы можете понять мою ситуацию. – Tobia

-1

Отключить событие нажатия кнопки, форма отправки также будет отключена. Изменить

$("#myform").submit(function(e){ 

в

$("button").click(function(e){ 

Если форма представить прессовой «ENTER», вы должны вызвать нажатие действие и прекратить действие Подавать с скриптом, как:

$("input").on("keypress", function(e){ 
    var keypress; 
    if(window.event) { // IE      
     keypress= e.keyCode; 
    } else if(e.which){ // Netscape/Firefox/Opera     
     keypress= e.which; 
    } 
    if (keypress == 13) { 
     e.preventDefault(); 
    } 
}) 
+0

Я хочу отключить форму submit также для ввода «ENTER» в текстовый ввод и т. Д. Эта кнопка доступна только для отправки цели тестирования. – Tobia

+0

Вы отправляете форму по javascript? Измените свой скрипт. Если нет, вам нужно нажать кнопку для отправки вашей формы. –

+0

@Tobia: cuz ваша проверка с помощью функции submit(), и вы не можете использовать сценарий для запуска того же действия, чтобы отключить его. Вам нужно вызвать событие перед вызовом функции submit(). Поэтому измените свой скрипт, когда форма отправит с помощью «ENTER»/или нажмите кнопку. –

1

Могли бы вы возможно, удалите глобальный субтитандлер и разрешите только конкретный запуск? Как это:

$(function(){ 

$("form").validate({ 
    submitHandler: function(form) { 
    $("body").append("<p>validate</p>"); 
    form.submit(); 
    } 
}); 

$('#myform').off('submit') 

$("#myform").submit(function(e){ 
    $("body").append("<p>validate</p>"); 
    $("body").append("<p>other handler</p>"); 
    e.preventDefault(); 
    }); 
}); 

Вы должны вызвать проверку из другого обработчика, а также, но это не может быть слишком болезненным, просто сделать form.valid() вызов

0

Вот является Working Fiddle И код как показано ниже.

$(function() { 

    $("form").validate({ 
    submitHandler: function(form) { 
     $("body").append("<p>validate</p>"); 

     if ($(form).data('has-customSubmit-event') === true) { 
     $(form).trigger('customSubmit'); // trigger your custom submit. 
     } else { 
     form.submit(); 
     } 
    } 
    }); 

    $('#myform').data('has-customSubmit-event', true); // add a pointer to say there is a custom handler for this form, 

    $("#myform").on('customSubmit', function(e) { 
    $("body").append("<p>other handler</p>");  
    //$(this).submit(); // if you want to submit this form. 
    }); 

}); 

Идея заключается в том, чтобы добавить указатель, говорящий для этой формы, если его действительным не делать плагин Передать то form.submit(); но запустить собственную логику, а затем либо представить или вы не представить.

Указатель я говорю это

$('#myform').data('has-customSubmit-event', true);

Теперь в плагине представить обработчик мы можем иметь, если чек говоря, если эта форма имеет специальный обработчик для выполнения, то сделать это, иначе представляет в форма.

if ($(form).data('has-customSubmit-event') === true) { 
    $(form).trigger('customSubmit'); // trigger your custom submit. 
} else { 
    form.submit(); 
} 

Кроме того, как вы добавляете плагин проверки $("form").validate({.. как это. Так что я узнал, что это вызовет событие отправки обработчика только для первой формы (не знаю почему, Fiddle With Issue).

Так, чтобы исправить это использовать each() функцию в цикле через все формы и связать плагин индивидуально, Example Fiddle

+0

Я подумал об этом решении, главная проблема в том, что мне нужно запустить второй обработчик, только если форма является валидатором, поэтому я бы предпочел порядок противоположности, если я могу управлять пузырьками событий. – Tobia

+0

Это не очень хороший поток. Если вы хотите сделать что-то подобное, напишите функцию проверки и назовите ее, ваш дизайн будет подвержен риску последовательности процессов. –

+0

@Tobia Я обновил свой ответ, проверьте, работает ли это для вас. –

Смежные вопросы