2012-08-09 65 views
2

我在页面上有ASP:Button。它呈现为HTML像这样:如何防止ASP:从jQuery点击处理程序回发按钮

<input type="submit" name="myButton" value="Do something" 
    onclick="javascript:WebForm_DoPostBackWithOptions(
     new WebForm_PostBackOptions('myButton', '', true, '', '', false, false))" 
    id="myButton" /> 

现在我试图阻止该按钮的默认行为通过jQuery的事件处理程序(提交表单):

$('#myButton').click(function() { 
    // do some client-side stuff 

    if (someCondition) { 
     // don't postback! 
     return false; 
    } 
}); 

这里的问题是,每次ASP粘贴在输入上的内联点击处理程序似乎都在jQuery事件处理程序之前执行。这里

最简单的解决办法是使用普通的input type="button"而不是ASP:Button,可惜这不是一个possibilty,因为这ASP:Button确实是需要在这种情况下许多其他的事情。

什么是防止表单提交发生的最佳方法?我想过使用字符串操作在元素的onclick属性上添加我的处理程序,但这看起来很脏。我还想避免使用OnClientClick,因为这需要我的处理函数公开​​曝光。有没有更好的办法?

+0

当您绑定事件处理函数时,它们将按照它们绑定的顺序调用,因此它会先调用内联函数,然后再调用您的处理函数。关于所有我能想到的是取消绑定默认值,绑定你的,然后重新绑定原始的 – MrOBrian 2012-08-09 20:25:11

+0

添加另一个想法到我的答案 – bUKaneer 2012-08-09 20:28:19

回答

0

我只是找到了一种方法

<script type="text/javascript" src="Scripts/jquery-1.7.2.min.js"></script> 
<script type="text/javascript"> 
    $(function() { 
     var ploopButton = null; 
     $("#ploop").click(function (e) { 
      ploopButton = this; 
     }); 
     $("#form1").submit(function (e) { 
      if (ploopButton !== null) { 
       ploopButton = null; 
       return confirm('are u sure?'); 
      } 
      return true; 
     }); 
    }); 
</script> 
<form id="form1" runat="server"> 
    <asp:Button ID="ploop" Text="ploop" runat="server" OnClick="ploop_Click" /> 
</form> 

基本上你会使用一个全球性的标志,指示哪个按钮被点击的服务器,你会确认表单提交时,标志已打开

+0

我没有想到这一点。我会试试看看它的外观。 – jbabey 2012-08-10 13:40:25

2

您是否尝试将OnClientClick="return false;"属性添加到您的aspx按钮控件?

不用担心检查出这个职位它提供了一个JavaScript事件卸载脚本:Is it possible to remove all event handlers of a given element in javascript?

我觉得你有兴趣的最后一个方法DomLib.prototype.removeEventsByTypeEx

+0

我想避免使我的处理函数公开​​,所以这将是最后的手段;我已经更新了我的问题以包含此内容。 – jbabey 2012-08-09 20:21:52

0

我觉得叫“的preventDefault”关于JavaScript事件是你在找什么。这将阻止回发到

$('#myButton').click(function (event) { 
    //Call prevent default on the event to prevent submitting the form 
    event.preventDefault(); 
    // do some client-side stuff 

    if (someCondition) { 
     // don't postback! 
     return false; 
    } 
}); 
+0

这不起作用。内联处理程序在jQuery处理程序触发之前提交表单。同样,'return false'等同于'e.preventDefault(); e.stopPropagation();'。 – jbabey 2012-08-09 20:23:30

+0

嘿,看到你的onclick处理程序,它看起来像是试图发布表单。因此,无论您使用哪种类型的按钮,onclick处理程序都会发布该表单。不知何故,需要改变以解决您的问题,我认为 – DEmmerthal 2012-08-09 20:28:57