2013-04-30 23 views
5

Vì vậy, chúng tôi có một trang:addEventListener gọi hàm mà không có tôi thậm chí yêu cầu nó để

<span id='container'> 
    <a href='#' id='first'>First Link</a> 
    <a href='#' id='second'>Second Link</a> 
</span> 

Và muốn thêm một số sự kiện nhấp chuột:

first.addEventListener('click', function(){alert('sup!');}) 

trình như một say mê! Tuy nhiên, khi bạn đặt đối số thứ hai là hàm ngoài:

function message_me(m_text){ 
    alert(m_text) 
} 

second.addEventListener('click', message_me('shazam')) 

Nó gọi hàm ngay lập tức. Làm thế nào tôi có thể ngăn chặn điều này? Rất khó chịu!

Dưới đây là một bản demo trực tiếp: http://jsfiddle.net/ey7pB/1/

+1

Do tham số thứ hai mong đợi một tham chiếu ** chức năng, bạn cần cung cấp một tham chiếu **. Với mã có vấn đề của bạn, bạn ngay lập tức gọi hàm và chuyển kết quả của nó (tức là * undefined *). Hoặc gọi hàm trong một hàm ẩn danh (như ví dụ đầu tiên của bạn) hoặc thay đổi hàm thành ** return ** một hàm (có lẽ không phải là lý tưởng). – Ian

+1

Tại sao điều này không lý tưởng? Dường như chống lại D.R.Y. để copypasta chức năng của tôi trong 4 hoặc addEventListeners mà im thiết lập, không? – LittleBobbyTables

+0

Một tùy chọn khác là lưu trữ thông điệp được yêu cầu dưới dạng thuộc tính trên phần tử, sau đó liên kết hàm như 'second.addEventListener ('click', message_me)' và lấy nó từ thuộc tính thay vì tham số. – nnnnnn

Trả lời

7
function message_me(m_text){ 
    alert(m_text) 
} 

second.addEventListener('click', 
    function() { 
     message_me('shazam'); 
    } 
); 

Dưới đây là một cập nhật fiddle.

+0

Boom! Cảm ơn. Sẽ chấp nhận câu trả lời này khi SO cho phép tôi: D – LittleBobbyTables

+0

Tôi nghĩ bạn nên cập nhật câu trả lời được chấp nhận của bạn bởi vì truyền chức năng mà không gọi nó, và ràng buộc - có lẽ là một lựa chọn tốt hơn ở đây. – IonicBurger

+0

Bạn có thể giải thích tại sao bạn nghĩ ràng buộc là một lựa chọn tốt hơn? – clav

4

Do tham số thứ hai mong đợi một hàm tham chiếu , bạn cần cung cấp một tham số. Với mã có vấn đề của bạn, bạn sẽ ngay lập tức gọi hàm này và chuyển kết quả (là undefined ... bởi vì tất cả hàm hoạt động là alert và không trả về bất kỳ thứ gì). Hoặc gọi hàm trong một hàm ẩn danh (như ví dụ đầu tiên của bạn) hoặc thay đổi hàm để trả về một hàm.

Bạn có thể làm điều này:

function message_me(m_text){ 
    alert(m_text); 
} 

second.addEventListener('click', function() { 
    message_me('shazam') 
}); 

hay này:

function message_me(m_text){ 
    return function() { 
     alert(m_text); 
    }; 
} 

second.addEventListener('click', message_me('shazam')); 

DEMO:http://jsfiddle.net/tcCvw/

2

hoặc bạn có thể sử dụng .bind

function message_me(m_text){ 
    alert(m_text); 
} 

second.addEventListener('click', message_me.bind(this, 'shazam')); 

kiểm tra MDN Documentation về 'bao đóng'

+0

Đây phải là câu trả lời được chấp nhận – IonicBurger

+0

+1 ràng buộc nên là con đường để đi - không chắc chắn nếu điều đó đã có sẵn 4 năm trước, nhưng chắc chắn là cách ưa thích cho ngày hôm nay, trái ngược với việc tạo ra một hàm ẩn danh – vol7ron

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