2010-11-08 10 views
38

Có vẻ như Apple đã vô hiệu hóa sự kiện window.onbeforeunload cho thiết bị iOS (iPhone, iPad, iPod Touch). Rất tiếc, tôi không thể tìm thấy bất kỳ tài liệu nào về lý do sự kiện này không hoạt động trong Mobile Safari.Có cách nào để sử dụng window.onbeforeunload trên Mobile Safari cho thiết bị iOS không?

Có ai biết nếu có một sự thay thế đáng tin cậy để chức năng này? Trình duyệt của Android dường như hỗ trợ nó tốt và ứng dụng Safari dành cho máy tính để bàn cũng hỗ trợ sự kiện onbeforeunload mà không có sự cố.

+0

Đây là một bản sao của [window.onbeforeunload không làm việc trên iPad?] (http://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad) –

Trả lời

1

Nếu bạn thực sự cần đến nó, bạn không thể chỉ nhận được tất cả các liên kết, hình thức và đối tượng DOM có một handler thay đổi url và làm cho những chờ đợi cho đến khi bạn đã làm những gì bạn muốn. Đối với các liên kết, bạn nhận chúng bằng getElementsByTagName, kiểm tra xem href có bắt đầu bằng gì không, nhưng chỉ # và thêm hàm onbeforeunload của bạn thêm onclick (sẽ được gọi trước khi xem href). Tương tự cho các biểu mẫu nhưng với onsubmit. Và cuối cùng, đối với các yếu tố thay đổi href bằng JavaScript, bạn nên đảm bảo khi bạn thêm lsitener mà bạn gọi hàm onbeforeunlaod (hoặc, nếu bạn sử dụng trình nghe DOM0 hoặc DOM1, bạn có thể thêm một số lớp và sau đó sử dụng Kịch bản kiểm tra tất cả các phần tử với lớp và thêm nó vào trình lắng nghe sự kiện với một đóng cửa

Nhưng bạn nên có thể tránh sử dụng sự kiện này (có thể sử dụng cookie để lưu trữ thứ bạn muốn gửi x giây và cho phép, trong trường hợp xấu nhất, hãy xem nó vào lần tới khi người dùng tải một trang và, trong trường hợp tốt nhất, có thể gửi một yêu cầu Ajax tại onbeforeunload hoặc onunload, ngay cả khi nó chỉ gửi các tiêu đề http , woudl cho phép bạn có được những gì bạn muốn)

+0

Cảm ơn Xavier, tất cả các khả năng, nhưng tất cả những điều này đòi hỏi rất nhiều sửa đổi DOM mà trong trường hợp đơn đăng ký của tôi là không thực tế vì nó có thể ảnh hưởng đến hoạt động của các trang được lưu trữ. –

+0

Bạn không cần phải thêm sự kiện vào mỗi liên kết đơn, v.v., bạn có thể sử dụng ủy quyền sự kiện. Bạn chỉ có thể đặt một trên cơ thể và sử dụng e.srcElement || e.target và sau đó kiểm tra xem nó có thay đổi url không. Bằng cách này, bạn không cần phải đặt nhiều yếu tố đó. Nhưng bạn có thể vẫn cần phải đặt các tùy chọn trên các hình thức themselfves ... không chắc chắn về điều đó. – xavierm02

+1

Bất kỳ tùy chọn nào cho trường hợp người dùng thực sự đóng trang, trái ngược với việc chuyển sang trang khác thông qua phần tử? –

13

Tôi thấy rằng đó là một câu hỏi cũ, nhưng tôi phải đối mặt với vấn đề này gần đây.

Tôi đang sử dụng window.unload và nó hoạt động tốt trong các trình duyệt ios (mặc dù nếu bạn nhìn vào Apple documentation nó có vẻ là bị phản đối và họ khuyên bạn nên sử dụng document.pagehide)

+1

+1 cho gợi ý 'document.pagehide'. Chính xác những gì tôi cần! –

+5

Cả pagehide lẫn unload đều không hoạt động trên iOS 9 khi người dùng tải lại trang. – CpnCrunch