2015-09-23 38 views
0

我正在開發RPG遊戲作爲愛好和學習語言的方式。現在正在處理庫存。操作DOM時無法獲取對象方法

我正在使用Jquery UI構建模態對話框。當涉及到庫存時,我有兩個主要對話框:一個顯示角色細節,一個顯示玩家訪問的城市細節。這兩個對話框都包含具有不同ID的div,但是class =「bagpack」。其目的是通過按課程分配div並在不利用div id的情況下操作它們(節省一些代碼並增加更多靈活性)來反映播放器bagpack中的當前項目。

當涉及到庫存項目時,我通過.push(新劍)將對象構造函數和push元素放入相關庫存數組中。每個項目都有一些方法,即點擊,鼠標懸停,鼠標懸停 - 這對我所面臨的問題至關重要。

因此,當用戶打開城市對話框或角色詳細信息對話框時,將調用gameConfig.inventory.draw('bagpack'),並根據哪些對象位於bagpack數組中,來重繪div .bagpack。 DOM會相應地進行調整,但玩家只能在他正在查看的模式對話框中看到效果。

下面是代碼:

inventory: { //object within an object 

    market: [], 
    bagpack: [], 
    active: [], 
    arrows: [], 

    draw: function(inventoryArray, itemType){ 

    $('.'+inventoryArray).empty(); 

     gameConfig.inventory[inventoryArray].sort(function(a, b){ //sort array alphabetically 
      var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase() 
      if (nameA < nameB) //sort string ascending 
       return -1 
       if (nameA > nameB) 
        return 1 
        return 0 //default return value (no sorting) 
     });  

     if (itemType === undefined){ //array items will not be filtered 
      for(i=0; i<gameConfig.inventory[inventoryArray].length; i++) { 
       var item = gameConfig.inventory[inventoryArray][i]; 
       item.div = $("<div/>"); 
       item.div.addClass("inventoryItem"); 
       item.div.css({"background-color": item.backgroundColor});   
       item.div.css({"background-image":"url('"+item.icon+"')"}); 
       item.div.get(0).obj = item; //link DOM elemnt to an object 
       item.div.click(function(){ 
        this.obj.clicked(); 
       }); 
       item.div.mouseover(function() { 
        this.obj.getInfo(); 
       }); 
       item.div.mouseout(function() { 
        this.obj.mouseLeft(); 
       }); 

       item.div.appendTo('.'+inventoryArray); 
      } 


     } else { //array items will be filtered 



     } 


    } 


} 

什麼情況是:

  1. 我得到物品申報單(背景圖像,顏色等),同時顯示在模態對話框,這
  2. 周圍沒有問題
  3. 現在,談到方法時,我面對奇怪的行爲。目前看來,在一個模態對話框方法的工作,而在另一個模式對話框中遇到了以下錯誤:遺漏的類型錯誤:無法讀取的不確定

財產「mouseLeft」我並不完全明白髮生了什麼,以及爲什麼在在數組中找到的一個個案對象處理正常,在另一種情況下,它們的方法會丟失。

+1

處理的錯誤意味着'this.obj'是未定義的。我建議使用'console.log(this)'並檢查它看看發生了什麼 – Oriol

+0

@Oriol事實上,在一種情況下this.obj返回一個對象(在方法工作的情況下),而在另一種情況下,它會導致未定義(當methodos不工作)。所以有一個問題鏈接到一個對象的div? – Vadimster

+0

在您的開發控制檯中檢查:gameConfig.inventory [inventoryArray] .. 此外,您可能會發現item.div.data('obj',item)更適合將對象鏈接到元素。 – Clay

回答

0

感謝Clayton Smith,問題解決了。

我做了一個蹩腳的方式存儲在.obj中,現在使用了一種合適的方式。此代碼解決了它:

對象的
item.div.data('obj', item); 
item.div.click(function(){ 
    $(this).data('obj').clicked(); 

}); 

方法現在被正確地在多個位置中DOM