Форма html5 отправляется без проверки при использовании метода jQuery .on () для события нажатия кнопки вместо события отправки формы.Зачем? - PullRequest
4 голосов
/ 01 апреля 2012

Ниже приведен код для отправки формы без проверки html5 ...

$j(document).on("click", "#client_entry_add", function(event){ ajax_submit();});

Хотя приведенный ниже код позволяет выполнять проверку html5, НО в браузере Opera он также не работает и отправляется без проверки (в других браузерах (проверенных на Firefox / Chrome) проверка выполняется)

$j(document).on("submit", "#client_entry_form", function(event){ ajax_submit();});

мои вопросы

  1. почему это происходит, когда мы привязываем обработчик к событию click вместо submit?
  2. почему даже не работает с типом события submit в опере?

спасибо.

=============================================== ===================================

Форма и код JavaScript

function ajax_CALL(OBJECT , URL , PARAMS , TARGET)
{//alert ('in for -> ' + URL);
if (typeof OBJECT != 'undefined' && OBJECT != null )
{   
    if( $j('#'+OBJECT).length ){OBJECT = $j('#'+OBJECT);}
    else
    if(  $j('.'+OBJECT).length ){OBJECT = $j('.'+OBJECT);}

    var ObjName  = OBJECT.attr("name");
    var ObjValue  = OBJECT.val();

    var ob_defined = true;
}

if ((typeof PARAMS == 'undefined' || PARAMS == null) && ob_defined)
{
    var PARAMS = ObjName+'='+ObjValue;// set params to pass via ajax call
}


$j.ajax({
   type: "POST",
   url: URL,
   data: PARAMS,  //"name=John&location=Boston",$j('#ContactForm').serialize()
   success: function(responseText){
//////////////////////////////////////
//hide the progress bar
//////////////////////////////////////
$j('#loading').hide();   
//////////////////////////////////////
if (typeof TARGET != 'undefined' )
{
if($j('#'+TARGET).length){TARGET = $j('#'+TARGET);}//if id
else
if($j('.'+TARGET).length){TARGET = $j('.'+TARGET);}//if class
                                            TARGET.html(responseText);
                                            //show TARGET div and display the content with fadeIn transition
                                            TARGET.fadeIn(250);
                                            //$j(TARGET).html(responseText);
                                            //display the body with fadeIn transition
                                            //$j(TARGET).fadeIn(250);       
           }
        }
    }); 
}
/*********************************************************/
$j(document).ready(function(){

    //$j(document).on("click", "#client_entry", function(event)
$j(document).on("submit", "#client_entry_form", function(event){
    //alert('ohh hhh yes :)');return false;
    //prevent default
    event.preventDefault();

    //hide the middle content and show the loading progress animation
    show_hide();

    var OBJECT = null;
    var URL = $j('#client_entry_form').attr('action');
    var PARAMS = $j('#client_entry_form').serialize();
    var TARGET = 'middle_content';
///////////////////////////////////////////////////////////////////////////////////////////
    //run ajax
    ajax_CALL(OBJECT , URL , PARAMS , TARGET);      

    //cancel the anchor tag behaviour or any other default event/trigger
    if(!event.isDefaultPrevented())
    return false;

    });
})
======================================
html5 form
<div id="client_entry_form_div">
<form action="client_entry_action.php" method="post" id="client_entry_form" name="client_entry_form" >

<fieldset id="client_info_1">   

    <label for="c_name">Name:</label> 
    <input type="text" name="c_name" required placeholder="Name" autofocus="autofocus" />

    <label for="c_phone">Phone Number:</label> 
    <input type="tel" name="c_phone" required placeholder="Mobile/Phone Number" />

    <label for="c_email">Email:</label> 
    <input type="email" name="c_email" placeholder="email@example.com" />

    <label for="c_address">Address:</label> 
    <textarea name="c_address" ></textarea>

</fieldset>

<fieldset id="client_info_2">   

    <label for="c_info">Additional notes:</label> 
    <textarea name="c_info" ></textarea>

    <input type="hidden" name="client_entry" value="add" />
    <input type="submit" name="client_entry_add" value="Add Client" id="client_entry_add" />

</fieldset>
</form>
</div>

1 Ответ

2 голосов
/ 01 апреля 2012

В первой версии подача полностью синтетическая;Процесс отправки естественной формы HTML подавляется, и все, что происходит, выполняется javascript / jQuery.

Во второй версии процесс отправки естественной формы HTML разрешается инициировать, но затем перехватывается javascript / jQuery под видомобработчик onsubmit

Проверка формы HTML5, понятно, является частью естественного процесса HTML и (я не знал этого раньше) должна происходить до события "onsubmit".

РЕДАКТИРОВАТЬ:

Я могу только предположить, что стандарт HTML5 не определяет порядок событий в деталях и (от того, что вы говорите) реализация Opera отличается в этом отношении от других (с поддержкой проверки) браузеров.

Из интереса принятый ответ на этот вопрос говорит нам, что «вы не можете вызвать собственный интерфейс проверки, но вы можете легко воспользоваться API-интерфейсом проверки для произвольных элементов ввода».Это дает возможность обойти недостатки Opera, используя ваш первый подход и инициируя проверку каждого поля формы в отдельности.Но, надеюсь, Opera решит проблему, так что в долгосрочной перспективе это не нужно.

...