为什么这是错的? (在jQuery中使用“this”)

时间:2009-01-06 03:00:45

标签: javascript jquery

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js"></script>
<script type="text/javascript">

        function bigtosmalltriangle() {
            $(this).siblings("div.break").removeClass('triangle3').addClass('triangle1');
            setTimeout ( "smalltomediumtriangle()", 400 );
        }
        function smalltomediumtriangle() {
            $(this).siblings("div.break").removeClass('triangle1').addClass('triangle2');
            setTimeout ( "mediumtobigtriangle()", 400 );
        }
        function mediumtobigtriangle() {
            $(this).siblings("div.break").removeClass('triangle2').addClass('triangle3');
            setTimeout ( "bigtosmalltriangle()", 400 );
        }

    $(function() {
        $("span#clickhere").click(
            function() {
                /* do a lot stuff here */ bigtosmalltriangle();
                $(this).hide();
            }
        );
    });
</script>

<style type="text/css">
    .triangle1 {background:#000;}
    .triangle2 {background:red;}
    .triangle3 {background:white;}
</style>

<div><div class="break">Hello World</div><span id="clickhere">asdf</span></div>

我正试图让div.break滚动浏览3个bgcolors,但是当我点击跨度时它没有任何效果。有谁知道我应该做什么?

感谢。

2 个答案:

答案 0 :(得分:3)

您希望使用特定的“this”调用您的函数。我问了一个类似的问题:Call function with "this"

$(function() {
        $("span#clickhere").click(
                function() {
                        /* do a lot stuff here */
                        bigtosmalltriangle.call(this);
                        $(this).hide();
                }
        );
});

我认为由于闭包(参见Matthew Crumley的回答),回调函数本身不需要修改,因为setTimeout保持“范围”。我不知道Javascript足以远程保证这一点。如果我错了,只需为回调函数执行.call(this)技巧。

答案 1 :(得分:2)

问题在于“this”不受你在bigtosmalltriangle,smalltomediumtriangle和mediumtobigtriangle函数中点击的范围的约束。您需要将元素作为参数传入,或者通过闭包设置所有函数的范围内的变量。

参数传递:

function bigtosmalltriangle(elements) {
    elements.removeClass('triangle3').addClass('triangle1');
    setTimeout(function() { smalltomediumtriangle(elements); }, 400);
}
function smalltomediumtriangle(elements) {
    elements.removeClass('triangle1').addClass('triangle2');
    setTimeout(function() { mediumtobigtriangle(elements); }, 400);
}
function mediumtobigtriangle(elements) {
    elements.removeClass('triangle2').addClass('triangle3');
    setTimeout(function() { bigtosmalltriangle(elements); }, 400);
}

$(function() {
    $("span#clickhere").click(
        function() {
            /* do a lot stuff here */
            bigtosmalltriangle($(this).siblings("div.break"));
            $(this).hide();
        }
    );
});

瓶盖:

$(function() {
    $("span#clickhere").click(
        function() {
            var elements = $(this).siblings("div.break");

            function bigtosmalltriangle() {
                elements.removeClass('triangle3').addClass('triangle1');
                setTimeout(smalltomediumtriangle, 400);
            }
            function smalltomediumtriangle() {
                elements.removeClass('triangle1').addClass('triangle2');
                setTimeout(mediumtobigtriangle, 400);
            }
            function mediumtobigtriangle() {
                elements.removeClass('triangle2').addClass('triangle3');
                setTimeout(bigtosmalltriangle, 400);
            }

            /* do a lot stuff here */
            bigtosmalltriangle();
            $(this).hide();
        }
    );
});