2012-04-25 38 views
7

cách chuyển tham số tới trình xử lý sự kiện?cách chuyển tham số tới trình xử lý sự kiện

đây là những gì đang cố gắng để làm, không làm việc:

for (var i = 0; i < myobj.length; i++) { 
myobj[i].onmouseover = myfun(myobj[i]); 
} 

sau không làm việc không.

myobj[i].onmouseover = myfun.call(myobj[i]); 
myobj[i].onmouseover = function() {myfun(myobj[i]);}; 
myobj[i].onmouseover = function() {myfun.call(myobj[i]);}; 

Chủ yếu quan tâm đến lý do tại sao nó không hoạt động và giải pháp theo cùng một kiểu.

Cảm ơn.

Trả lời

9

Chỉ cần sử dụng chức năng của người tạo cho trình xử lý của bạn để gói gọn thông số để truyền.

function createHandler(param) { 
    return function() { 
    myfun(param); 
    } 
} 

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = createHandler(myobj[i]); 
} 

Lý do cách tiếp cận của bạn không hoạt động, vì bạn không chuyển tham chiếu hàm, mà là kết quả của cuộc gọi hàm. Vì vậy, trong ví dụ đầu tiên của bạn myfun(myobj[i]) được đánh giá và kết quả được truyền vào như trình xử lý sự kiện.

Tôi nghĩ, điều bạn thực sự muốn nói là, trong trường hợp sự kiện được kích hoạt, chức năng sẽ được đánh giá. Để làm như vậy, bạn phải chuyển tham số qua một số var toàn cục hoặc dưới dạng dataset property.

Giải pháp sạch hơn, tuy nhiên, là phải có chức năng trình tạo như được hiển thị ở trên.

+0

cảm ơn rất nhiều. Chính xác những gì tôi cần. –

+0

Câu hỏi tiếp theo về PS. Là những gì tôi đang làm ok, là có một cách thành ngữ để làm điều này? về cơ bản tôi có một loạt các yếu tố span.xyz, tôi muốn tất cả chúng có hành vi di chuột qua. (nhưng không sử dụng JQuery hoặc bất kỳ phương thức nào khác) –

+1

@XahLee Miễn là bạn không sử dụng bất kỳ thư viện nào, tôi nghĩ, đó là đánh giá tốt nhất. – Sirko

3

Một cách tiếp cận khác là sử dụng thực tế là onmouseover sẽ được gọi là phương thức (không phải chức năng) trên phần tử DOM kích hoạt sự kiện.

Nói cách khác, viết mã của bạn, nếu như bạn mong đợi một ai đó để làm điều này:

obj = xahlees(); 
obj.onmouseover(); 

Dưới đây là một giải pháp:

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = function() { myFun(this) }; 
} 

Tôi đã tải lên một more complete example.

+0

kinda muộn, nhưng đó cũng là một giải pháp tuyệt vời. Cảm ơn Leonel. –

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