2012-07-03 29 views
5

Tôi có một trò chơi Flash mà tôi đang cố gắng lưu trạng thái khi người dùng đóng tab trình duyệt. Nó được sử dụng mã jquery sau:Làm cách nào để thực hiện yêu cầu tải xuống trên trình duyệt trên nhiều cửa sổ?

//Called from Flash when window closes 
function sendRequest(url, params) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: url, 
     data: params 
    }) 
} 

$(window).unload(function() { 
    //Make Flash attempt to save the game when the window closes. 
    //Flash gets the necessary data and calls sendRequest() 
    document["flashGame"].saveBeforeUnload(); 
}); 
  • Firefox: Các công việc một cách chính xác
  • Chrome: Các công việc một cách chính xác khi tải lại nhưng không phải khi tab đóng hoặc đóng trình duyệt
  • IE (tất cả các phiên bản): Không hoạt động tại tất cả

Tôi wan nó hoạt động trong tất cả các trình duyệt một cách chính xác, nhưng quan trọng nhất là Chrome (không nhiều người dùng của chúng tôi có IE).

Flash gọi chính xác sendRequest (trong tất cả các trình duyệt, được kiểm tra bằng cảnh báo), vì vậy tôi không tin rằng sự cố đến từ Flash, nhưng có thể.

+1

Tôi không nghĩ bạn cũng không thể làm tôi nghĩ bạn nên dựa vào .unload, nếu người dùng muốn đóng trình duyệt mà họ muốn đóng trình duyệt. Nếu yêu cầu của bạn mất nhiều thời gian hơn một vài ms để lưu thì trình duyệt có chờ không? Tại sao không lưu các trò chơi trên nói một bộ đếm thời gian 30 giây để lâu nhất họ sẽ được ra là 30 giây sau đó bạn không phải lo lắng về sự kiện dỡ bỏ – dstarh

+0

@ dstarh: Chúng tôi đã lưu các trò chơi trên một bộ đếm thời gian. Mục đích của việc này là để ngăn người chơi mất vài giây cuối cùng của hành động. Thông thường, những hành động cuối cùng này rất quan trọng. – Fragsworth

+1

vì vậy bạn đang nói rằng một người nhấp vào X để đóng cửa sổ trình duyệt của họ nên mong đợi rằng mọi thứ họ đã làm trong vài giây qua sẽ được lưu? Tôi nghĩ rằng đào tạo người dùng nhấp vào một nút lưu và sau đó đóng trình duyệt là thời gian tốt hơn chi tiêu.Chúng tôi cần đưa người dùng ra khỏi tâm lý của "Tôi đã kéo dây điện từ tường, tại sao mọi thứ không được lưu ???? !!! ???" – dstarh

Trả lời

6

Câu trả lời ngắn gọn là bạn không thể.

Sự kiện onbeforeunload ban đầu được Microsoft giới thiệu để cho phép hộp thoại xác nhận chuẩn. Nó hiện được hỗ trợ ở dạng gốc bởi hầu hết các trình duyệt và trong hầu hết trường hợp, một hàm ngắn, không tương tác được phép thực hiện (ví dụ bạn có thể đăng nhập trạng thái của bạn trong localStorage). Tuy nhiên, như được mô tả trong the cross-browser jQuery API, đây là không đáng tin cậy:

Việc xử lý chính xác của các sự kiện dỡ bỏ đã thay đổi từ phiên bản để phiên bản của trình duyệt. Ví dụ: một số phiên bản Firefox kích hoạt sự kiện khi liên kết được theo dõi, nhưng không phải khi cửa sổ đóng. Trong cách sử dụng thực tế, hành vi phải được kiểm tra trên tất cả các trình duyệt được hỗ trợ, và tương phản với sự kiện trước khi tải độc quyền.

Vì có nhiều vấn đề bảo mật tiềm ẩn liên quan đến việc thực hiện tác vụ khi người dùng yêu cầu kết thúc trang (và do đó tập lệnh), điều này có thể không đáng tin cậy cho đến khi (và nếu) nỗ lực bình thường hóa nghiêm trọng là thực hiện chính xác những gì chính xác có thể được thực hiện trong một cuộc gọi lại onbeforeunload.

Vì tương lai có thể dự đoán, bạn nên không phụ thuộc vào onbeforeunload nhưng để sử dụng các sơ đồ khác, ví dụ như lưu nền chung hoặc nút "lưu" lớn.

1

Hãy thử window.onbeforeunload. Tôi thấy điều này trong jQueryBug Tracker như một giải pháp khả thi:

window.onbeforeunload = function() { return "text"; } 
Các vấn đề liên quan