2013-11-26 13 views
5

Tôi đã cố gắng để làm một cái gì đó dọc theo những dòng:Cách để thực hiện các hàm thành viên jQuery bên trong setTimeout mà không đóng cửa?

setTimeout($('#element').hide,3000); 

mà có vẻ đơn giản, nhưng nó là làm tê liệt bởi các "this" problem. Tôi muốn tìm cách chuyển hàm thực tế dưới dạng tham số, mà không cần gói nó trong một hàm khác, ví dụ: Tôi không muốn làm điều này:

setTimeout(function(){$('#element').hide();},3000); 

Những gì tôi đã cố gắng:

setTimeout($('#element').hide,3000); 
setTimeout($('#element').hide.apply(document),3000); /* jQuery docs say that document is the default context */ 
setTimeout($('#element',document).hide,3000); 
setTimeout($(document).find('#element').hide,3000); 
setTimeout($(window).find('#element').hide,3000); 
setTimeout($.proxy($('#element').hide,document),3000); /* I know this returns a function, which I don't want, but I have tried it */ 
setTimeout(($('#element').hide()),3000);    /* functional expression */ 

Tôi đang tìm cách để khắc phục vấn đề này, nhưng tôi không muốn quấn nó trong một chức năng khác. Ít dòng mã hơn thì càng tốt. Tôi biết TẠI SAO điều này không làm việc như mong đợi, nhưng LÀM THẾ NÀO tôi có thể sửa chữa nó mà không cần gói nó trong một đóng cửa?

+0

setTimeout sẽ chỉ mất một tên hàm, hoặc chức năng ẩn danh như một tham số, vì vậy tôi không nghĩ rằng điều này có thể được thực hiện như bạn muốn. Lý do bạn không muốn sử dụng chức năng nặc danh là gì? –

+0

Trong bài viết bạn đã cho chúng tôi, họ đưa ra một giải pháp khả thi. Tại sao bạn không thử nó? –

+1

@epascarello Đó là những gì tôi đã thử. Bảy lần thử khác nhau tại một dòng mã. –

Trả lời

5

Bạn có thể thực hiện theo cách này bằng cách ràng buộc ngữ cảnh của phương thức với chính phần tử sao cho trong phương thức jquery hide this sẽ trỏ đến đối tượng jquery và không phải ngữ cảnh chung. Bạn có thể tạo các hàm ràng buộc sử dụng:

Function.bind

Chữ thập duyệt thay thế cho việc này:

$.proxy

Ex:

var $elem = $('#element'); 
setTimeout($elem.hide.bind($elem),3000); 

hoặc

setTimeout($.proxy($elem.hide, $elem),3000); 

hoặc

setTimeout($.fn.hide.bind($elem),3000); //setTimeout($.proxy($.fn.hide, $elem),3000); 

Fiddle

+3

đẹp. nếu bạn đang ràng buộc lại - bạn có thể sử dụng $ .fn.hide thay vì $ elem.hide – benjaminbenben

+1

'setTimeout ($. proxy ($. fn.hide, $ ('# element')))' ngắn hơn. – haim770

+0

@benjaminbenben Oh yeah Đúng ... cập nhật ... Cảm ơn. – PSL

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