jquery event.stopPropagation()似乎不起作用

时间:2010-12-10 20:44:32

标签: jquery

我正在尝试使用无序列表创建副本树视图。我使用ajax动态追加到此列表,并创建子列表。我使用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和项目A2,只触发他们的事件来获得这个

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

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

2 个答案:

答案 0 :(得分:2)

答案是名为'child'的函数从未正确绑定到我的孩子身上。因此,事件没有被禁止传播,因为功能帽防止了它首先从未绑定到列。

简而言之,我错过了这一行:$('.child' + uid).bind('click', child);

但没有人会注意到,因为我的代码有点难以理解。我将继续努力。谢谢你的帮助!

答案 1 :(得分:1)

您提供的缩进很难阅读您的代码。

我能说的最好的是你在其中一个PreventDefault()调用之前错误拼写了一个函数名stopPropagation(),所以我猜测执行失败了,{{{ 1}}永远不会到达。

这些行:

stopPropagation()

应该是:

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

(请注意event.preventDefault(); event.stopPropagation(); 中的小写“p”。)

检查控制台。可能存在错误消息。我在Safari中获得的是:

preventDefault()

编辑另外,如果TypeError: Result of expression 'event.PreventDefault' [undefined] is not a function. ,目前stopPropagation

如果总是想要调用(event.target != this),那么将该行添加到函数的顶部。否则,当您stopPropagation时,其余代码将不会被调用。