jquery - 当对按钮使用 jQuery .on() 方法而不是表单 - 提交事件时,html5 表单在未经验证的情况下提交。为什么?

标签 jquery html validation submit opera

下面的代码使表单在没有 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. 为什么当我们将处理程序绑定(bind)到点击事件而不是提交时会发生这种情况?
  2. 为什么不在 Opera 中使用提交事件类型?

谢谢。

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

表单和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>

最佳答案

在第一个版本中,提交完全是合成的; HTML 的自然表单提交过程被抑制,发生的一切都由 javascript/jQuery 执行。

在第二个版本中,允许启动 HTML 的自然表单提交过程,但随后会以“onsubmit”处理程序的形式被 javascript/jQuery 拦截。

可以理解,HTML5 表单验证是自然 HTML 过程的一部分,并且(我以前不知道这一点)必须在“onsubmit”事件之前发生。

编辑:

我只能假设 HTML5 标准没有详细指定事件的顺序,并且(根据您所说的)Opera 的实现在这方面与其他(支持验证的)浏览器不同。

出于兴趣,对 this question 的接受答案告诉我们“您无法触发 native 验证 UI,但您可以轻松地在任意输入元素上利用验证 API”。这为 Opera 的缺点提供了一种解决方法,方法是使用您的第一种方法并分别在每个表单字段上触发验证。但希望 Opera 能解决这个问题,这样从长远来看就没有必要了。

关于jquery - 当对按钮使用 jQuery .on() 方法而不是表单 - 提交事件时,html5 表单在未经验证的情况下提交。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9959710/

相关文章:

c++ - QT - QInputDialog 如何验证?

javascript - 在隐藏的 div 中加载 OpenStreetMap

javascript - Timepicker 只显示几次

css - 如何减少字段集/表单组中过多的空白

javascript - 在javascript中实现移动触摸键盘

html - 在圆形进度区域中部分显示图像

c# - 访问其他模型属性的自定义验证方法

javascript - 如何在JS中使00/00/0000日期无效

javascript - Wordpress css 类干扰 slider

javascript - 引用错误: updateSliderMargin is not defined