2009-09-27 71 views
2

我有一个带有两个按钮的表单。我检查被点击其中一个在使用元素的name属性在POST数据在服务器端,并做相应的东西:jquery - 用多个按钮以编程方式提交表单

<input id="reply" name="reply" type="submit" value="{%trans "REPLY"%}"> 
<input id="delete" name="delete" type="submit" value="{%trans "DELETE"%}"> 

我想添加一个确认框(使用的Boxy插件)到点击使用JQuery的DELETE按钮事件。下面是代码:

$(document).ready(function() { 
    $("#delete").click(function(e){ 
      Boxy.ask('Delete?', {'1':'YES', '2':'NO'}, function(val){ 
       if (val=='1') $("#form").submit(); 
      }); 
     return false; 
    });  
}); 

当然在这个形式的代码会导致正与DELETE按钮的名称在POST数据缺席提交。有没有办法将这些数据添加到POST数据或更好的方式来实现我正在尝试的?

回答

4

你可以使用一个命名空间的情况下,解除绑定的确认,然后再触发:

$(document).ready(function() { 

    var $delete = $("#delete"); 

    $delete.bind("click.guard", function() { 
    Boxy.ask("Delete?", {"1": "YES", "2": "NO"}, function(val) { 
     if (val == "1") { 
     $delete.unbind("click.guard").click(); 
     } 
    }); 
    return false; 
    }); 

}); 
+0

尝试在FF3和IE7上运行时没有问题。太好了,谢谢! – shanyu 2009-09-27 13:34:35

+0

不错!绝对需要确保在所有目标浏览器上进行测试,但除此之外... – 2009-09-27 14:41:36

+0

更新:适用于最新的FF,IE,Chrome和Safari以及IE7。 – shanyu 2009-09-27 15:17:19

0

最简单的方法是让您的删除按钮以单独的形式定义。

+0

是的,当然,我可以的形式张贴到上只接收删除请求,服务器端的另一种看法。但这是最好的方法吗? – shanyu 2009-09-27 13:09:36

+0

就我个人而言,我会处理在不同控制器中的回复和删除,所以对我来说这将是两全其美的。 – Zed 2009-09-27 13:21:49

1

有几种方法可以做到这一点。

  1. 如果可以将按钮名称设置为GET而不是POST数据,则在Boxy回调中将它附加到表单的操作中作为查询参数。
  2. 在表单中有一个隐藏字段,然后在Boxy回调中将该字段的值设置为按钮名称(或任何想用于将命令传递给服务器的名称)。我无法甩掉一个jQuery示例(更多的是一个Prototype人),但它应该是相当微不足道的。如果你正在进行优雅的降级(允许在没有JavaScript的情况下提交表单),可悲的是这意味着你需要检查服务器上的隐藏字段(启用了JavaScript)以及按钮名称(它不是)侧。
  3. 使用#serialize来获取表单数据,追加按钮字段,并通过jQuery.post提交结果。这与提交表单不完全相同,因为它不会用结果替换页面;你想要在post回调中处理。
+0

第一个替代方法不适用于非JavaScript提交。第三个需要比第二个更多(不必要的)努力,这似乎是最好的。谢谢。 – shanyu 2009-09-27 13:25:27