2013-07-31 39 views
8

Tôi có một mảng các đối tượng (đặc biệt easelJS hình ảnh) - một cái gì đó như thế này:Làm thế nào để thêm người nghe sự kiện vào một mảng của các đối tượng

Những gì tôi muốn làm là có một người biết lắng nghe sự kiện thay vì:

gShape.addEventListener("click", function() {alert"stuff"}); 

tôi muốn các chương trình để biết cụ thể khu vực được nhấp để tôi có thể gửi một hộp cảnh báo theo cách sau:

imageArray[index].addEventListener("click", function(){ 
    alert " you clicked region number " + index} 
+0

Bạn muốn gì khác với những gì bạn có? –

+0

Nó sẽ hoạt động .. Bạn đã thử chưa? – putvande

+0

@Jeffman Có vẻ như trong vòng lặp, trong đó 'chỉ mục' sẽ không chính xác trong cuộc gọi lại – Ian

Trả lời

7

Something như thế này nên làm việc:

for (var i = 0 ; i < imageArray.length ; ++i) { 
    function(index) { 
     imageArray[index].addEventListener("click", function() { 
      alert ("You clicked region number: " + index"); 
     }); 
    } (i); 
} 

Lý do nó hoạt động là bởi vì nó tạo ra một kết thúc mà giữ giá trị của index sẽ được hiển thị trong tin nhắn cảnh báo. Mỗi lần thông qua vòng lặp tạo một kết thúc khác giữ một giá trị khác là index.

+0

Bất kỳ ai biết tại sao tôi đã được downvoted? Chỉ cần tự hỏi. –

+1

Ai đó có thể không kiểm tra dấu thời gian và nghĩ rằng bạn đã sao chép câu trả lời ở trên. –

8

Chắc chắn. Bạn chỉ có thể sử dụng một đóng cửa để lưu chỉ mục của lần lặp đó. Nếu không thì sẽ được chia sẻ bởi cùng một phạm vi chức năng và sẽ cho bạn giá trị của cùng một lần lặp. Tạo một hàm riêng biệt cho mỗi hàm sẽ lưu trạng thái của hàm đó bên trong hàm.

var imageArray = new Array; 
gShape = new createjs.Shape(); 
// shape is something 
imageArray.push(gShape); // Dumped all the objects 

for(var i=0; i< immageArray.length; i++) { 
    (function(index) { 
     imageArray[index].addEventListener("click", function() { 
      console.log("you clicked region number " + index); 
     }) 
    })(i); 
} 

hoặc tốt hơn

for(var i=0; i< immageArray.length; i++) { 
     imageArray[i].addEventListener("click", bindClick(i)); 
} 

function bindClick(i) { 
    return function(){ 
      console.log("you clicked region number " + i); 
      }; 
} 
+1

Bạn được hoan nghênh làm bất cứ điều gì, nhưng tôi sẽ loại bỏ ví dụ đầu tiên. Không chỉ là những gì các câu trả lời khác có, tôi không nghĩ rằng nó thực sự nên được sử dụng khi bạn có thể sử dụng một cái gì đó sạch hơn và hiệu quả hơn như ví dụ thứ hai của bạn – Ian

+4

@Ian .. Tôi đồng ý với bạn .. Nhưng có thể có trường hợp khi người dùng có thể không hiểu nó thực sự hoạt động như thế nào, trừ khi có một ví dụ dài dòng. Đó là lý do tôi bỏ ví dụ đầu tiên để họ có thể so sánh cách ví dụ thứ nhất có thể được viết một cách rõ ràng hơn –

+0

Thanks @ Sushanth- - - Cuối cùng tôi kết thúc những tình huống "nâng lambda" này trước đây và thường có thể làm việc tốt hơn, nhưng thật tốt khi thấy hai bên cạnh nhau. – phatskat

1

Chắc chắn, một đóng cửa là giải pháp, nhưng vì anh ấy có Ext nạp ông cũng có thể sử dụng nó và nhận được một số mã rất dễ đọc. Chỉ mục được chuyển làm đối số thứ hai cho số Ext.Array.each (được đặt tên là Ext.each).

Ext.each(imageArray, function(gShape, index) { 
    gShape.addEventListener("click", function() { 
     alert("You clicked region number " + index); 
    }); 
}); 
0

Đây là những gì tôi đang sử dụng cho div id của:

var array = ['all', 'what', 'you', 'want']; 

function fName() { 
    for (var i = 0; i < array.length; i++) 
    document.getElementById(array[i]).addEventListener('click', eventFunction); 
}; 

Good Luck!

Các vấn đề liên quan