Почему я не могу ссылаться на мой объект jQuery внутри обратного вызова? - PullRequest
1 голос
/ 25 ноября 2011

Я сохраняю объект jquery (набор html-элементов), но когда я ссылаюсь на объект в другой функции, он возвращается как «неопределенный»!Вот мой код:

this.container = $('#slide-menu'), // The menu container (e.g. a UL)
this.items = this.container.find('.menu-item'); // The menu items (e.g. all li's)
this.links = this.items.find('.link'); // The menu links

this.getCurrent(); // Set the current menu-item
this.getPrev(); // Set the previous menu-item
this.getNext(); // Set the next menu-item

console.log(this.items); // !!! The items exist here !!!

// Setup the menu items click events:
this.items.bind('click', function(e) {

    console.log(this.items); // !!! But not here !!! ???

    e.preventDefault();
    o = $(e.currentTarget); // Set jquery object

    if (!o.hasClass('active')) { // Prevent action on current menu-item
        this.items.find('.active').removeClass('active'); // Remove the current active menu-item
        o.addClass('active'); // Set new active menu item

Кто-нибудь знает, почему это происходит, потому что это сводит меня с ума, и, насколько я понимаю, это не должно быть возможным.Является ли JavaScript нарушен?Хм, а ты как думаешь?

Ответы [ 2 ]

4 голосов
/ 25 ноября 2011

Когда объект jquery не является объектом?

Никогда.

Когда оно не определено!

Или когда это не так, как вы думаете.

Кто-нибудь знает, почему это происходит, потому что это за рулем Я сумасшедший, и, насколько я понимаю, это не должно быть возможным. Является JavaScript не работает ?! Хм, а ты как думаешь?

Нет, Javascript не "сломан".

Вы предположили, что this.items всегда относится к одному и тому же. Это не. Внутри вашего bind, this находится то, на что нажимали, а не то, что находится вне этой функции обратного вызова.

Внутри обратного вызова вы должны написать $('#slide-menu').find('menu-item') вместо this.items.

2 голосов
/ 25 ноября 2011

Это проблема объема.

this вне вашего обработчика события щелчка не совпадает с this внутри обработчика. Внутри обработчика это относится к элементу, по которому щелкают. Снаружи это скорее всего глобальный оконный объект.

Это должно работать нормально:

var items = this.container.find('.menu-item');

items.bind('click', function(e) {
     console.log(items); 

Не используйте this в JavaScript, если вам не нужно.

...