2013-02-26 51 views
7

Tôi tự hỏi làm thế nào tôi có thể loại bỏ một người nghe sự kiện sau khi thêm một, cách bạn sử dụng và tắt trong jquery?Làm cách nào để xóa trình xử lý sự kiện trong javascript?

document.removeEventListener('touchstart'); 
document.addEventListener('touchstart', function (e) { 
    closePopupOnClick(e, popup); 
}); 

nhưng điều này không thực sự xóa trình xử lý sự kiện. Nếu tôi đặt mã addEventListener trong một hàm và chuyển hàm đó vào removeEventListener nó sẽ không làm việc bc bạn không thể chuyển các tham số vào hàm. Bất cứ ai biết làm thế nào để làm điều này?

+2

bản sao có thể có của [JavaScript: xóa trình xử lý sự kiện] (http://stackoverflow.com/questions/4402287/javascript-remove-event-listener) cũng [Javascript: Xóa trình xử lý sự kiện ẩn danh] (http: // stackoverflow .com/questions/3106605/remove-an-anonymous-event-listener) – Ohgodwhy

+0

không có câu hỏi nào không giải quyết vấn đề tham số. – Tanya

Trả lời

15

Đặt người nghe như là một biến và đính kèm qua .addEventListener

var myListener = function (e) { 
    closePopupOnClick(e, popup); 
}; 
document.addEventListener('touchstart', myListener, true); 

sau đó vượt qua nó một lần nữa khi loại bỏ với .removeEventListener

document.removeEventListener('touchstart', myListener); 

Nếu bạn không trong chế độ nghiêm ngặt bạn có thể khiến người nghe tự xóa chính mình bằng arguments.callee

document.addEventListener('touchstart', function (e) { 
    closePopupOnClick(e, popup); 
    document.removeEventListener('touchstart', arguments.callee); 
}, true); 

Nếu bạn đang ở trong chế độ nghiêm ngặt, bạn phải sử dụng một biểu thức tên chức năng nếu bạn muốn có một chức năng để loại bỏ bản thân

document.addEventListener('touchstart', function myListener(e) { 
    closePopupOnClick(e, popup); 
    document.removeEventListener('touchstart', myListener); 
}, true); 

Nếu bạn muốn sử dụng biến trong người nghe có thể được thay đổi bởi một cái gì đó (ví dụ một vòng lặp), sau đó bạn có thể viết một hàm máy phát điện, ví dụ

function listenerGenerator(popup) { 
    return function (e) { 
     closePopupOnClick(e, popup); 
    }; 
} 

Bây giờ bạn có thể tạo cho người nghe với listenerGenerator(popup) và nó sẽ phạm vi biến popup. Lưu ý rằng nếu popup là một đối tượng , nó sẽ là ByRef và do đó vẫn có thể bị thay đổi.

+0

cách vượt qua, thông số e và popup cho hàm myListener trong addEventListener? thats những gì tôi đang mắc kẹt nhiều nhất. là params. – Tanya

+0

Địa chỉ 'e' và' popup' đến từ đâu? 'e' là _Event_? sau đó bạn cần đặt _useCapture_ 'true' –

+0

Hàm addEventListener nằm bên trong một hàm nhận thông số bật lên được truyền vào nó. Vì vậy, nó xuất phát từ chức năng bên ngoài. e là sự kiện. làm cách nào để đặt userCapture? – Tanya

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