我在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
可以向我解释这种行为的事实?
答案 0 :(得分:1)
Live将会装备最干净的选择器。这是您的问题:will have the same ID as the div
...元素不能具有相同的ID,即无效的HTML。 .live()
正在尝试根据ID进行操作,因为它应该是唯一且失败。
由于live()
实际上存在于DOM级别,因此它必须具有可以通过冒泡来唯一地识别事件的东西,因为它是捕获事件的方式。当您指定应保证对多个元素唯一的内容时,您将会遇到不可预测的行为。
答案 1 :(得分:0)
只能连接到一个事件的一个选择器。你可以尝试这样的事情。尝试将它组合到一个事件或升级到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对象,该对象具有分配给它的唯一标识符。它在对象中定义为uniqueId
和uniqueNumber
。
刷新内容时,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}}
这里我只是将选择器作为字符串传递。
如果有人对此有更好的解释,请分享。