Our volunteers haven't translated this article into ไทย yet. Join us and help get the job done!
The popstate
event is fired when the active history entry changes. If the history entry being activated was created by a call to history.pushState()
or was affected by a call to history.replaceState()
, the popstate
event's state
property contains a copy of the history entry's state object.
Note that just calling history.pushState()
or history.replaceState()
won't trigger a popstate
event. The popstate
event is only triggered by doing a browser action such as a click on the back button (or calling history.back()
in JavaScript).
Browsers tend to handle the popstate
event differently on page load. Chrome (prior to v34) and Safari always emit a popstate
event on page load, but Firefox doesn't.
General info
- Specification
- HTML5
- Interface
- PopStateEvent
- Bubbles
- Yes
- Cancelable
- No
- Target
- defaultView
- Default Action
- None
Properties
Property | Type | Description |
---|---|---|
target Read only |
EventTarget |
The browsing context (<code>window</code>). |
type Read only |
DOMString |
The type of event. |
bubbles Read only |
Boolean |
Whether the event normally bubbles or not |
cancelable Read only |
Boolean |
Whether the event is cancellable or not? |
state Read only |
any | The current history entry's state object (if any). |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | 4.0 (2) | 10.0 [3] | (Yes) | (Yes)[1] |
Feature | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | 3.0[2] | 4.0 (2) | 10.0 | (Yes) | (Yes)[1] |
[1] The implementation has limited support.
[2] The implementation in Android 2.2 and 2.3 was buggy.
[3] IE & Edge do not fire the popstate event when the URL's hash value changes, see the bug report.
Example
A page at https://example.com/example.html
running the following code will generate logs as indicated:
window.onpopstate = function(event) { console.log("location: " + document.location + ", state: " + JSON.stringify(event.state)); }; history.pushState({page: 1}, "title 1", "?page=1"); history.pushState({page: 2}, "title 2", "?page=2"); history.replaceState({page: 3}, "title 3", "?page=3"); history.back(); // Logs "location: https://example.com/example.html?page=1, state: {"page":1}" history.back(); // Logs "location: https://example.com/example.html, state: null history.go(2); // Logs "location: https://example.com/example.html?page=3, state: {"page":3}
Note that even though the original history entry (for https://example.com/example.html
) has no state object associated with it, a popstate
event is still fired when we activate that entry after the second call to history.back()
.