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