jquery event.stopPropagation()似乎没有工作

问题描述:

我想创建一个使用无序列表的副本树视图。我使用ajax动态追加到这个列表,并创建子列表。我已经使用event.stopPropagation()来防止父事件发射,但无法阻止祖父母事件发射。这是我的代码。jquery event.stopPropagation()似乎没有工作

$('.child').click(function(event) {  

var uid = $(this).attr('id').substring(10);  
alert($('#childnodes' + uid).html()); 
var childProd = //an ajax command is here which gets list items   
$(this).append(childProd);   
$('#span' + uid).text('-'); 
$('#childnodes' + uid).unbind(); 
$('.child' + uid).bind('click', child); 
$('#childnodes' + uid).bind('click', parent); 

event.PreventDefault(); 
event.stopPropagation(); 
}); 

function parent(event) { 

alert("The parent fired."); 

if (event.target != this) { 
    return true; 
    } 

var uid = $(this).attr("id").substring(10); 
$('#span' + uid).text('+'); 
$('#childnodes' + uid).unbind();  

$('#childnodes' + uid).childnodes().empty(); 
$('#childnodes' + uid).text(''); 
$('#childnodes' + uid).bind('click', child); 

event.preventDefault(); 
event.stopPropagation(); 

} 

function child(event) {  
if (event.target != this){  
    return true; 
} 

var uid = event.target.id.substring(10); 
var childProd = //ajax command which I retrieve list items. 

    $('#childnodes' + uid).append(childProd);   
    $('#span' + uid).text('-');  
    //unbind the event 
    $('#childnodes' + uid).unbind(); 
    $('#childnodes' + uid).bind('click', parent); 
    event.preventDefault(); 
    event.stopPropagation(); 
    } 

所以基本上我开始与这个名单

  • 项目A
  • B项
  • C项

然后我扩大他们的一个一个点击事件

  • 项目A
  • 项目A1
  • 项目A2
  • B项
  • C项

我可以点击项目A1和ItemA2并只会触发他们的活动得到这个

  • 项目A
  • 项目A1
  • 项目A1B
  • 项目A2
  • B项
  • C项

现在的问题是,如果我打项目A1B(孙子元素),那么我触发项目A的删除事件。有没有人对这个问题有任何建议?

答案是名为“孩子”的功能从来没有正确绑定到我的孩子。因此,这个事件并没有被禁止传播,因为这个事件阻止了这个事件从来没有被绑定到列上。

总之我是缺少这一行:$('.child' + uid).bind('click', child);

但是,没有人会真正注意到,因为我的代码是有点难以理解。我将在此工作。谢谢您的帮助!

你的代码很难用你提供的缩进来阅读。

我可以告诉最好的是,你刚刚的stopPropagation()调用一个之前拼写错误的函数名PreventDefault(),所以我猜执行在这一点上失败,并从未达到stopPropagation()

这些行:

event.PreventDefault(); 
event.stopPropagation(); 

应该是:

event.preventDefault(); 
event.stopPropagation(); 

(注意在preventDefault()小写字母 “P”。)

检查控制台。有可能是错误消息。一个我在Safari中得到的是:

TypeError: Result of expression 'event.PreventDefault' [undefined] is not a function. 

编辑:此外,目前stopPropagation称为如果(event.target != this)

如果你总是想要stopPropagation调用,然后将该行添加到该函数的顶部。否则当return true时,其余的代码不会被调用。

+0

嗯...我试着清理了一下我的代码。我很抱歉它太乱了;我是jQuery的新手,当我使用它时,它经常出现混乱。我承认我用PreventDefault()做了一个故事,但是我仍然得到了同样的错误,即使是修复... – Daniel 2010-12-10 21:08:09

+0

@Daniel - 所以根据你的代码,你确实想让事件冒泡if'event.target !=这个'。是对的吗? – user113716 2010-12-10 21:15:02

+0

不,我不知道。我读到,把它放进去有助于阻止事件冒泡;我可能误解了(我的道歉)。然而,我确实把这些代码拿出来了,并且仍然得到相同的错误... – Daniel 2010-12-10 21:29:00