如何使用BlockUI和Jquery中断ASP.NET按钮回发

时间:2009-03-14 21:25:34

标签: asp.net jquery blockui

我有一个ASP.NET页面,上面有许多ASP:Button实例。对于某些人,我需要显示确认提示,如果用户选择是,则调用原始回发方法。否则,整个过程将被取消。

我有一个运行示例,但是我得到了不一致的结果,主要是在FF3中我抛出一个异常:

[Exception... "Illegal operation on WrappedNative prototype object"  nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)"  location: "JS frame :: 

我看到了这个错误,但我对于我出错的地方感到很遗憾。这是我的例子。注意,现在我只是使用css类作为查找。从长远来看,如果证明有必要,我可以将控件的clientID嵌入到我的JS中。)。

Html片段:

<asp:Button ID="StartButton" runat="server" CssClass="startbutton" Text="Start" OnClick="OnStartClicked" />

使用Javascript:

$(".startbutton").each(function(){
            $(document).data("startclick", $(this).get()[0].click);
            $(this).unbind("click");
        }).click(function(){
            var oldclick = $(document).data("startclick");
            alert("hello");
            try
            {
                oldclick();
            }
            catch(err)
            {
                alert(err);
                alert(err.description);
            }
            return false;
        });

我的代码背后相对简单,OnStart方法只执行Response.Write

我刚刚开始研究bind,unbind和trigger,所以我在这里的用法几乎是“第一次”。

感谢您提供任何帮助或建议。

取值

编辑:

这描述了我正在尝试做的事情,同时也解决了这种陷阱:

http://www.nabble.com/onClick-prepend-td15194791s27240.html

4 个答案:

答案 0 :(得分:2)

这个怎么样?

$(document).ready( function() {
    $('.startbutton').click(function() {
        return confirm('Are you sure?');
    })
});

答案 1 :(得分:1)

我已经解决了IE7和FF3的问题。

诀窍是通过按钮上的ASP.NET属性使回发工作为“onclick”(见下文)。在Javascript中,当您阅读JQuery中的单击时,它会被作为函数引用拉出来。

要使其正常工作,请清除onclick属性(保存后),稍后再调用它。

下面的代码显示了它的实际效果。这段代码并不完整,因为我将其作为我的应用程序的通用提示符的一部分。它的布局也有点糟糕!但至少它显示了原则。

ASP.NET按钮

<asp:Button ID="StartButton" runat="server" CssClass="startbutton" Text="Start" OnClick="OnStart" UseSubmitBehavior="false" />

使用Javascript:

$(".startbutton").each(function(){
            $(document).data("startclick", $(this).attr("onclick"));
            $(this).removeAttr("onclick");
        }).click(function(){

            $.blockUI({ message: $('#confirm'), css: { width: '383', cursor: 'auto' } }); 

            $("#yes").click(function(){ 

                $.unblockUI();
                var oldclick = $(document).data("startclick");
                try
                {
                    oldclick();
                }
                catch(err)
                {
                    alert(err);
                    alert(err.description);
                }
            });

            $("#no").click(function(){
                $.unblockUI();
            });


            return false;
        });

答案 2 :(得分:0)

你的问题来自:

$(document).data("startclick", $(this).get()[0].click);
...
var oldclick = $(document).data("startclick");
...
oldclick();

在这里,您尝试拦截本机事件侦听器,但有两个错误:

  1. 使用unbind不会删除本机事件侦听器,只删除使用jQuery添加的事件侦听器
  2. click是AFAIK,用于模拟点击的IE唯一方法,它不是事件处理程序本身
  3. 您必须使用onclick而不是将其值设置为null而不是使用unbind。最后,不要将其存储在$(document).data(...)中,添加其他按钮时会遇到一些问题。以下是您可以使用的示例代码:

      $("selector").each(function()
      {
        var oldclick = this.onclick;
        this.onclick = null;
        $(this).click(function()
        {
          if (confirm("yes or no ?")) oldclick();
        });
      });
    

答案 3 :(得分:0)

for mi works:    this.OnClientClick =“$ .blockUI({message:$('#ConfirmacionBOX'),css:{width:'275px'}}); return false;”; 这是一个按钮(是一个按钮类)