jQuery 触发点击给出“太多递归”
我正在尝试使文章的链接在整个文章空间上都可单击。
首先,我做了悬停操作,改变鼠标悬停时的颜色等等......然后单击它应该触发链接,但这给出了“太多的递归”。
我认为这是一个事件冒泡
问题。我尝试使用 event.cancelBubble = true;
或 stopPropagation()
但没有成功。运气更差!
有人吗?
$("div.boxContent").each(function() {
if ($(this).find(".btn").length) {
var $fade = $(this).find("div.btn a > span.hover");
var $title = $(this).find("h1, h2, h3, h4, h5");
var $span = $(this).find("span").not("span.hover");
var $text = $(this).find("p");
var titleColor = $title.css('color');
var spanColor = $span.css('color');
$(this).css({'cursor':'pointer'}).bind({
mouseenter:function() {
$text.stop().animate({color:linkHover},textAnim);
$title.stop().animate({color:linkHover},textAnim);
$span.stop().animate({color:linkHover},textAnim);
$fade.stop(true,true).fadeIn(textAnim);
}, mouseleave:function() {
$text.stop().animate({color:linkColor},textAnim);
$title.stop().animate({color:titleColor},textAnim);
$span.stop().animate({color:spanColor},textAnim);
$fade.stop(true,true).fadeOut(textAnim);
}, focusin:function() {
$text.stop().animate({color:linkHover},textAnim);
$title.stop().animate({color:linkHover},textAnim);
$span.stop().animate({color:linkHover},textAnim);
$fade.stop(true,true).fadeIn(textAnim);
}, focusout:function() {
$text.stop().animate({color:linkColor},textAnim);
$title.stop().animate({color:titleColor},textAnim);
$span.stop().animate({color:spanColor},textAnim);
$fade.stop(true,true).fadeOut(textAnim);
}
}).click(function() {
$(this).find("div.btn a").trigger('click');
});
}
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的代码有问题的部分是这样的:
这表示“每次在此元素上收到任何单击事件时,都会触发对后代元素的单击”。然而,事件冒泡意味着在此函数中触发的事件随后由该事件处理程序再次处理,无限。我认为,阻止这种情况的最佳方法是查看事件是否源自
div.btn a
元素。您可以使用is
和is
和event.target
表示:“如果点击源自
div.btn 之外的任何元素a
,触发div.btn的点击事件这意味着该函数不会处理由
trigger
调用引起的事件,这优于检查event.target == this
(如安迪的回答有it),因为它可以处理div.boxContent
中存在的其他元素。The problematic bit of your code is this:
This says "every time any click event is received on this element, trigger a click on the descendant element". However, event bubbling means that the event triggered in this function is then handled again by this event handler, ad infinitum. The best way to stop this is, I think, to see if the event originated on the
div.btn a
element. You could useis
andevent.target
for this:This says "if the click originated on any element apart from a
div.btn a
, trigger a click event ondiv.btn a
. This means that events caused by thetrigger
call will not be handled by this function. This is superior to checkingevent.target == this
(as Andy's answer has it) because it can cope with other elements existing within thediv.boxContent
.解决此问题的一种更简洁的方法是获取触发点击的元素并将其放在触发的元素之外:
因此,如果您有这样的方法:
通过将“div.btn a”标签移到“boxContent”之外分区您可以一起避免递归循环。
A cleaner way to solve this is to take the the element you are triggering the click on to and put it outside of the triggered element:
So if you have this:
By moving the "div.btn a" tag outside of the "boxContent" div. You avoid the recursion loop all together.