【问题标题】:LinkButton does not invoke on click()LinkBut​​ton 不会在 click() 上调用
【发布时间】:2009-06-03 06:46:20
【问题描述】:

为什么这不起作用?

    <script src="Scripts/jquery-1.3.2.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            $('.myButton').click();
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:LinkButton id="ttt" runat="server" PostBackUrl="~/Default.aspx" CssClass="myButton">Click</asp:LinkButton>
    </div>
    </form>

【问题讨论】:

    标签: asp.net jquery


    【解决方案1】:

    您要提交表单,还是添加 Click 事件? 您的链接按钮转换为

    <a id="ttt" class="myButton" href="javascript:WebForm_DoPos[...]">Click</a>
    

    ,所以它没有点击 javascript。因此,.click(); 什么都不做。
    我还没有测试过,但也许这会起作用:

    eval($('.myButton').attr('href'));
    

    【讨论】:

    • .click() 无论如何都不会做任何事情,因为 jQuery 使用事件侦听器而不是调整 .onclick 元素属性。
    • 实际上,Andrew,我测试它只是为了确定,并且 .click() 确实启动了 onClick 事件。
    • 似乎不适用于 IE7,相同的代码适用于 chrome。有人遇到同样的问题吗?
    • 不要使用 eval(eval 是邪恶的) - 使用原生 javascript click() 方法 - 请参阅我的答案。编辑:Eval 不好,因为它可能允许攻击者执行任意 javascript。
    • @Joe - click() 确实有效,谢谢。不过,您可能不想要真正的点击,这也可能会做其他事情。不过,我不买“评估是邪恶的”,尤其是在这里。如果攻击者可以更改链接按钮上的href 属性,那就太迟了。
    【解决方案2】:

    trigger('click') 触发 .NET 未连接的 jQuery 的单击事件侦听器。您可以触发 javascript click 事件,该事件将转到(或在这种情况下运行)href 属性中的内容:

     $('.myButton')[0].click();
    

     ($('.myButton').length ? $('.myButton') : $('<a/>'))[0].click();
    

    如果您不确定该按钮是否会出现在页面上。

    【讨论】:

      【解决方案3】:

      如果需要触发链接按钮的 OnClick 服务器端事件,则需要使用 __doPostback(eventTarget, eventArgument)。

      例如:

      <asp:LinkButton ID="btnMyButton" runat="Server" OnClick="Button_Click" />
      
      <script type="text/javascript">
      
      function onMyClientClick(){ 
        //do some client side stuff
      
        //'click' the link button, form will post, Button_Click will fire on back-end
        //that's two underscores
        __doPostBack('<%=btnMyButton.UniqueID%>', ''); //the second parameter is required and superfluous, just use blank
      }
      
      </script>
      

      【讨论】:

        【解决方案4】:

        您需要分配一个事件处理程序以在引发单击事件时触发

            $(document).ready(function() {
                $('.myButton', '#form1')
                    .click(function() {  
                        /* 
                           Your code to run when Click event is raised.
                           In this case, something like window.location = "http://..."                      
                           This can be an anonymous or named function
                        */
                        return false; // This is required as you have set a PostbackUrl
                                      // on the LinkButton which will post the form
                                      // to the specified URL
                    }); 
            });
        

        我已经使用 ASP.NET 3.5 对上述内容进行了测试,它按预期工作。

        Linkbutton 上还有OnClientClick 属性,用于指定在引发点击事件时运行的客户端脚本。

        我能问一下你想达到什么目标吗?

        【讨论】:

        • 它确实有效,您需要在函数中执行一些操作。您是通过 AJAX 还是在页面加载后添加链接按钮?
        • 是否正确引用了 jQuery 框架?您可以通过尝试 $(document).ready(function() { alert("Hello"); }); 进行测试
        【解决方案5】:

        点击事件处理程序必须实际执行一个动作。试试这个:

        $(function () {
            $('.myButton').click(function () { alert('Hello!'); });
        });
        

        【讨论】:

        • 不,我没有用于测试它的 ASP 环境。不过,这绝对是一个错误。
        【解决方案6】:

        你需要给链接按钮一个 CssClass="myButton" 然后在顶部使用它

        $(document).ready(function() {
                $('.myButton').click(function(){
                     alert("hello thar");
                });
            });
        

        【讨论】:

          【解决方案7】:

          这是一个艰难的过程。据我了解,您想模仿在 javascript 代码中单击按钮的行为。问题是 ASP.NET 向 onclick 处理程序添加了一些花哨的 javascript 代码。

          在 jQuery 中手动触发事件时,只会执行 jQuery 添加的事件代码,不会执行 onclick 属性或 href 属性中的 javascript。所以想法是创建一个新的事件处理程序,它将执行属性中定义的原始 javascript。

          我要提出的建议尚未经过测试,但我会试一试:

          $(document).ready(function() {
          
          // redefine the event
          $(".myButton").click(function() {
             var href = $(this).attr("href");
          
             if (href.substr(0,10) == "javascript:") {
                new Function(href.substr(10)).call(this);
                // this will make sure that "this" is
                // correctly set when evaluating the javascript
                // code
             } else {
                window.location = href;
             }
          
             return false;
          });
          
          // this will fire the click:
          
          $(".myButton").click();
          
          });
          

          【讨论】:

            【解决方案8】:

            澄清一下,只有 FireFox 会遇到这个问题。见http://www.devtoolshed.com/content/fix-firefox-click-event-issue。在 FireFox 中,锚 (a) 标签没有 click() 函数来允许 JavaScript 代码直接在它们上模拟点击事件。它们确实允许您映射锚标记的点击事件,而不是用 click() 函数模拟它。

            幸运的是,ASP.NET 将 JavaScript 回发代码放入 href 属性中,您可以在其中获取它并在其上运行 eval。 (或者直接调用 window.location.href = document.GetElementById('LinkBut​​ton1').href;)。

            或者,您可以调用 __doPostBack('LinkBut​​ton1');请注意,“LinkBut​​ton1”应替换为 LinkBut​​ton 的 ClientID/UniqueID 以处理命名容器,例如用户控件、MasterPages 等。

            乔丹·里格

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-25
              • 2012-10-19
              • 2020-12-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多