Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;“递归太多”;jQuery 1.3.2中的实时处理程序出错_Javascript_Jquery - Fatal编程技术网

Javascript &引用;“递归太多”;jQuery 1.3.2中的实时处理程序出错

Javascript &引用;“递归太多”;jQuery 1.3.2中的实时处理程序出错,javascript,jquery,Javascript,Jquery,此问题类似于,但涉及实时处理程序。我有一个元素在另一个元素中。它们都有同名的自定义事件处理程序。外部元素有一个传统的处理程序,内部元素有一个活动的处理程序。当我试图触发外部元素上的事件时,我的浏览器会暂停一段时间,然后出现一个错误,说“递归太多” 我在上一篇文章中读到,我可以通过在处理程序函数中返回false来防止活动处理程序冒泡。然而,我试过这个,它似乎没有什么不同。不管是哪种方式,当我试图只调用一次外部函数时,它似乎被多次调用 我怎样才能解决这个问题?有可能有这样的同名处理程序,或者我必须想

此问题类似于,但涉及实时处理程序。我有一个元素在另一个元素中。它们都有同名的自定义事件处理程序。外部元素有一个传统的处理程序,内部元素有一个活动的处理程序。当我试图触发外部元素上的事件时,我的浏览器会暂停一段时间,然后出现一个错误,说“递归太多”

我在上一篇文章中读到,我可以通过在处理程序函数中返回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。真的看到了吗?我试着把“测试”的名字改成“点击”,我得到了完全相同的错误。真的吗?我尝试将“测试”名称更改为“单击”,但得到了完全相同的错误。