2012-12-07 23 views
7

Tôi đang cố thêm một trình xử lý sự kiện vào tất cả các phần tử với một lớp phần, tuy nhiên nó chỉ áp dụng nó cho đối tượng cuối cùng trong danh sách nút.addEventHandler vào mọi phần tử trong một lớp

var section = document.querySelectorAll('.section'); 
for(var i=0;i<section.length;i++){ 
var elem = section[i]; 
elem.addEventListener('click', function() {move (elem)}, false); 
} 

Có cách nào để tôi có thể thêm trình xử lý sự kiện cho từng người không?

+4

Xem http: // stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example cho câu trả lời chung. – pimvdb

Trả lời

5

Vấn đề là không có phạm vi chặn trong JavaScript. Vì vậy, elem được ghi đè mỗi lần lặp, thay vì được khai báo dưới dạng biến mới mỗi lần. Cách duy nhất để khai báo các biến mới trong mỗi lần lặp là thông qua một chức năng:

for(var i = 0; i < section.length; i++){ 
    (function(elem) { 
    elem.addEventListener('click', function() { move(elem); }, false); 
    })(elem); 
} 

Nhưng addEventListener bộ this đến yếu tố, do đó, trong trường hợp của bạn, bạn có thể làm gọn gàng:

for(var i = 0; i < section.length; i++){ 
    elem.addEventListener('click', function() { move(this); }, false); 
} 
1

đó là vì bạn đang tham chiếu elemi bên trong hàm. Tôi có thể đề xuất thử

var section = document.querySelectorAll('.section'); 
for(var i=0;i<section.length;i++){ 
    var handler = (function(ind){ 
     return function() { 
      move (section[ind]); 
     } 
    })(i) 

    elem.addEventListener('click', handler, false); 
} 
+1

Điều này cũng sẽ thất bại vì 'i' được khai báo trong cùng phạm vi. – pimvdb

+0

có, đó là cần thiết để được cố định. Tôi sẽ nghĩ về nó – Eugeny89

+1

Trong trường hợp này bạn chỉ có thể làm 'di chuyển (điều này)'. – pimvdb

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