【发布时间】:2015-12-16 18:06:41
【问题描述】:
我有一个展开/折叠块,我为此编写了一个函数:
function expandCollapse() {
var $btnShowHide = $('.btn-show-hide');
var $contentShowHide = $('.content-show-hide');
contentToggle();
$btnShowHide.each(function() {
$(this).on('click', function() {
var i = $btnShowHide.index(this);
$contentShowHide.eq(i).slideToggle('fast');
$contentShowHide.eq(i).toggleClass('collapsed');
if ($contentShowHide.eq(i).hasClass('collapsed')) {
$('.icon-show-hide', this).text('+');
} else {
$('.icon-show-hide', this).text('-');
}
});
});
function contentToggle() {
$contentShowHide.each(function() {
var i = $contentShowHide.index(this);
if ($(this).hasClass('collapsed')) {
$(this).hide();
$('.icon-show-hide', $btnShowHide.eq(i)).text('+');
} else {
$('.icon-show-hide', $btnShowHide.eq(i)).text('-');
}
});
}
}
我在$(document).ready 上调用此函数。这可以正常工作,但是当页面中执行 ajax 调用时会失败。所以,我查看了这个answer 并在ajax 成功时再次调用了该函数,但这使得行为很奇怪(例如,单击btn 一次将折叠并多次展开内容以单击一次)。关于如何解决这个问题的任何想法?
示例 HTML(一页上可能有多个):
<h3 class="btn-show-hide">
<span class="icon-show-hide"></span>
<span>Title</span>
</h3>
<div class="content-show-hide collapsed">
//Stuff
</div>
【问题讨论】:
-
您何时以及如何调用 expandCollapse()?你也可以发布 HTML 吗?)
-
@AdamJeffers on document.ready 和 ajax 成功。
-
查看我的回答,每次调用
expandCollapse时,您都会一遍又一遍地将同一个事件处理程序重新绑定到所有按钮。如果你真的不想改变你的代码结构,你可以事先打电话给off().... -
是否有理由将事件处理程序绑定在一个循环中?这被认为是不好的形式。考虑使用@Jasen 的使用委托的建议。
-
是的,您可以绑定到正文,但最好找到最近的静态父项。