2013-09-27 118 views
2

我正在開發一個小遊戲,在這個遊戲中我需要每隔一段時間纔會發生一場災難。 此次災難必須動搖我的MainFrame元素&從類別.House,從構建數組和DOM中移除所有元素。設置jQuery刪除方法作爲動畫完成回調不起作用

此代碼在某種程度上起作用,問題在於它不會從DOM中刪除元素,只能從數組中刪除元素。 你能幫我搞定它嗎? 我第一次使用這個網站,所以我希望我沒有留下任何相關的東西。

setInterval(function() { 

    var iDisasterChance = getRandomNumber(1, 12); 

    if (iDisasterChance === 1) 
    { 
     $(".MainFrame").effect("shake", {times: 8}, 4000); 
     //$(".House").effect("explode", {pieces: 24}, 4000); 
     $(".House").effect("explode", {pieces: 24}, 4000, $(".House").remove); // TODO: bug - leaves elements in the dom 
     //$(".House").remove(); 
     oCity.aBuildings.length = 0; 
     console.log(iDisasterChance +' of 12'); 
     console.log('*** DISASTER ! AVOIDED ***'); 
     console.dir(oCity.aBuildings); 
     return false; 
    } 
    else 
    { 
     console.log(iDisasterChance +' of 12'); 
     console.log('*** DISASTER AVOIDED ***'); 
    } 
}, 10000); 
+1

作爲一個建議,請記住,您可以使用您的瀏覽器的控制檯(或者,優先考慮Firebug或類似的)添加**斷點**並逐步檢查代碼(即,line_line),以查看斷點。在這種線性代碼中特別「有用」。記得在開始的時候把它放在正確的位置,在這種情況下'var isDisasterChance = ...'! – Nico

回答

5

試試這種方法。您需要remove()而不是remove,並且在回調中,因爲您在remove方法中丟失了jquery對象的上下文。

$(".House").effect("explode", {pieces: 24}, 4000, function(){ 
    $(this).remove(); //now this will get executed once your animation effect is complete and this represents the .House where the effect happened. 
}); 

如果你想要remove所有.House那麼它一定是。

$(".House").effect("explode", 
           {pieces: 24}, 4000, 
           $(".House").remove.bind($(".House"))); //bind will set the context to that of .House. 

$(".House").effect("explode", {pieces: 24}, 4000,function(){ 
      $(".House").remove(); 
    }); 

原因是,當你做:

$(".House").effect("explode", {pieces: 24}, 4000, $(".House").remove)); 

OfCourse的remove方法將與上下文中的回調最可能的是,DOMelement,而不是jquery object的設置(正如你在正常回調中看到的那樣,你會得到this作爲DOM元素,並且它沒有jquery版本的remove 方法)。所以你可以使用function.bind綁定上下文或$.proxy或者只是在回調中執行。

+1

:downvoter照顧來解釋...... – PSL

+1

不是我的失望,但正如我所看到的,他試圖用'House'類去除所有元素。傳遞'$(「。House」)。remove'確實是這樣或者我在這裏錯過了什麼?他只是傳遞函數而不是創建一個額外的匿名函數。 –

+1

@MarcelGwerder ofcourse該函數在沒有上下文的情況下被執行,您將remove設置爲回調的引用,它不僅僅獲取'.House.'的上下文。 – PSL

-1

我不知道這個函數可以工作的確切上下文,但我注意到了有關代碼的兩件事。

  1. 的效果處理後的代碼,你有目前:$('.House').remove$('.House').remove()與支架,否則你只是在引用該法,而不是實際調用它。

  2. 您的if語句僅返回其兩種情況之一,我不確定您打算做什麼,但我相信您可能希望在else子句中有return true;

希望這些建議有所幫助。