使用jQuery .click()(或类似)在href属性中触发javascript

Ben*_*ull 11 javascript jquery onclick

不幸的是,我正在使用一些第三方javascript,它将链接插入到我的页面中.我不想直接使用这些链接,而是使用代理元素,当单击它们时,会触发第三方链接上的click事件.

第三方链接将javascript包装到href属性中,如下所示:

<a id="horribleLink" href="javascript:doSomething()">Click me</a>
Run Code Online (Sandbox Code Playgroud)

我的代理元素如下所示:

<button rel="horribleLink" class="linkProxy">No, click me</button>
Run Code Online (Sandbox Code Playgroud)

还有一些jQuery的javascript将它们链接在一起:

$('button.linkProxy').click(function(){
    $('#' + $(this).attr('rel')).click();
});
Run Code Online (Sandbox Code Playgroud)

现在,如果第三方链接只是标准链接(<a id="horribleLink" href="http://www.google.com">Click</a>)或稍微不那么糟糕的onclick(<a href="#" id="horribleLink" onclick="doSomething()">Click</a>),这可以很好地工作,但是当javascript属于href属性时,触发'click'什么都不做.

谁能告诉我为什么,以及是否有合理的解决方法?

更新为Millimetric说,根本原因似乎是浏览器阻止了对锚点的"伪造点击" - 我删除了我的"标准链接"示例,因为这是另一种无效的情况.但是,正如您所期望的那样,onclick处理程序确实可以正常工作.

Mil*_*ric 11

这里接受的答案深入探讨了"为什么会发生这种情况":如果我还没有使用绑定或点击绑定事件处理程序,我可以调用jquery click()来关注<a>链接吗?.基本上,似乎你不能在链接上执行click(),因为浏览器不支持虚假点击.

一个解决方法:

如果为这些情况设置location.href,它可以工作:

$('button.linkProxy').click(function(){
    location.href = $('#' + $(this).attr('rel')).attr('href');
});
Run Code Online (Sandbox Code Playgroud)

工作小提琴:http://jsfiddle.net/uv29x/3/

两种解决方法:

你可以获得这些链接的href eval()并对它们进行操作,对吧?

  • 这里接受的答案有一点深度:http://stackoverflow.com/questions/1694595/can-i-call-jquery-click-to-follow-an-a-link-if-i-havent-bound-一个事件,HANDL.基本上,似乎你不能在链接上执行`click()`,因为浏览器不支持虚假点击. (3认同)
  • 据我所知,从安全的角度来看,eval()并不比javascript:href属性差.任何能够将令人讨厌的内容传递给eval的人都可以轻松地重写href属性并以这种方式执行代码.我认为这两种方法都具有相同的权限. (2认同)