LinkButton不会在点击时触发on click()方法。

16

为什么这个不起作用?

    <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>
8个回答

41

你想提交表单,还是添加一个点击事件?
你的链接按钮翻译为:

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

因此,它没有任何on-click的javascript。因此,.click(); 没有任何作用。
我没有测试过,但也许这会起作用:

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

".click()不会做任何事情,因为jQuery使用事件监听器而不是调整.onclick元素属性。" - Andrew Noyes
3
实际上,Andrew,我进行了测试以确保,.click()确实会启动onClick事件。 - Kobi
似乎在IE7上无法工作,相同的代码在Chrome上可以。有人遇到过同样的问题吗? - Cem
3
不要使用 eval(eval 是邪恶的) - 使用本地的 JavaScript click() 方法 - 请参阅我的回答。编辑:Eval 很糟糕,因为它可能允许攻击者执行任意 JavaScript 代码。 - JoeS
1
@Joe - click() 可以工作,谢谢。不过,你可能不想要一个真正的点击,因为它可能会做其他事情。我不认同“eval 是邪恶的”这种说法,特别是在这种情况下。如果攻击者可以更改链接按钮上的 href 属性,那么已经太晚了。 - Kobi
是的,我想是这样。但是如果你正在使用严格模式,eval 将会失败。 - JoeS

13

trigger('click')会触发jQuery的点击事件监听器,但.NET没有连接到它。你可以直接触发JavaScript点击事件,这将转到(或在这种情况下运行)href属性中的内容:

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

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

Joe


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>

1

你需要为触发点击事件时分配一个事件处理程序

    $(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 还是在页面加载后添加 LinkButton? - Russ Cam
jQuery框架是否被正确引用?您可以通过尝试$(document).ready(function() { alert("Hello"); });来测试。 - Russ Cam

0

点击事件处理程序必须实际执行一个操作。请尝试以下代码:

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

不,我没有ASP环境来测试它。但这肯定是一个错误。 - Andrew Noyes

0

你需要给 linkButton 设置 CssClass="myButton",然后在顶部使用它

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

0

这是一个棘手的问题。据我所知,您想在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();

});

0

仅澄清一下,这个问题只影响FireFox。请参见http://www.devtoolshed.com/content/fix-firefox-click-event-issue。在FireFox中,锚点(a)标签没有click()函数,无法直接模拟点击事件的JavaScript代码。它们允许您映射锚点标记的click事件,但不能使用click()函数模拟它。

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

或者,您可以只调用__doPostBack('LinkButton1');请注意,“LinkButton1”应替换为LinkButton的ClientID / UniqueID以处理命名容器,例如UserControls,MasterPages等。

Jordan Rieger


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接