为什么我不能在回调中引用我的jQuery对象?

时间:2011-11-25 10:17:03

标签: javascript jquery object click bind

我存储了一个jquery对象(一个html元素的集合),但是当我在另一个函数中引用该对象时,它返回为'undefined'!这是我的代码:

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 个答案:

答案 0 :(得分:4)

  

jquery对象何时不是对象?

从不。

  

当它未定义时!

或者当它不在您认为的位置时。

  

有没有人知道为什么会这样,因为它正在推动   我疯了,据我所知,这应该是不可能的。是   javascript坏了吗?!嗯,你觉得怎么样?

不,Javascript没有“破坏”。

您认为this.items总是指同一件事。它不是。在bind内,this是被点击的内容,而不是该回调函数之外的内容。

在你的回调中,你应该写$('#slide-menu').find('menu-item')而不是this.items

答案 1 :(得分:2)

这是一个范围问题。

点击事件处理程序之外的

this与处理程序内的this不同。在处理程序内部,它引用被单击的元素。在外面它可能是全局窗口对象。

这应该可以正常工作:

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

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

除非您确实需要,否则请勿在JavaScript中使用this