2016-06-07 61 views
0

我有這個簡單的代碼,toggle是一個類的所有元素thumbnail除了一個點擊。然後在2秒後,應該添加或刪除特定的類以單擊元素,具體取決於它是否已被選中。函數不起作用 - (this)改變它的值

問題是與setTimeout(最有可能),因爲它不會跑我的功能,即通過if else檢查,如果點擊的元素應選擇或不選擇,然後添加/刪除selected-ser類。

$(document).ready(function(){ 
    $(".thumbnail").click(function(){ 
     $('.thumbnail').not(this).toggle(2000); 

     setTimeout(function() {    
      if ($(this).hasClass('selected-ser')) { 
       $(this).removeClass('selected-ser'); 
      } else { 
       $(this).addClass('selected-ser'); 
      } 
     }, 2000); 
    }); 
}); 

我真的試圖尋找類似的話題已經解決了,但我不明白這是行不通的方式(這可能是功能本身是錯的,但我不知道)

非常感謝。

編輯:它似乎 this主題地址相同的問題。之前我無法搜索它,因爲我不知道問題出在「this的擁有者」身上。因此,我將這個主題重命名爲「函數不起作用 - (這)改變了它的值。」因此,處理同樣問題的人更容易尋找它,不知道爲什麼功能不能正常工作。

謝謝

+0

你在控制檯中得到任何錯誤? –

+1

請創建一個jsfiddle。這個問題似乎與setTimeout裏面的setTimeout – brk

+0

在setTimeout函數內部回調中,'this'是指窗口對象。因此,使用閉包或設置相關的上下文,例如:'setTimeout(function(){/**/}.bind(this),2000);' –

回答

0

如果你使用一個變量來引用$(this)然後調用它裏面的setTimeout它會做你想做的。我加了一些CSS,所以你可以看到發生了什麼,但下面的例子將做你想要的東西:

$(document).ready(function() { 
 
    var $this = $(this); 
 
    $(".thumbnail").click(function() { 
 
    var $this = $(this); 
 

 
    function changeClass() { 
 
     $this.toggleClass('selected-ser'); 
 
    } 
 
    $('.thumbnail').not(this).toggle(2000); 
 

 
    setTimeout(function() { 
 
     changeClass(); 
 
    }, 2000); 
 
    }); 
 
});
.thumbnail { 
 
    border: solid; 
 
} 
 
.selected-ser { 
 
    background-color: green; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<div class="thumbnail"> 
 
    <p> 
 
    Content 
 
    </p> 
 
</div> 
 
<div class="thumbnail"> 
 
    <p> 
 
    Content 
 
    </p> 
 
</div> 
 
<div class="thumbnail"> 
 
    <p> 
 
    Content 
 
    </p> 
 
</div> 
 
<div class="thumbnail"> 
 
    <p> 
 
    Content 
 
    </p> 
 
</div>

0

$(document).ready(function(){ 
    $(".thumbnail").click(function(){ 
     $_this = $(this); 
     $('.thumbnail').not(this).toggle(2000); 

     setTimeout(function() {    
      if ($_this.hasClass('selected-ser')) { 
       $_this.removeClass('selected-ser'); 
      } else { 
       $_this.addClass('selected-ser'); 
      } 
     }, 2000); 
    }); 
}); 

不能使用$(this)到另一個事件/觸發器內訪問元素