我对我构建的循环有一个小问题。这是我第一次尝试使用jQuery构建循环。这是一个简单的阅读更多/更少的按钮。
我遇到的问题很奇怪。当页面首次加载时,它可以完美地工作,但在此之后的任何时候,它都会运行整个事情而不考虑更改ID。
HTML:
<div class="inner_container" id="tag_info"><?php?></div>
<a id="read_more">read more ></a>
jQuery的:
$('a#read_more').click(function() {
$('#tag_info').stop().animate({
height: '100%'
}, 500 );
$(this).text('< read less');
$(this).removeAttr('id');
$(this).attr('id', 'read_less');
$('a#read_less').click(function() {
$('#tag_info').stop().animate({
height: '50px'
}, 500 );
$(this).text('read more >');
$(this).removeAttr('id');
$(this).attr('id', 'read_more');
});
});
CSS:[锚定样式不必要]
#tag_info {
height: 50px;
overflow: hidden;
}
会发生什么(第一次之后的任何时间)div将立即动画到第一次单击功能中设置的高度,然后跳回到第二次单击功能中设置的高度。
如果我将它们分成两个不同的点击功能,则第二个功能不起作用。最令人困惑的是它工作一次,然后无法正常工作。有什么建议吗?
答案 0 :(得分:2)
如果要动态更改ID,请使用事件委派。
$('body').on('click','#read_more',function() {
$('#tag_info').stop().animate({
height: '100%'
}, 500 );
$(this).text('< read less').attr('id', 'read_less');
});
$('body').on('click','#read_less',function() {
$('#tag_info').stop().animate({
height: '50px'
}, 500 );
$(this).text('read more >').attr('id', 'read_more');
});
通过委托绑定发生绑定时存在于DOM中的静态父元素。它将处理从动态ID中冒出的事件。 Direct and Delegated Events
答案 1 :(得分:2)
我相信当你将一个事件绑定到一个元素时,无论你以后是否更改了id,该事件都绑定到该特定元素。
将其重写为切换或使用带有事件委派的jQuery on
代替:http://api.jquery.com/on/
答案 2 :(得分:2)
一个简单的切换功能应该:
$('#read_more').on('click', function() {
var state = $(this).text() == 'read more >';
$('#tag_info').stop().animate({
height: (state ? '100%' : '50px')}, 500 );
$(this).text(state ?'< read less' : 'read more >');
});
作为旁注,以百分比和像素为单位设置动画值有时会导致问题。
答案 3 :(得分:1)
Change your script as follows:
$('a#read_more').live("click",function() {
$('#tag_info').stop().animate({
height: '100%'
}, 500 );
$(this).text('< read less');
$(this).removeAttr('id');
$(this).attr('id', 'read_less');
$('a#read_less').live("click",function() {
$('#tag_info').stop().animate({
height: '50px'
}, 500 );
$(this).text('read more >');
$(this).removeAttr('id');
$(this).attr('id', 'read_more');
});
});
答案 4 :(得分:0)
您正在将Click处理程序中的另一个处理程序添加到同一个元素中,这会导致问题。
$('a#read_less').click(function () {
$('#tag_info').stop().animate({
height: '50px'
}, 500);
$(this).text('read more >');
$(this).removeAttr('id');
$(this).attr('id', 'read_more');
});
试试这个(http://jsfiddle.net/balintbako/nc5Dp/):
$('#read_more').click(function () {
if ($(this).hasClass("more")) {
$('#tag_info').stop().animate({
height: '100%'
}, 500);
$(this).text('< read less');
} else {
$('#tag_info').stop().animate({
height: '50px'
}, 500);
$(this).text('read more >');
}
$(this).toggleClass("more");
});