2010-07-11 36 views
20

Có thể xóa tất cả người nghe sự kiện của một phần tử và con của nó không? Một cái gì đó như:Xóa tất cả trình nghe sự kiện JavaScript của một phần tử và các phần tử con của nó?

myElem.removeEventListeners(); 

Tôi cần điều này vì tôi có một yếu tố phức tạp với sự kiện và tôi cần tạo một bản sao - như hình ảnh tĩnh không phản ứng với bất kỳ sự kiện nào.

+1

Các sự kiện bị ràng buộc như thế nào ở vị trí đầu tiên (ví dụ: 'onclick = ...', 'addEventListener', thư viện, v.v ...)? –

+0

addEventListener() được sử dụng. Nó được sử dụng cho myElem và cho một số trẻ em tùy ý tùy thuộc vào logic điều kiện được kích hoạt bởi người dùng. – Tower

+5

Tôi lấy nó bạn không quan tâm đến IE sau đó (trong đó sử dụng 'attachEvent')? Nếu đó là trường hợp, "sao chép" phần tử của bạn với 'cloneNode (true)', và magic-boom-presto, các sự kiện addEventListener sẽ không được sao chép. Trong thông số: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener –

Trả lời

22

Nếu bạn sử dụng cloneNode, trình nghe sự kiện sẽ không được sao chép.

Nếu bạn muốn có giải pháp mạnh nhất, đặt cược tốt nhất của bạn có thể là viết trình bao bọc cho người nghe attach/detach và tự theo dõi chúng. Một cái gì đó như Dean Edwards' addEvent.

+0

Cảm ơn lời khuyên.Tôi đang sử dụng trình nghe sự kiện W3C, vì vậy, tôi có thể phải viết một trình bao bọc, mà tôi muốn tránh ... – Tower

+0

nhưng nếu bạn sử dụng 'cloneNode', người nghe của bạn sẽ không được sao chép. Xem bản cập nhật của tôi, – galambalazs

+0

vẫn còn nếu có một cách đơn giản để xóa tất cả trình xử lý sự kiện, điều đó sẽ tuyệt vời –

-7

Tôi không biết một và tìm kiếm trên Google không mang lại bất kỳ kết quả rõ ràng nào. Một giải pháp kludgy dễ dàng là để tạo ra một chức năng mà chu kỳ thông qua tất cả các sự kiện và đặt nó vào null, chẳng hạn như

function removeEvents(obj) 
{ 
    obj.onblur = null; 
    obj.onchange = null; 
    obj.onclick = null; 
    // ... 
} 

Gọi chức năng này như sau: removeEvents(myElem). Một danh sách đầy đủ các trình xử lý sự kiện JavaScript có thể được tìm thấy tại http://www.elated.com/articles/events-and-event-handlers/.

Chắc chắn có một cách thanh lịch hơn để viết chức năng này, nhưng tôi không biết liệu có cách nào thanh lịch hơn để giải quyết vấn đề này không. Nó sẽ là đáng yêu nếu ai đó biết về một. Nếu bạn đang ràng buộc các sự kiện thông qua một thư viện JavaScript, chẳng hạn như jQuery, có thể có các tùy chọn khác tốt hơn.

+3

Tôi đã đặt nó thành một hàm trống ('function() {}') thay vào đó trong trường hợp nó vẫn được gọi. –

+1

Tùy thuộc vào trình duyệt, các phần tử không có trình xử lý sự kiện có các phần tử không được xác định hoặc không xác định. Tôi không nghĩ rằng thiết lập nó để null trình bày bất kỳ vấn đề, nhưng nếu như vậy đề nghị của bạn nên được thực hiện. – TNi

+1

Tại sao điều này lại bị giáng xuống địa ngục thánh? Đó là một ý tưởng tồi, nếu bạn bị mắc kẹt trong mã di sản và không thể bolt trên một thư viện sự kiện? –

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