JQuery show()不能使用live()

时间:2010-03-03 11:55:50

标签: jquery

我在JQuery中遇到了一个非常具体的问题

以下代码用于显示/隐藏div。显示/隐藏div的触发器将具有与div相同的ID,并且分别具有类(作为选择器)showTrigger/hideTrigger

wireActionPanelv3 = function(panel, fnDoThisOnShow, fnDoThisOnHide) {

var id = $(panel).attr("id");
var showTrigger = $('#' + id + '.showTrigger');
var hideTrigger = $('#' + id + '.hideTrigger');

$(showTrigger).live('click', function(event) {
    if (fnDoThisOnShow != null) fnDoThisOnShow();
    $(panel).slideDown("fast");
    return false;
});

$(hideTrigger).live('click', function(event) {
    if (fnDoThisOnHide != null) fnDoThisOnHide();
    $(panel).slideUp("fast");
    return false;
});
};

这就是我调用此函数的方法

wireActionPanelv3($('div[id="configure-filter"]'),null, null);

首次加载页面时,单击触发器时效果非常好。到目前为止一切都很好。

有些操作会在上下文中刷新div。现在,当我点击显示/隐藏触发器时,代码进入上面的点击事件,但它没有向我显示div。

当我使用bind而不是live时,再次调用初始化它就可以了。我想使用live,因为我不需要再次重新进行重新初始化。

我错过了live可以向我解释这种行为的事实?

3 个答案:

答案 0 :(得分:1)

Live将会装备最干净的选择器。这是您的问题:will have the same ID as the div ...元素不能具有相同的ID,即无效的HTML。 .live()正在尝试根据ID进行操作,因为它应该是唯一且失败。

由于live()实际上存在于DOM级别,因此它必须具有可以通过冒泡来唯一地识别事件的东西,因为它是捕获事件的方式。当您指定应保证对多个元素唯一的内容时,您将会遇到不可预测的行为。

答案 1 :(得分:0)

jquery 1.3 live中的

只能连接到一个事件的一个选择器。你可以尝试这样的事情。尝试将它组合到一个事件或升级到1.4,如果你还没有:)

问候,乔

编辑:这样的事情?

$("#id").live("click", function(event) {
  if ($(this).is(":visible")) {
    $(panel).slideDown("fast");
  } else {
    $(panel).slideUp("fast");
  }
});

您可以使用相同的样式包含函数调用。

答案 2 :(得分:0)

我想我对这个问题有了一些了解。

panel定义为$('div[id="configure-filter"]')时,它会创建一个jQuery对象,该对象具有分配给它的唯一标识符。它在对象中定义为uniqueIduniqueNumber

刷新内容时,panel虽然页面上存在的uniqueId未映射到正确的panel,但这就是wireActionPanelv3 = function(panelSelector, context, fnDoThisOnShow, fnDoThisOnHide) { var panel = $(panelSelector, context); var id = $(panel).attr("id"); var showTrigger = $('#' + id + '.showTrigger'); var hideTrigger = $('#' + id + '.hideTrigger'); $(showTrigger).live('click', function(event) { panel = $(panelSelector, context); if (fnDoThisOnShow != null) fnDoThisOnShow(); $(panel).slideDown("fast"); return false; }); $(hideTrigger).live('click', function(event) { panel = $(panelSelector, context); if (fnDoThisOnHide != null) fnDoThisOnHide(); $(panel).slideUp("fast"); return false; }); }; 上的任何操作都无效的原因。 为了解决这个问题,你还应该在这种情况下刷新jQuery对象。

这是我必须做的代码更改......

wireActionPanelv3('div[id="configure-filter"]', controlContext, function() {
    ...blah blah ...
}, null);

我正在使用选择器重新初始化面板。

它被用作......

{{1}}

这里我只是将选择器作为字符串传递。

如果有人对此有更好的解释,请分享。