我正在尝试使用无序列表创建副本树视图。我使用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();
}
基本上我从这个列表开始
然后我通过点击事件展开其中一个
我可以点击项目A1和项目A2,只触发他们的事件来获得这个
现在的问题是,如果我点击了项目A1B(孙子元素),那么我会触发项目A的删除事件。有没有人对这个问题有任何建议?
答案 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
时,其余代码将不会被调用。