Использование «$ (this)» в функции - PullRequest
11 голосов
/ 03 февраля 2012

Я создаю меню, которое открывается и закрывается с помощью jQuery. Проще говоря, это работает так:

function open_menu() {
    $(this).next('ul.sub-menu').css('display', 'block').stop(true, false).animate({
        width: '235px',
    }, 500);
}

function close_menu() {
    // close code here
}

status = 'closed'; // set the default menu status

$('a').click(function() {
    switch(status) {
        case 'closed':
            open_menu();
            break;
        case 'open':
            close_menu();
            break;
    }
}

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

Есть ли что-то, что я могу сделать, чтобы селектор $(this) договорился о том, что его вызвало, оставив его в open_menu()?

Ответы [ 3 ]

21 голосов
/ 03 февраля 2012

this, на который вы ссылаетесь в open_menu, является контекстом функции open_menu, а не обработчиком щелчка ссылки.Вам нужно сделать что-то вроде этого:

open_menu(this);

function open_menu(that) {
    $(that).next(...
5 голосов
/ 03 февраля 2012

Вы можете использовать apply, чтобы установить значение this в функции.

open_menu.apply(this)
3 голосов
/ 03 февраля 2012

Почему бы просто не передать его в качестве параметра?

function open_menu($this) {
    $this.next('ul.sub-menu').css('display', 'block').stop(true, false).animate({
        width: '235px',
    }, 500);
}

function close_menu() {
    // close code here
}

status = 'closed'; // set the default menu status

$('a').click(function() {
    switch(status) {
        case 'closed':
            open_menu($(this));
            break;
        case 'open':
            close_menu();
            break;
    }
}
...