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
时,其余的代码不会被调用。
嗯...我试着清理了一下我的代码。我很抱歉它太乱了;我是jQuery的新手,当我使用它时,它经常出现混乱。我承认我用PreventDefault()做了一个故事,但是我仍然得到了同样的错误,即使是修复... – Daniel 2010-12-10 21:08:09
@Daniel - 所以根据你的代码,你确实想让事件冒泡if'event.target !=这个'。是对的吗? – user113716 2010-12-10 21:15:02
不,我不知道。我读到,把它放进去有助于阻止事件冒泡;我可能误解了(我的道歉)。然而,我确实把这些代码拿出来了,并且仍然得到相同的错误... – Daniel 2010-12-10 21:29:00