2012-02-29 34 views
8

Tôi có một vấn đềcủa router RangeError: kích thước gọi stack tối đa vượt quá, Javascript

open: function($type) { 
      //Some code 
      document.getElementById($type).addEventListener("click", l.close($type), false); 
    }, 
    close: function($type) { 
      //There is some code too 
      document.getElementById($type).removeEventListener("click", l.close($type), false); 
      //^ Recursion & Uncaught RangeError: Maximum call stack size exceeded 
    } 

Những gì tôi đang làm sai? Nếu không có sự kiện nghe này, mọi thứ sẽ hoạt động tốt. Và tham số thứ ba làm gì (true | false)? Cảm ơn bạn.

+0

https://developer.mozilla.org/en/DOM/element.removeEventListener tham số thứ ba gắn cờ có hay không bạn muốn trình xử lý sự kiện sử dụng tính năng thu thập sự kiện (ngược lại với bong bóng) khi thêm và loại bỏ liệu không phải sự kiện đã được thêm vào như vậy. – davin

Trả lời

10

Bạn đang gọi hàm close trong addEventListenerremoveEventListener khi bạn đang cố chuyển qua là đối số (gây ra vòng lặp vô hạn). Thay vào đó bạn chỉ cần vượt qua tham chiếu đến các chức năng như sau:

document.getElementById($type).addEventListener("click", l.close, false); 

Và:

document.getElementById($type).removeEventListener("click", l.close, false); 
+0

Cảm ơn bạn. :) Nhưng tham số thứ ba là gì? –

+1

@Krylovech Nó định nghĩa nếu trình xử lý phải được thực thi trong giai đoạn bắt giữ hoặc bong bóng: http://www.quirksmode.org/js/events_order.html – Lycha

0

Hoặc bạn có thể có hai chức năng Javascript có cùng tên.

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