1

所以我有一個「關聯數組」的數組,即。對象,保持各種HTML元素的數據和一個其它參數,如下所示:獲取Javascript中關聯數組的數組索引

container[0] = { picker_canvas: document.getElementById("background_picker"), 
       color_canvas: document.getElementById("background_color"), 
       hex_text: document.getElementById("background_text"), 
       mouse_down: false }; 

container[1] = { picker_canvas: document.getElementById("textbox_picker"), 
       color_canvas: document.getElementById("textbox_color"), 
       hex_text: document.getElementById("textbox_text"), 
       mouse_down: false }; 

container[2] = { picker_canvas: document.getElementById("font_picker"), 
       color_canvas: document.getElementById("font_color"), 
       hex_text: document.getElementById("font_text"), 
       mouse_down: false }; 

每個容器有一個顏色選擇器畫布,顏色預覽帆布,顯示的十六進制顏色值的文本框的引用,並一個mouse_down布爾值。後來我通過這樣的容器迭代初始化幾個事件偵聽器:

for (i=0; i<3; i++) { 

    container[i].picker_canvas.addEventListener("mousedown", function() { 
     container[i].mouse_down = true; 
    }, false); 

    container[i].picker_canvas.addEventListener("mouseup", function() { 
     container[i].mouse_down = false; 
    }, false); 

    container[i].picker_canvas.addEventListener("mousemove", function(evt) { 
     getColor(container[i], evt); 
    }, false); 

    container[i].hex_text.addEventListener("change", function(evt) { 
     drawColorSquare(container[i], evt.target.value) 
    }, false); 

} 

但是,這並不工作,因爲我是不確定的,所以現在我正在試圖做這樣的事情,以獲得正確的索引,但我不知道如何真正實現它在JavaScript

container[i].picker_canvas.addEventListener("mousedown", function(evt) { 
    container[container.indexof(evt.target)].mouse_down = false; 
}, false); 

基本上我需要搜索evt.target關聯數組的數組,並使其返回數組的索引。所以,這甚至可能與任何內置的JavaScript函數或將我只需要自己做?

+0

就這麼你知道,Javscript不支持關聯數組,它將它們作爲對象來處理,所以你的術語是不正確的。 – 2012-07-13 19:58:56

+0

亞歷克斯是對的;那些不是「聯合陣列」。你實際上有一個對象數組。 「picker_canvas」等是這些對象的屬性。 – 2012-07-13 20:00:39

+0

另外,可能有比我回答的更好的解決方案 - 我們能否看到您的HTML結構? – Ryan 2012-07-13 20:15:36

回答

6

因爲它似乎你不必擔心Internet Explorer 8和更早版本,使用forEach

container.forEach(function(x) { 
    x.picker_canvas.addEventListener("mousedown", function() { 
     x.mouse_down = true; 
    }, false); 

    x.picker_canvas.addEventListener("mouseup", function() { 
     x.mouse_down = false; 
    }, false); 

    x.picker_canvas.addEventListener("mousemove", function(evt) { 
     getColor(x, evt); 
    }, false); 

    x.hex_text.addEventListener("change", function(evt) { 
     drawColorSquare(x, evt.target.value) 
    }, false); 
}); 
+0

'.forEach'會更合適 – Esailija 2012-07-13 20:01:17

+0

模擬點與'.addEventListener':P您的評論只是聽起來不對「如果你不必擔心ie8」當有.addEventListener遍地都是:D – Esailija 2012-07-13 20:03:00

+0

@Esailija:我不會推薦它。在IE方面,它在版本9之前不可用。 – 2012-07-13 20:03:09

0

因爲我們沒有在這裏支持IE8,我們可以全力以赴:

container.forEach(function(x) { 
    x.handleEvent = function(e) { //This is stupid, wish I had the time to refactor the code to use prototypes 
     switch (e.type) { 
     case "mousedown": 
      this.mouse_down = true; 
      break; 
     case "mouseup": 
      this.mouse_down = false; 
      break; 
     case "mousemove": 
      getColor(this, e); 
      break; 
     case "change": 
      drawColorSquare(this, e.currentTarget.value); 
      break; 
     } 
    }; 
    var canvas = x.picker_canvas; 
    canvas.addEventListener("mousedown", x, false); 
    canvas.addEventListener("mouseup", x, false); 
    canvas.addEventListener("mousemove", x, false); 
    x.hex_text.addEventListener("change", x, false); 
}); 
+0

您是否想要在那裏傳遞'x.handleEvent'?另外,爲什麼兩個循環...? – Ryan 2012-07-13 20:16:39

+0

@minitech查看評論。 ['x.handleEvent'](http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener)是神奇的,我的意思是確實傳遞對象。否則'這''不會像我使用它的方式工作。 – Esailija 2012-07-13 20:17:11

+0

哦,對了,忘了>。<仍然...爲什麼兩個循環? – Ryan 2012-07-13 20:17:55