【问题标题】:How do I interrupt an ASP.NET button postback with BlockUI and Jquery如何使用 BlockUI 和 Jquery 中断 ASP.NET 按钮回发
【发布时间】:2010-10-13 09:42:30
【问题描述】:

我有一个 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

我才刚刚开始研究绑定、解除绑定和触发,所以我在这里的使用几乎是“第一次”。

感谢您的任何帮助或建议。

S

编辑:

这描述了我正在尝试做的事情,并且还给出了一些陷阱:

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

【问题讨论】:

    标签: asp.net jquery blockui


    【解决方案1】:

    这个怎么样?

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

    【讨论】:

    • 不幸的是,由 asp.net (onclick="...") 设置的事件侦听器仍然会被调用,即使您从 jQuery 处理程序返回 false。
    • 谢谢,但我不确定这将如何与 BlockUI 一起使用。我的理解是,我必须在我的“是/确定”处理程序中触发原始点击事件(回发)。是这样吗?
    • @ybo:它对我来说很好用(ASP.NET 2.0,VS2005)。你什么时候失败了? @Simon:让我快速浏览一下 BlockUI 文档;我会发布一些更新的代码。
    • @elo80ka,我的错,你完全正确,我的假设仅适用于 asp:buttons UseSubmitBehaviour="false",这不是默认值。为您的解决方案 +1。
    【解决方案2】:

    我已经解决了 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;
            });
    

    【讨论】:

      【解决方案3】:

      你的问题来自这里:

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

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

      1. 使用 unbind 不会移除原生事件侦听器,只会移除使用 jQuery 添加的事件侦听器
      2. click 是,AFAIK,仅用于模拟点击的 IE 方法,它不是事件处理程序本身

      您必须使用 onclick 将其值设置为 null 而不是使用 unbind。最后,不要存放在$(document).data(...)中,添加其他按钮会出现一些问题。这是您可以使用的示例代码:

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

      【讨论】:

      • 我通过将点击的内容包装在 try-catch 中来尝试这个。在 IE7 oldclick() 中引发“预期对象”错误,在 FF3 中我得到“TypeError:oldclick 不是函数”。我在 this.click 上发出警报,this.onclick 和 onclick 始终返回 null。不过感谢您的指点!
      【解决方案4】:

      对于 mi 作品: this.OnClientClick = "$.blockUI({ message: $('#ConfirmacionBOX'), css: { width: '275px' } });return false;"; 这是一个按钮(是一个按钮类)

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 2012-11-01
        • 2012-05-03
        • 2013-11-27
        • 1970-01-01
        相关资源
        最近更新 更多