当有多个元素被淡化时,回调函数.fadeOut()
并不会像您期望的那样工作。.fadeIn()
回调不仅被调用一次,而且对每个元素都被调用。
如果您console.log()
在其中一个.fadeOut()
回调中调用,您会看到它被记录了多次。(Chrome 开发者工具将其折叠成一个日志条目,左侧有一个数字。)
http://jqapi.com/#p=fadeOut
回调函数
如果提供,则在动画完成后触发回调。这对于将不同的动画按顺序串在一起很有用。回调没有发送任何参数,但它被设置为动画的 DOM 元素。如果为多个元素设置了动画,请务必注意,每个匹配的元素都会执行一次回调,而不是对整个动画执行一次。
从 jQuery 1.6 开始,.promise() 方法可以与 deferred.done() 方法结合使用,以便在所有匹配元素都完成动画时对整个动画执行单个回调(参见 .promise 示例())。
这是.promise()
用于删除重复回调的代码版本。它还结合了 j08691 的建议,即从 fadeOut 中排除您将要淡入的元素:
var groups = {
Adventure: '.adv',
Puzzle: '.puz',
Shooter: '.sho',
All: 'div'
};
function fade( group ) {
$('#games div')
.not(group)
.fadeOut()
.promise()
.done( function() {
console.log( group );
$('#games ' + group).fadeIn();
});
}
$('input[name$="group1"]').click(function () {
fade( groups[ $(this).val() ] );
});
通过将重复的代码合并到一个函数中,此代码也大大简化了原始代码。最后,我离开了 console.log() 来查看正在进行的调用。
还有一些关于 HTML 的评论:除非您正在编写 XHTML,否则您不需要使用<br />
,我希望您没有这样做。<br>
很好。更重要的是,您应该<label>
在单选按钮标签上使用标签,以便整个标签都是可点击的:
<label><input type="radio" name="group1" value="All" checked>Show All</label><br>
<label><input type="radio" name="group1" value="Adventure">Adventure</label><br>
<label><input type="radio" name="group1" value="Puzzle">Puzzle</label><br>
<label><input type="radio" name="group1" value="Shooter">Shooter</label>
这是一个更新的 jsfiddle。
这里还有其他简化的机会。单选按钮中的属性是否要求value
为特定字符串“All”、“Adventure”等?如果没有,您可以简单地将组选择器直接放在value
属性中:
<label><input type="radio" name="group1" value="div" checked>Show All</label><br>
<label><input type="radio" name="group1" value=".adv">Adventure</label><br>
<label><input type="radio" name="group1" value=".puz">Puzzle</label><br>
<label><input type="radio" name="group1" value=".sho">Shooter</label>
然后将 JavaScript 代码简化为:
function fade( group ) {
$('#games div')
.not(group)
.fadeOut()
.promise()
.done( function() {
console.log( group );
$('#games ' + group).fadeIn();
});
}
$('input[name$="group1"]').click(function () {
fade( $(this).val() );
});
最新的 jsfiddle
另一个更新...正如 Alex 在评论中指出的那样,当您在 Show All 和特定类型之间来回单击时,此版本的代码会导致块跳来跳去。
这是由代码中的这一行引起的:
.not(group)
删除该行可以提供更平滑的过渡,如更新后的 jsfiddle所示。