Javascript &引用;“递归太多”;jQuery 1.3.2中的实时处理程序出错
此问题类似于,但涉及实时处理程序。我有一个元素在另一个元素中。它们都有同名的自定义事件处理程序。外部元素有一个传统的处理程序,内部元素有一个活动的处理程序。当我试图触发外部元素上的事件时,我的浏览器会暂停一段时间,然后出现一个错误,说“递归太多” 我在上一篇文章中读到,我可以通过在处理程序函数中返回false来防止活动处理程序冒泡。然而,我试过这个,它似乎没有什么不同。不管是哪种方式,当我试图只调用一次外部函数时,它似乎被多次调用 我怎样才能解决这个问题?有可能有这样的同名处理程序,或者我必须想出不同的名称吗?您可以使用以下代码测试问题:Javascript &引用;“递归太多”;jQuery 1.3.2中的实时处理程序出错,javascript,jquery,Javascript,Jquery,此问题类似于,但涉及实时处理程序。我有一个元素在另一个元素中。它们都有同名的自定义事件处理程序。外部元素有一个传统的处理程序,内部元素有一个活动的处理程序。当我试图触发外部元素上的事件时,我的浏览器会暂停一段时间,然后出现一个错误,说“递归太多” 我在上一篇文章中读到,我可以通过在处理程序函数中返回false来防止活动处理程序冒泡。然而,我试过这个,它似乎没有什么不同。不管是哪种方式,当我试图只调用一次外部函数时,它似乎被多次调用 我怎样才能解决这个问题?有可能有这样的同名处理程序,或者我必须想
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>live event handler test</title>
</head>
<body>
<div id="outer">
<div id="inner">
</div>
</div>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$("#outer").bind("test", function() {
$("#inner").trigger("test");
});
$("#inner").live("test", function() {
return false;
});
$(function() {
$("#outer").trigger("test");
});
</script>
</body></html>
实时事件处理程序测试
$(“#外部”).bind(“测试”,函数(){
$(“内部”)触发器(“测试”);
});
$(“#内部”).live(“测试”,函数(){
返回false;
});
$(函数(){
$(“外部”)。触发(“测试”);
});
定制事件的live和bind组合似乎有一个bug?不太清楚到底发生了什么。如果您只使用live,则它可以工作:
$("#outer").live("test", function() {
console.log("outer");
$("#inner").trigger("test");
});
$("#inner").live("test", function() {
console.log("inner");
return false;
});
$(function() {
$("#outer").trigger("test");
});
虽然没有深入研究源代码,但似乎
bind
忽略了函数的返回值 定制事件的live和bind组合似乎有一个bug?不太清楚到底发生了什么。如果您只使用live,则它可以工作:
$("#outer").live("test", function() {
console.log("outer");
$("#inner").trigger("test");
});
$("#inner").live("test", function() {
console.log("inner");
return false;
});
$(function() {
$("#outer").trigger("test");
});
虽然没有深入研究源代码,但似乎bind
忽略了函数的返回值 查看#outer
的回调:
$("#outer").bind("test", function() {
$("#inner").trigger("test");
});
您正在对#internal
触发#test
,但是#internal
是#outer
的子事件,因此事件“冒泡”到#outer
,整个过程会自动重复(直到它爆炸)
编辑:正如@Seth所指出的,如果在#外部
和#内部
上都使用live()
,它就会工作。这是因为“return false;”“
的工作原理与这种情况类似。同样,如果您在这两个服务器上都使用bind()
,它也可以工作。这是因为“return false;”“
的工作原理与这种情况类似
但是,您将两者混合使用,并在#outer
上使用bind
,在#inner
上使用live
。净效果是,正如我所指出的,触发事件将永远不会执行live
处理程序(即return false
永远不会执行),因为,由于堆栈溢出,事件永远不会有机会冒泡到文档中
编辑2:
有没有办法防止内部事件发生冒泡?(使用live()
?)
没有。查看更好的解释。查看#outer
的回调:
$("#outer").bind("test", function() {
$("#inner").trigger("test");
});
您正在对#internal
触发#test
,但是#internal
是#outer
的子事件,因此事件“冒泡”到#outer
,整个过程会自动重复(直到它爆炸)
编辑:正如@Seth所指出的,如果在#外部
和#内部
上都使用live()
,它就会工作。这是因为“return false;”“
的工作原理与这种情况类似。同样,如果您在这两个服务器上都使用bind()
,它也可以工作。这是因为“return false;”“
的工作原理与这种情况类似
但是,您将两者混合使用,并在#outer
上使用bind
,在#inner
上使用live
。净效果是,正如我所指出的,触发事件将永远不会执行live
处理程序(即return false
永远不会执行),因为,由于堆栈溢出,事件永远不会有机会冒泡到文档中
编辑2:
有没有办法防止内部事件发生冒泡?(使用live()
?)
没有。请参阅更好的解释。完整的测试用例。完整的测试用例。为什么事件从“内部气泡”上升到“外部气泡”?“returnfalse”语句不应该防止这种情况吗?为什么会出现堆栈溢出?如果实时处理程序从未执行过,我不明白为什么外部函数会被多次调用。@mikez302:trigger
bubbles。就这么简单。删除live
,问题仍然存在<代码>实时
与此无关。我认为我最后一段的措辞混淆了这个问题。问题仍然是我在第一段所说的。有没有办法防止内部事件冒泡?@mikez302:no。看看为什么“内部泡沫”事件会上升到“外部泡沫”事件?“returnfalse”语句不应该防止这种情况吗?为什么会出现堆栈溢出?如果实时处理程序从未执行过,我不明白为什么外部函数会被多次调用。@mikez302:trigger
bubbles。就这么简单。删除live
,问题仍然存在<代码>实时
与此无关。我认为我最后一段的措辞混淆了这个问题。问题仍然是我在第一段所说的。有没有办法防止内部事件冒泡?@mikez302:no。真的看到了吗?我试着把“测试”的名字改成“点击”,我得到了完全相同的错误。真的吗?我尝试将“测试”名称更改为“单击”,但得到了完全相同的错误。