我可以调用jquery click()来跟踪一个<a>链接,如果我没有绑定一个事件处理程序绑定或点击它已经?
我有一个计时器在我的JavaScript需要模拟点击一个链接去一个时间过去的另一页。 为此,我使用jQuery的click()
函数。 我也使用了$().trigger()
和window.location
,并且我可以按照预期的方式使用它们。
我用click()
观察到一些奇怪的行为,我试图理解发生了什么,为什么。
我使用Firefox来描述这个问题中的所有内容,但是我也对其他浏览器使用这个function感兴趣。
如果我没有使用$('a').bind('click',fn)
或$('a').click(fn)
来设置一个事件处理函数,然后调用$('a').click()
似乎什么都不做。 它不会为此事件调用浏览器的默认处理程序,因为浏览器不会加载新页面。
但是,如果我首先设置一个事件处理程序,那么即使事件处理程序不执行任何操作,它也会按预期工作。
$('a').click(function(){return true;}).click();
这加载了新的页面,就像我点击了一个自己。
所以我的问题是双重的:这是不是奇怪的行为,因为我在某个地方做错了什么? 为什么调用click()
对默认行为不做任何事情,如果我没有创build自己的处理程序?
编辑:
正如霍夫曼在试图重复我的结果时所确定的那样,我上面描述的结果实际上并没有发生。 我不确定昨天发生的事情是什么原因造成的,但是我今天肯定这不是我在问题中所描述的。
所以答案是,你不能在浏览器中“伪造”点击,并且所有的jQuery都会调用你的事件处理程序。 你仍然可以使用window.location
来改变页面,这对我来说很好。
有趣的是,这可能是jQuery的“function请求”(即bug)。 如果将jQuery事件绑定到元素,则jQuery click事件只会触发元素上的单击操作(在DOM上称为onClick事件)。 你应该去jQuery邮件列表( http://forum.jquery.com/ )并且报告这个。 这可能是想要的行为,但我不这么认为。
编辑:
我做了一些testing,你说的是错误的,即使你把一个函数绑定到一个'a'标签,它仍然不会把你带到由href属性指定的网站。 试试下面的代码:
<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script> <script> $(document).ready(function() { /* Try to dis-comment this: $('#a').click(function () { alert('jQuery.click()'); return true; }); */ }); function button_onClick() { $('#a').click(); } function a_onClick() { alert('a_onClick'); } </script> </head> <body> <input type="button" onclick="button_onClick()"> <br> <a id='a' href='http://www.google.com' onClick="a_onClick()"> aaa </a> </body> </html>
它永远不会去google.com,除非你直接点击链接(有或没有评论代码)。 另外请注意,即使您将点击事件绑定到链接,点击button后它仍然不会变成紫色。 只有直接点击链接才会变成紫色。
我做了一些研究,看起来.click并没有假设使用'a'标签,因为浏览器不支持使用javascript来“点击”。 我的意思是,你不能用javascript“点击”一个元素。 使用“a”标签,您可以触发其onClick事件,但链接不会更改颜色(对于访问的链接颜色,在大多数浏览器中默认为紫色)。 所以使$()。click事件与'a'标签一起工作是没有意义的,因为进入href属性的行为不是onClick事件的一部分,而是在浏览器中硬编码的。
另一个select当然是使用香草javascript:
document.getElementById("a_link").click()
如果你看看$.click
函数的代码,我敢打赌,有一个条件语句,它检查元素是否有click
事件注册的监听器, click
继续。 为什么不从链接中获取href
属性并手动更改页面位置?
window.location.href = $('a').attr('href');
编辑:这是为什么它没有点击通过,从trigger
function,版本1.3.2的jQuery源代码:
// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) event.result = false; // Trigger the native events (except for clicks on links) if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) { this.triggered = true; try { elem[ type ](); // prevent IE from throwing an error for some hidden elements } catch (e) {} }
在它调用处理程序(如果有的话)之后,jQuery会在对象上触发一个事件。 但是,如果元素不是链接,它只会调用本地处理程序的点击事件。 我猜这是出于某种原因有目的地完成的。 这应该是真的,不pipe是否定义了一个事件处理程序,所以我不知道为什么在你的情况下附加一个事件处理程序导致本地onClick
处理程序被调用。 你必须做我所做的事情,并逐步执行,看看它被调用的地方。
jQuery中的定位标签上的单击处理程序是一个特殊情况。
我认为你可能会在锚的onclick事件(浏览器已知)和jQuery对象的click事件之间产生混淆,该事件包装了DOM标记的定义。
你可以在这里下载jQuery 1.3.2源代码。
源文件的相关部分是2643-2645行(为了便于理解,我把它分成了多行):
// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) event.result = false;
JS / jQuery不支持以编程方式“点击”链接的默认行为。
你可以做的是创build一个表单并提交。 这样就不必使用window.location
或window.open
,它们通常被浏览器阻止为不需要的popup窗口。
这个脚本有两个不同的方法:一个试图打开3个新的标签/窗口(它只在IE和Chrome中打开1,更多信息在下面),一个在链接点击时触发自定义事件。
这里是如何:
HTML
<html> <head> <script src="jquery-1.9.1.min.js" type="text/javascript"></script> <script src="script.js" type="text/javascript"></script> </head> <body> <button id="testbtn">Test</button><br><br> <a href="https://google.nl">GOOGLE</a><br> <a href="http://en.wikipedia.org/wiki/Main_Page">WIKI</a><br> <a href="https://stackoverflow.com/">SO</a> </body> </html>
jQuery(script.js)
$(function() { // Try to open all 3 links by pressing the button // - Firefox opens all 3 links // - Chrome only opens 1 of them without popup warning // - IE only opens 1 of them WITH popup warning $("#testbtn").on("click", function() { $("a").each(function() { var form = $("<form></form>"); form.attr( { id : "formform", action : $(this).attr("href"), method : "GET", // Open in new window/tab target : "_blank" }); $("body").append(form); $("#formform").submit(); $("#formform").remove(); }); }); // Or click the link and fire a custom event // (open your own window without following the link itself) $("a").on("click", function() { var form = $("<form></form>"); form.attr( { id : "formform", // The location given in the link itself action : $(this).attr("href"), method : "GET", // Open in new window/tab target : "_blank" }); $("body").append(form); $("#formform").submit(); $("#formform").remove(); // Prevent the link from opening normally return false; }); });
它所做的是每个链接元素:
- 创build一个表单
- 给它的属性
- 附加到DOM,以便提交
- 提交
- 从DOM中删除表单,删除所有的痕迹*插入邪恶的笑*
现在你有一个新的标签页/窗口加载"https://google.nl"
(或任何你想要的url,只需更换它)。 不幸的是,当你试图以这种方式打开多个窗口时,当试图打开第二个窗口(第一个窗口仍然打开)时,会Popup blocked
一个Popup blocked
消息条。
更多的信息,我怎么到这个方法是在这里find:
打开新窗口/选项卡,而不使用window.open
或window.location.href
触发一个超链接元素,它是你要连接jQuery的元素.click()
<div class="TopicControl"> <div class="articleImage"> <a href=""><img src="" alt=""></a> </div> </div>
在你的脚本中,你要连接到你想要点击事件的主容器。 然后,你使用标准的jQuery方法来查找元素(types,类,id)并点击点击。 会发生什么是jquery进入一个recursion函数来触发点击,并通过采取事件'e'和stopPropagation()函数中断recursion函数并返回false,因为你不想让jquery做任何事情,而不是火花的链接。
$('.TopicControl').click(function (event) { $(this).find('a').click(); event.stopPropagation(); return false; });
另一种解决方法是将容器包装在元素中,并将容器放置在容器内而不是容器内。 设置跨度显示块以符合W3C标准。
它什么都不做,因为没有事件被绑定到事件。 如果我没有记错,jQuery维护自己的绑定到NodeLists的事件处理程序的性能和其他目的。
如果你需要这个function的话,或者很less的话。 (你是整个应用程序不需要这个function)我宁愿离开jQuery(原因很多,包括能够更新到更新的版本,CDN等),并有以下解决方法:
// For modren Browsers $(ele).trigger("click"); // Relaying on Paul Irish's conditional class names http://bit.ly/HWIpAp (via HTML5 Boilerplate http://bit.ly/HUzi3I) where each IE version gets a class of its Version $("html.ie7").length && (function(){ var eleOnClickattr = $(ele).attr("onclick") eval(eleOnClickattr); })()
要在相同的选项卡中打开超链接,请使用:
$(document).on('click', "a.classname", function() { var form = $("<form></form>"); form.attr( { id : "formid", action : $(this).attr("href"), method : "GET", }); $("body").append(form); $("#formid").submit(); $("#formid").remove(); return false; });
你可以使用jQuery为那个元素selectjQuery对象。 然后,获取底层DOM元素并调用其click()
方法。
由id
$("#my-link").each(function (index) { $(this).get(0).click() });
或者使用jQuery通过CSS类点击一堆链接
$(".my-link-class").each(function (index) { $(this).get(0).click() });