2011-05-29 66 views
1

最近我遇到了一个问题,其中$ .post不发送关于被按下的按钮的信息。 也就是说我们有两个按钮的表单。

<form method="post" action="/home/index"> 

    <input type='hidden' name='data1' value='value1' /> 

    <button name="button1" type="submit">First</button> 
    <button name="button2" type="submit">Second</button> 

</form> 

$(document).ready(function() { 
    $('#formId').submit(function() { 
     var f = $(this); 
     var action = f.attr("action"); 
     var serf = f.serialize(); 
     $.post(action, serf, 
     //onreturn 
      function (data) { 
       //do something here on success 
       }, 
       'json' 
     ); 
     return false; 
     }); 
}); 

没有Ajax的形式发布,就好像用户按下第一个按钮如下:数据1 =值& Button1的

但是当我使用$。员额提交的表单不包含任何按键信息:数据1 =值1

的jQuery 1.6.1

行为取决于被压的按钮。 任何帮助或解决方法将appriciate!

回答

3

由于您要停止浏览器的默认行为,即提供按钮值,您必须捕捉按下的按钮,然后将该信息添加到您发布的数据(您的serf数据)。可能最可靠的方法是将click事件挂接到表单的按钮以及submit事件上,并将它们全部路由到一个中心函数,该函数执行带有(或不带)按钮值的ajax提交(没有以另一种方式提交表格的情况,而不是按下其中一个按钮)。

这些方针的东西:

$(document).ready(function() { 
    function submitTheForm(f, button) { 
     var action = f.attr("action"); 
     var serf = f.serialize(); 
     if (button && button.name) { 
      serf += "&" + encodeURIComponent(button.name); 
      if (button.value) { 
       serf += "=" + encodeURIComponent(button.value); 
      } 
     } 
     $.post(action, serf, 
     //onreturn 
      function (data) { 
       //do something here on success 
      }, 
      'json' 
     ); 
    } 
    $('#formId').submit(function() { 
     submitTheForm($(this)); 
     return false; 
    }); 
    $("#formId :submit").click(function() { 
     submitTheForm($(this).closest('form'), this); 
     return false; 
    }); 
}); 
+0

我更专注于按钮,而不是他实际在做什么;)+1 – 2011-05-29 09:24:24

+0

'encodeURIComponent'是做什么的? – Starx 2011-05-29 09:36:42

+0

@Starx:表单通常会发送URI编码。 ['encodeURIComponent'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURIComponent)正确地编码URI编码字符串的组成部分。例如,如果按钮的值为“发送表单”,则encodeURIComponent会返回“发送%20Form”,因为在URI编码中必须对空格进行编码。名称/值对的名称和值都必须进行编码,尽管您会看到很多人错过了对名称进行编码(如果您选择的编码没有被更改,通常会没问题)。 – 2011-05-29 09:43:53

0

我不认为这是假设发生。但无论如何,你也可以这样。

$("#formid").children("input[type="submit"]").click(function() { 
    var name = $(this).attr("name"); 
    post(name); 
    return false; 
}); 
function post(buttnname) { 
    var action = $("#formid").attr("action"); 
    var serf = $("#formid").serialize()+"&button="+buttname; 
    $.post(action, serf, 
    //onreturn 
     function (data) { 
      //do something here on success 
      }, 
      'json' 
     ); 
}