2016-12-26 64 views
-1

每張卡的類名都是「card player1card ________」或「card player2card _______」,其中空格是從cardnames數組分配的隨機類名。for循環類名稱中的「If語句」undefined

我想要代碼檢查所有卡,併爲那些是player1card他們的班級更改爲「card player1card」,然後從cardnames數組更新的類,併爲player2card相同。

所有變量都已預先定義。

我得到的錯誤「遺漏的類型錯誤:無法設置屬性未定義‘類名’」

var cardsnames = ["recruitbuilder", "allwood", "cabin", "messhall", "mast", "captainsquarters", "schooner", "brig", "frigate", "shipballista", "ram", "crowsnest", "spoondrill", "reinforcements", "recruitgunman", "allgunpowder", "firebarrel", "fireship", "roundshot", "heavyshot", "swivelgun", "chainshot", "mortar", "barrage", "resupply", "smuggler", "blockade", "mutiny", "recruitmerchant", "allgold", "addwood", "addgunpowder", "addgold", "removewood", "removegunpowder", "removegold", "byzantinefire", "slaves", "mercenaries", "ironplating", "coercion", "ascension"]; 

var w; 
var allocatedcard; 
var card = document.getElementsByClassName("card"); 

for (w = 0; w < card.length; w++) { 
    if (document.getElementsByClassName("card")[w].className.match('player1card')) { 
     this.className = "card player1card"; 
     var allocatedcard = Math.floor(Math.random() * cardsnames.length); 
     this.className += " " + cardsnames[allocatedcard]; 
     updateimages();    
    } else if (document.getElementsByClassName("card")[w].className.match('player2card')) { 
     this.className = "card player2card"; 
     var allocatedcard = Math.floor(Math.random() * cardsnames.length); 
     this.className += " " + cardsnames[allocatedcard]; 
     updateimages();  
    } 
} 
+0

爲什麼你在循環中再次獲取?只需使用'card [w] .className'。另外我會建議'card [w] .classList.indexOf('player1card')' – Rajesh

+0

對不起,Rajesh,我不是最有經驗的Javascript,能否詳細解釋一下 – evilgenious448

+0

'document.getElementsByClassName'返回給你一個列表保存在'card'中。你想訪問它中的一個元素。所以理想的方法是從存儲列表訪問,而不是一次又一次地獲取列表。 DOM交互非常昂貴,您應該將其保持在最低限度。同樣''classList''會返回一個'DOMTokenList'(一個類似於結構的數組),你可以很容易地搜索它。它比字符串匹配更好(* className.match *) – Rajesh

回答

0

只爲背景,在問題的代碼將是另一個函數中的一個函數。因此,我這樣做:

var recruitbuilder = document.getElementsByClassName('recruitbuilder'); 
var f; 
var className = ""; 
var cardsnames = ["recruitbuilder", "allwood", "cabin", "messhall", "mast", "captainsquarters", "schooner", "brig", "frigate", "shipballista", "ram", "crowsnest", "spoondrill", "reinforcements", "recruitgunman", "allgunpowder", "firebarrel", "fireship", "roundshot", "heavyshot", "swivelgun", "chainshot", "mortar", "barrage", "resupply", "smuggler", "blockade", "mutiny", "recruitmerchant", "allgold", "addwood", "addgunpowder", "addgold", "removewood", "removegunpowder", "removegold", "byzantinefire", "slaves", "mercenaries", "ironplating", "coercion", "ascension"]; 
var allocatedcard = cardsnames[Math.floor(Math.random() * cardsnames.length)]; 

for (f = 0; f < recruitbuilder.length; f++) { 
    recruitbuilder[f].onclick = function() { 
     recruitbuilderfunc(p1); 
     displayvaluesp1(p1); 
     if (this.classList.contains('player1card') == true) { 
      className = "player1card"; 
     } else if (this.classList.contains('player2card') == true) { 
      className = "player2card"; 
     } 
     //this.className += " " + cardsnames[allocatedcard]; 

     this.className = "card " + className + " " + allocatedcard; 
     updateimages(); 
    } 
}