2013-07-04 55 views
0

我一直在一个名为$这对我的jQuery代码以提高效率变量缓存$(本),但是当我尝试引用$这个点击处理函数中它不工作;但是,使用$(this)呢。这里是我的代码,没有$(this)的缓存版本。缓存版本(这)不工作

$(function() { 
    var listNav = $('.row .listNav'), 
     listItem = listNav.find('li'), 
        $this = $(this); 

     listItem.click(function() { 

      listItem.removeClass('selected'); 
      $this.addClass('selected'); 
     }); 
}); 

如果我尝试创建的顶部变量列表中的变量,然后四个触动功能不起作用内引用它。

+1

请将其降至合理的最小值。我们没有理由阅读百行代码。 – zerkms

+0

我相信它会起作用,如果您从变量名称中删除$并且只是说'var this = $(this);' –

+0

@DavidScott:不,使用'$ this'没有任何问题,我一直都这样做。 – prodigitalson

回答

1

$(本)创建从它被称为当时的背景下一个jQuery对象。 this根据哪个点击处理程序被触发进行更改,因此将其缓存在代码的顶部将不会提供您想要的结果。

如果您需要访问不是一次或两次$(this)更多的处理器,它缓存在处理程序。

$this = $(this); // won't work because 'this' is different in the handler. 

    bullet.click(function() { 
     var $this = $(this); // Will work as it's defined in the right context 
     var bulletStr = $this.text(), 
      bulletNum = parseInt(bulletStr), 
      bulletMargin = slideWidth * bulletNum; 

     bullet.removeClass('active'); 
     $this.addClass('active'); 
     current = bulletNum; 
     if(current >= lastSlide) { 
      nextBtn.hide(); 
     } 
     else if(current < lastSlide) { 
      nextBtn.show(); 
     } 
     if(current > 0) { 
      prevBtn.show(); 
     } 
     else { 
      prevBtn.hide(); 
     } 
     sliderInner.animate({marginLeft: -bulletMargin}, 300, "easeInOutQuad"); 
     listItem.removeClass('selected'); 
     listItem.eq(bulletNum).addClass('selected'); 
    }); 
+0

这实际上令人惊讶的正确,为什么downvote? – Esailija

+0

不,该函数将有权访问其定义的范围。所以在处理程序外部定义的'$ this'也应该可以工作。 – prodigitalson

+0

不,'var $ this = $(this)'在处理函数之外绝对没有意义。 – Esailija

-2

尝试使用

listItem.click(function(data) 

代替

listItem.click(function() 
0

你是如何初始化的? 如果你这样做

$此= $(本);

它不能正常工作,becouse列表this包含范围你工作,而不是最终的clicks范围

你这样做

var that; // - without initing it 

,然后做

but.click = function(){ 
    that = $(this); 
} 
+0

但是在缓存它没有意义。 – Esailija

+0

为什么?如果您必须在点击处理程序中执行一些复杂的操作... –