jquery / ajax表单不传递按钮数据

时间:2012-07-31 03:56:03

标签: forms jquery

我认为HTML规范声明按钮在表单中单击会传递其值,并且“未点击”按钮未通过。像复选框...我总是检查按钮值,有时我会根据用于提交的按钮进行不同的处理..

我已经开始使用AJAX(特别是jquery)来提交我的表单数据 - 但是按钮数据永远不会传递 - 有什么我想念的吗?我能做些什么来传递这些数据?

简单代码可能看起来像这样

<form id="frmPost" method="post" action="page.php" class="bbForm" >
<input type="text" name="heading" id="heading" />   
<input type="submit" name="btnA" value="Process It!" />
<input type="submit" name="btnB" value="Re-rout it somewhere Else!" />
</form>
<script>
$( function() { //once the doc has loaded   
//handle the forms
$( '.bbForm' ).live( 'submit', function() { // catch the form's submit event
    $.ajax({ // create an AJAX call...
        data: $( this ).serialize(), // get the form data
        type: $( this ).attr( 'method' ), // GET or POST
        url:  $( this ).attr( 'action' ), // the file to call
        success: function( response ) { // on success..
            $('#ui-tabs-1').html( response );   
        }           
    });
    return false; // cancel original event to prevent form submitting
});
});
</script>

在处理页面上 - 只显示“标题”字段,btnA或btnB都不会被点击...

如果无法“修复”,有人可以解释为什么Ajax调用不遵循“标准”形式行为吗?

THX

2 个答案:

答案 0 :(得分:3)

我发现这是一个有趣的问题,所以我想我会挖掘一下jquery源代码和api文档。

我的发现:

您的问题与ajax调用无关,而与$.serialize()函数有关。它只是没有编码返回<input type="submit">甚至<button type="submit">我尝试了两者。有一个正则表达式针对要序列化的表单中的元素集运行,并且不幸地任意排除了提交按钮。

jQuery源代码(我为了调试目的而进行了修改,但所有内容仍然完整无缺):

serialize: function() {
    var data = jQuery.param( this.serializeArray() );
            return data;
},

serializeArray: function() {
   var elementMap = this.map(function(){
        return this.elements ? jQuery.makeArray( this.elements ) : this;
    });

   var filtered = elementMap.filter(function(){
                    var regexTest1= rselectTextarea.test( this.nodeName );
                    var regexTest2 = rinput.test( this.type ); //input submit will fail here thus never serialized as part of the form
        var output = this.name && !this.disabled &&
            ( this.checked || regexTest2|| regexTest2);
                    return output;
    });

    var output = filtered.map(function( i, elem ){
        var val = jQuery( this ).val();

        return val == null ?
            null :
            jQuery.isArray( val ) ?
                jQuery.map( val, function( val, i ){
                    return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
                }) :
                { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
    }).get();
    return output;
}

现在检查jQuery文档,您可以满足它的所有要求(http://api.jquery.com/serialize/):

  

注意:只有“successful controls”序列化为字符串。没有提交按钮值被序列化,因为表单未使用按钮提交。 要使表单元素的值包含在序列化字符串中,该元素必须具有name属性。复选框和单选按钮(“radio”或“checkbox”类型的输入)中的值仅包含在他们被检查。来自文件选择元素的数据未被序列化。

“成功的控制链接分支到W3规范,你肯定在规范上指出了预期的行为。

蹩脚的蹩脚回答:我觉得它已经坏了!报告错误修复!!!

答案 1 :(得分:0)

我遇到了一个相当不寻常的问题。我正在研究一个项目并有两个单独的php页面,其中一个页面上的html与php代码分开,一个是从php代码中回显html。当我在具有单独的html代码的那个上使用.serialize时,它可以正常工作。它将我的提交按钮值在其ajax调用中发送到另一个php页面。但是在与PHP脚本回应的html中我尝试做同样的事情并得到完全不同的结果。它将发送表单中的所有其他信息,但不会发送提交按钮的值。我需要它做的就是发送我是否按“删除”或“更新”。我不是在寻求帮助(违反了在另一个人的帖子上寻求帮助的规则),但我认为这些信息可能有助于确定故障发生的位置。我会寻找一个解决方案,如果我发现任何问题,我会在这里回复。