【发布时间】:2012-10-06 12:16:22
【问题描述】:
终于,我有了解决办法,但还是有点小问题。
我有这份清单
<ul id="tricky_list">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ul>
我想只显示前 3(三)个元素,并在鼠标悬停时显示剩余的两个元素
var limit = 3;
var list = $("#tricky_list");
var more = 0;
function tricky_hide(){
var morec = 0;
$("li", list).each(function(index) {
if (index >= limit) {
$(this).hide();
morec = index - limit + 1;
}
});
if (!more) more = morec;
if (more) {
list.append('<li class="more">' + more + ' more</li>');
return true;
}
return true;
}
if (tricky_hide()) {
list.live("mouseover", function() {
$("li", list).each(function(index) {
$(this).show();
});
$("li.more", list).hide();
});
list.live("mouseout", function() {
tricky_hide();
});
}
它工作得很好,但我需要一些澄清。 我有这个功能
if (more) {
list.append('<li class="more">' + more + ' more</li>');
return true;
}
在 mouseout 事件上也附加 <li class="more">。如果我在这个元素上“mouseover”和“mouseout”无限次,它会在我的 html 文档中无限写入<li class="more">。
如何防止这种情况?我怎样才能只附加一次(在页面加载时,即)这个元素?
谢谢大家!
【问题讨论】:
-
more不是布尔值。如果你想要干净的代码,它应该是。 -
@Rune 再看一遍。他正在使用
more来存储索引。 -
@Rune 在 JS 中检查非布尔值的真假是很常见的。
-
@m90 当然是,但我猜他指的是使用 1/0 代替真/假,这是一种不好的做法。但在这种情况下,
more用于存储整数。 -
@m90 正如马库斯所说,我指的是不良实践部分。我总是追求可读性和简洁的代码,这对我来说是一种强迫症,所以我总是使用 bool 和 bool 仅用于真/假检查。我认为每个人都应该这样做,因为它确实有助于提高可读性。
标签: jquery loops html-lists append