2009-11-04 43 views
8

Tôi đang cố gắng sử dụng một câu lệnh jQuery bên trong một hàm setTimeout, nhưng Tôi không làm cho nó hoạt động. Tôi đã thử rất nhiều biến thể, như thế này (tôi là sử dụng 'this' vì setTimeout nằm bên trong mỗi hàm và bộ chọn được lưu trữ/lưu trữ trong một đối tượng, do đó công cụ chọn $):Các biến trong một hàm setTimeout (jQuery)

setTimeout("" + this.$selector + ".val('" + this.savVal + "')", 1); 

Tôi phải viết như thế nào?

Cảm ơn!

+3

Các chuỗi trong 'setTimeout()' và 'setInterval()' đã lỗi thời. Thay vào đó, các hàm nên được sử dụng. –

Trả lời

1

Bạn có thể làm điều gì đó như thế này, nếu các biến bạn đang cố gắng sử dụng được xác định trong mỗi bước của vòng lặp.

var myObj = { 
    $selector: myConfigObj.$myCachedSelector 
} 

$.each([ myObj, mySecondObj, myThirdObj ], function(n, $selector) { 
    setTimeout(function() { 
     $selector.val(saveVal); 
    }, 1); 
}); 
+0

Marco, "myConfigObj. $ MyCachedSelector" có vẻ là vấn đề. Nó trả về "không xác định". Tôi thay thế nó bằng một chuỗi đơn giản được trả về một cách chính xác ... – north

19

Khi bạn cần để bảo vệ hiện hành this mục khi gọi setTimeout sử dụng cấu trúc này: -

setTimeout((function(self) { 
    return function() { $selector.val(self.savVal) }; 
})(this), 1); 

này tạo ra một đóng cửa từ bên ngoài bối cảnh chức năng thực hiện. Hàm bên ngoài trả về một hàm bên trong sẽ truy cập tham số self. Hàm bên trong của nó được gọi khi hết thời gian chờ, giá trị của self sẽ giữ nguyên giá trị this gốc.

+0

Thanh lịch nếu một chút khó hiểu đối với những người không quen thuộc với việc đóng cửa. Cảm thấy ngớ ngẩn đây không phải là điều đầu tiên tôi nghĩ đến khi tôi nhận ra rằng IE không truyền các thông số. Tôi xin "Nhà phát triển .NET" làm lý do của tôi. Đó là một điều, phải không? –

0

cảm ơn câu trả lời của bạn.

Tôi đang sử dụng hàm bên trong setTimeout ngay bây giờ. Nhưng tôi phát hiện ra rằng vấn đề thực sự nằm ở đâu đó: trong mỗi hàm tôi đang cố gắng truy cập các thuộc tính đối tượng trỏ đến các thuộc tính trong một đối tượng config, nhưng kết quả (ví dụ cho điều này. $ Selector) là "undefined" .

var myObj = { 
    $selector: myConfigObj.$myCachedSelector 
} 

$.each([ myObj, mySecondObj, myThirdObj ], function() { 
    //code 
});     

Bạn không chắc chắn vấn đề là gì. Cả hai đối tượng đều nằm trong cùng một hàm/phạm vi.

7

AnthonyWJones cung cấp câu trả lời tuyệt vời, nhưng có một câu trả lời tương tự khác, dễ viết và dễ đọc hơn. Bạn chỉ cần lưu trữ giá trị của "this" trong một biến cục bộ.

var storedThis = this; 
setTimeout(function() { $selector.val(storedThis.savVal); }, 1); 
Các vấn đề liên quan