jQuery循环工作一次

时间:2013-06-21 13:34:35

标签: jquery html

我对我构建的循环有一个小问题。这是我第一次尝试使用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将立即动画到第一次单击功能中设置的高度,然后跳回到第二次单击功能中设置的高度。

如果我将它们分成两个不同的点击功能,则第二个功能不起作用。最令人困惑的是它工作一次,然后无法正常工作。有什么建议吗?

5 个答案:

答案 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 >');
});

作为旁注,以百分比和像素为单位设置动画值有时会导致问题。

FIDDLE

答案 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");
});