2010-09-13 32 views
10

Tôi đang sử dụng sự kiện HTML5 onpopstate mới. Sử dụng Firefox 4 sự kiện window.onpopstate được kích hoạt khi tải trang trong khi trong Webkit, điều này dường như không đúng.HTML5 onpopstate khi tải trang

Hành vi đúng là gì?

+1

Điều này được khắc phục trong Chrome Canary ngay bây giờ và có lẽ nó sẽ được sửa trong phiên bản tiếp theo (hoặc hai) của Chrome. – Agamemnus

+0

@Agamemnus, Weird, không kích hoạt tải trang cho tôi. – Pacerier

+0

Trong điều kiện nào? – Agamemnus

Trả lời

10

Sự kiện popstate được kích hoạt trong một số trường hợp nhất định khi điều hướng đến mục nhập lịch sử phiên.

http://www.whatwg.org/specs/web-apps/current-work/#event-popstate

Từ hiểu biết của tôi, mặc dù tôi có thể là sai, thấy như tải trang có ý nghĩa lịch sử được tạo ra và đi qua để, vâng, nó sẽ được kích hoạt trên tải trang.

Cũng xem,

http://www.mail-archive.com/[email protected]/msg19722.html

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

+1

Dường như có sự mơ hồ trong Firefox và Webkit. Hiện tại, Webkit không kích hoạt onpopstate trong khi tải trang. – epoch

+6

** Đối với nhà phát triển truy cập trang này sau năm 2011 ** Thông số kỹ thuật HTML5 đã được sửa đổi sao cho 'popstate' không bao giờ được kích hoạt khi tải trang ban đầu. FireFox, IE10, vv tất cả đều thể hiện hành vi chính xác; Chrome (và có lẽ Safari) thì không. ** Vui lòng bỏ phiếu https://code.google.com/p/chromium/issues/detail?id=63040 để đưa Chrome trở lại tuân thủ tiêu chuẩn **. – Dave

+2

@Dave: Safari Mobile vẫn (tháng 8 năm 2014) kích hoạt tính năng này khi tải trang ban đầu. –

4

Firing onpopstate trên tải trang là đúng, và WebKit sẽ có hành vi này sớm. WebKit 534.7 (Chrome 7.0517.44) hiện hoạt động theo cách này.

Tôi đã gửi lỗi Chrome trên đó, nhưng hóa ra đây là hành vi mong muốn; nó là cần thiết để xử lý một số hành động nút quay lại/chuyển tiếp một cách chính xác. Xem this bug report at code.google.com để biết thêm thảo luận và liên kết.

Tôi vẫn đang cố gắng đưa ra một mẫu mã tốt cho trình xử lý sự kiện onpopstate.

+0

Có vấn đề này quá (onpopstate bắn cho webkit cho một tải trang đôi trên tải đầu tiên). Tôi đã giải quyết vấn đề này bằng cách thêm một số logic - ví dụ: chỉ thêm onpopstate listener sau khi yêu cầu ajax đầu tiên. – benbyford

3

Tôi không biết nếu là những gì bạn đang yêu cầu này, nhưng giải pháp của tôi cho một ajax chỉ- xử lý sự kiện onpopstate là để thiết lập để true một biến refreshed trên window.onload và đặt nó vào false trên history.pushState cuộc gọi; sau đó, trên trình xử lý onpopstate, hãy thực hiện công cụ nếu refreshedfalse.

Trông ngớ ngẩn, đúng vậy, nhưng tôi không thể làm tốt hơn.

+0

Trong Firefox, 'window.onload' cũng được kích hoạt khi nút Back của trình duyệt được nhấp, vì vậy có thể tốt hơn để khởi tạo' refreshed' một số địa điểm khác. – jamix

1

Trình duyệt có xu hướng xử lý sự kiện popstate khác nhau khi tải trang. Chrome và Safari luôn phát ra sự kiện popstate khi tải trang, nhưng Firefox thì không.

quote này được lấy từ tài liệu của Mozilla: https://developer.mozilla.org/en-US/docs/DOM/window.onpopstate

tôi có xu hướng đồng ý với các hệ thống Mozilla. Tải trang không phải là hành động yêu cầu sự kiện popstate phụ được kích hoạt, bởi vì trạng thái không bị xuất hiện, nó đang được tải lần đầu tiên.

Tôi đoán Webkit đang làm điều đó để thuận tiện ... trong tất cả các triển khai của tôi, nó luôn là một sự bất tiện để trì hoãn tải trình xử lý của tôi cho đến sau khi popstate ban đầu đã kích hoạt.

Thay vì điều này (sử dụng chức năng giả):

AddEventHandler(window, 'popstate', OnPopState); 

tôi phải làm một cái gì đó như thế này:

AddLoadEvent(window.setTimeout(function() 
    { 
     AddEventHandler(window, 'popstate', OnPopState); 
    },0)); 
3

Chỉ cần giải quyết vấn đề này, và việc sửa chữa thực sự là khá đơn giản. Firefox không kích hoạt onpopstate khi tải trang ban đầu. Sau khi bạn bắn một popstate, trả về false hoặc ngăn chặn mặc định trên hành động page.load, và bạn đang vàng.

Chúc mừng.

Trong hành động ở đây: www.thecoffeeshopnyc.com

// Write in a new handler for Firefox, which does not fire popstate on load. 
// Modern Webkit browsers fire popstate on load. The event handler below fires the controller 
$(window).load(function() { 
    if ($.browser.mozilla) { 
     // Your func. 
    } 
}) 

// Add the event listener. If the above is false, it will still run as intended in normal browsers. 
window.onpopstate = function() { 
    // Your func. 
} 
+0

Điều này sẽ xảy ra khi Chrome quyết định khắc phục sự cố này. Phát hiện trình duyệt là một cách nhanh chóng để khắc phục mọi thứ, nhưng tính năng phát hiện tính năng nên được sử dụng để tránh các lỗi khó tìm. – Agamemnus

1

Trong trường hợp ai đó quan tâm, tôi đã đưa ra một mô hình khá để làm việc với onpopstate (mã này giả jQuery, kiểm tra phát hiện tính năng được tước để rõ ràng):

$(function() { 

    // 1. Add initial state to current history record on page load. 
    var href = location.href; 
    history.replaceState({"href": href}, null, href); 

    // 2. Now attach the popstate handler. 
    window.onpopstate = function(ev) { 

    // Raised on page load this event will still contain no state. 
    var state = ev.state; 
    if (state && state.href) { 

     // 3. Add your logic, use `state` and `state.href` as you see fit.   

    } 
    }; 

}); 
Các vấn đề liên quan