2011-10-31 48 views
7

Tôi đang cố gắng tự động đóng hộp thoại sau ba giây sau khi mở. Tôi đã thử các phương pháp sau:Hộp thoại giao diện người dùng jQuery Tự động đóng bằng cách sử dụng setTimeout

setTimeout($("#mydialog").dialog('close'), 3000); 

Dưới đây là trong bối cảnh:

$("#acknowledged-dialog").dialog({ 
    height: 140, 
    modal: true 
}); 

setTimeout($("#acknowledged-dialog").dialog('close'), 3000); 

Nhưng với phương pháp này, nó thậm chí không hiển thị! Tôi đoán phương pháp đóng được gọi ngay sau khi nó được hiển thị trên trang. Nhật ký không hiển thị lỗi.

Tôi cũng đã cố gắng liên kết với các sự kiện dialogopen:

$("#acknowledged-dialog").bind('dialogopen', function(event, ui) { 
    setTimeout($(this).dialog('close'), 3000); 
}); 
$("#acknowledged-dialog").dialog({ 
    height: 140, 
    modal: true 
}); 

Các chương trình hội thoại, nhưng không thực hiện tự động đóng. Không có lỗi trong nhật ký ở đây.

Tôi không thể sử dụng 'this' trong đối số cho $ trong setTimeout?

Trả lời

13

setTimeout đang gọi giá trị trả về của $ ("# mydialog"). Hộp thoại ("đóng") sau 3 giây. bạn muốn ném toàn bộ thứ như một chuỗi, và nó sẽ hoạt động tốt. Ngoài ra, tôi không nghĩ rằng bạn muốn ràng buộc 'dialogopen' trước khi bạn khởi tạo hộp thoại. Dưới đây chỉ hoạt động tốt:

$("#acknowledged-dialog").dialog({ 
    height: 140, 
    modal: true, 
    open: function(event, ui){ 
    setTimeout("$('#acknowledged-dialog').dialog('close')",3000); 
    } 
}); 
+0

và không, trừ khi bạn theo dõi @toby và bọc hàm, tôi đã tìm thấy tôi không thể sử dụng 'this' trong đoạn mã trên cho setTimeout. – DefyGravity

+1

Chỉ muốn lưu ý, trong trường hợp chuỗi eval đó không hoạt động (như khi tôi đang tạo tiện ích mở rộng của Chrome), bạn chỉ có thể biến chuỗi thành một hàm ẩn danh. –

+0

Lưu ý rằng nếu người dùng đóng hộp thoại theo cách thủ công trước khi hết giờ, bộ hẹn giờ trong mã trên sẽ tiếp tục chạy và cố gắng đóng hộp thoại lần thứ hai - điều này là ok trừ khi hộp thoại bị hủy. Nhưng nếu hộp thoại được hiển thị lần thứ hai trước thời gian chờ đầu tiên, bộ hẹn giờ đầu tiên sẽ đóng hộp thoại sớm. –

8

Tôi đã viết một số article dành riêng cho sự cố bạn đang gặp phải. Xin hãy đọc điều đó.

Tóm lại, bạn muốn bọc $("#mydialog").dialog('close') với chức năng nội dòng ở bất cứ nơi nào bạn muốn nó được thực thi do sự chậm trễ hoặc sự kiện được kích hoạt.

setTimeout(function(){ 
    $("#mydialog").dialog('close') 
}, 3000); 

Hộp thoại thậm chí không hiển thị vì bạn đóng nó ngay khi bạn mở nó trong mỗi trường hợp.

+0

Cố định, do DefyGravity chỉ ra bạn không thể tham chiếu 'this' bên trong gọi lại. – airportyh

+1

Để tham khảo trong tương lai, bạn có thể sử dụng 'this' được lưu trữ trong một biến. Điều này làm việc thuận tiện khi bạn có thể có một hộp thoại động mà không nhất thiết phải có một id. Chỉ cần lưu 'this' trước' setTimeout' bên trong hàm gọi lại 'open' và sử dụng biến như đóng. Điều này làm cho nó di động quá. 'open: function (event, ui) {var $ this = $ (this); setTimeout (function() {$ this.dialog ('close')}, 3000); } ' – Demonslay335

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