jQuery - 全局变量问题

时间:2012-06-02 17:22:32

标签: javascript jquery html css css3

我遇到问题可能是缺乏使用全局变量的经验而导致一些问题。

请检查此http://jsfiddle.net/ZgXKx/当您点击点击我!时,我会使用全局变量动态设置某些元素的ID。

我遇到了这段代码的问题:

$("#service-sets").on('click', "#facebook-del-"+a, function() {           
    var aa = $("#facebook-del-"+a).parent().parent().parent().attr("id");
    $('#'+aa).remove();

因为"#facebook-del-"+a中的.on('click')无法正常工作而没有进入点击事件,而点击事件中的"#facebook-del-1"工作正常(显示值$("#service-sets").on('click', "#facebook-del-1", function() { var aa = $("#facebook-del-"+a).parent().parent().parent().attr("id"); $('#'+aa).remove(); )。

当我改变这样的代码时,它没有问题

{{1}}

您可以在此处查看http://jsfiddle.net/ZgXKx/1/

那么我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

$("#service-sets").on('click', "[id^=facebook-del]", function() {          
    $(this).closest('div.tag').remove();
});

<强> DEMO

下面,

[id^=facebook-del]是那些元素(交叉),idfacebook-el开头。因此,像这样设置委托事件不需要使用全局变量a进行任何索引。

$(this).closest('div.tag')定位到div.tag,这是点击交叉的容器。

答案 1 :(得分:1)

问题源于这样一个事实:与“看起来”相反,“a”变量全局。它位于由jsfiddle为您创建的函数内部。

在左侧设置控件以使代码放在<head>而不是“onload”处理程序中,它将起作用。

此外,没有理由使用该代码执行操作以删除添加的标记。也就是说,找到元素,获得其“id”值,然后通过“id”重新找到它的过程是没有意义的。一旦你找到了带有那些“.parent()”调用的元素(这本身就是一种非常脆弱的做事方式;给外层包装器一个类然后使用.closest(".whatever")会好得多) ,你已经得到了,而且没有理由再找到它。

编辑 - 现在我想到了它,虽然我所说的“a”是真的 - 它不是真正的全球 - 在这种情况下应该无关紧要。然而,这是jsfiddle的一个常见的刺激因素(当然,祝福他们的心)。

答案 2 :(得分:0)

在回调内部点击a之前,您不会增加#facebook-button。当它运行时:

$("#service-sets").on('click', "#facebook-del-"+a, function() {           
    ..
});

a仍为0,您只需处理#facebook-del-0点击事件,这些事件永远不存在。

您可以使用类来删除。给你的关闭按钮“facebook-del”,然后使用它来关闭它:

$("#service-sets").on('click', '.facebook-del', function() {           
    $(this).parent().parent().parent().remove();
});

JSFiddle