jquery: что именно означает «$ (this)»? - PullRequest
15 голосов
/ 19 июля 2011

У меня есть программа, и она работает хорошо. Смотри ЗДЕСЬ .

Это код:

<div id="round"></div>

<style>
#round{
position: absolute;
width: 200px;
height: 200px;
border-radius: 50%;
left: 400px;
top: 200px;
background-color: #e1e1e1;
}
</style>

<script src="jquery.js"></script>
<script src="jquery.easing.1.3.js"></script>
<script>
$(document).ready(function(){
    $("#round").click(function(){
        setInterval(function(){
            $("#round").animate(
                {height: 250,
                width: 150,
                top:150,
                left: 425},
                {duration: 300}
                ).
            animate(
                {height: 200,
                width: 200,
                top:200,
                left: 400},
                {duration: 300}
            );
        }, 0);
    });
});
</script>

Но когда я меняю "#round" на "this". Это не сработает. Зачем? (на самом деле это работает, но когда я помещаю их в setInterval (), это не будет работать)

$(document).ready(function(){
    $("#round").click(function(){
        setInterval(function(){
            $("#round").animate(
                {height: 250,
                width: 150,
                top:150,
                left: 425},
                {duration: 300}
                ).
            animate(
                {height: 200,
                width: 200,
                top:200,
                left: 400},
                {duration: 300}
            );
        }, 0);
    });
});

изменить на "это", это не будет работать.

$(document).ready(function(){
    $("#round").click(function(){
        setInterval(function(){
            $(this).animate(
                {height: 250,
                width: 150,
                top:150,
                left: 425},
                {duration: 300}
                ).
            animate(
                {height: 200,
                width: 200,
                top:200,
                left: 400},
                {duration: 300}
            );
        }, 0);
    });
});

Ответы [ 6 ]

22 голосов
/ 19 июля 2011

this является ссылкой на член, который вызывает текущую функцию ...

, затем вы можете обернуть его в функции jquery $(), чтобы выбрать его так же, как и другой селектор.

Таким образом, setInterval вызывает анонимную функцию, поэтому она не вызывается ссылочным членом, поэтому по умолчанию используется объект window.

сохранить контекст this в переменной, а затем использовать его внутри, как это ...

$(document).ready(function(){
    $("#round").click(function(){
        var clicked = this;   //<----store the click context outside setInterval
        setInterval(function(){
            $(clicked).animate(  //<----------use it here
                {height: 250,
                width: 150,
                top:150,
                left: 425},
                {duration: 300}
                ).
            animate(
                {height: 200,
                width: 200,
                top:200,
                left: 400},
                {duration: 300}
            );
        }, 0);
    });
});
6 голосов
/ 19 июля 2011

Внутри функции события, связанной с jQuery, this относится к текущему элементу DOM из коллекции, над которой выполняется операция. Поскольку это элемент DOM, передача его в jQ, например $( this ), делает его коллекцией jQuery, чтобы вы могли делать с ней больше jQuery.

Однако в своем измененном нерабочем коде вы переместили его в новую анонимную функцию. Внутри этой функции , this теперь относится к новой области действия.

Вам нужно получить ссылку на this перед вашей функцией:

$(document).ready(function(){
    $("#round").click(function(){
        var jQuerizedElement = $( this );
        setInterval(function(){
            jQuerizedElement.animate(
                {height: 250,
                width: 150,
                top:150,
                left: 425},
                {duration: 300}
                ).
            animate(
                {height: 200,
                width: 200,
                top:200,
                left: 400},
                {duration: 300}
            );
        }, 0);
    });
});
3 голосов
/ 19 июля 2011

$(this) зависит от контекста. Для каждой [анонимной, в данном случае] функции, которую вы вводите, значение $(this) изменяется. Например:

$('#round').click(function(){
    alert($(this).attr('id')) // alerts round
    setInterval(function(){
        alert($(this).attr('id')) // alerts undefined
    });
});
1 голос
/ 19 июля 2011

это в основном связано с контекстом.Когда вы говорите $ (this), если это элемент dom, вы получите объект jquery, связанный с этим элементом dom.

1 голос
/ 19 июля 2011

Поскольку вы используете функцию обратного вызова, которая вызывается setInterval в другом контексте ...

Вы можете справиться с этим, скопировав this в другую переменную, например:

var that = this:

и на обратный вызов

$(that).animate...
0 голосов
/ 25 октября 2016

Если я хорошо понимаю, кажется, что $(this) - это просто узел , который был triggerd .

Например, когда у вас есть событие click на кнопке .В обратном вызове события вы можете использовать $ (this), который представляет узел кнопки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...