- From: Ian Hickson <ian@hixie.ch>
- Date: Fri, 29 Jun 2012 01:29:55 +0000 (UTC)
- To: Pablo Flouret <pablof@motorola.com>
- Cc: whatwg@lists.whatwg.org
On Thu, 9 Feb 2012, Pablo Flouret wrote:
>
> I'm trying this out:
>
> <!DOCTYPE html>
> <script>
> window.onpopstate = function (e) { alert(e.state); }
> history.pushState(1, "", "#1");
> history.pushState(2, "", "#2");
> history.back();
> history.pushState(3, "", "#3");
> </script>
>
> WebKit:
> alerts 2 (bug, i'd say)
> history is #1, #2, #3
>
> Gecko:
> alerts 1
> history is #1, #3
>
> Opera:
> Doesn't fire the event (bug?)
> history is #1, #2, #3
>
> Don't have an IE to test right now, so not sure what happens there.
>
> What should be happening here ideally?
Per spec, back() is asynchronous, but pushState() is synchronous. So the
above code is functionally equivalent to this code:
<script>
window.onpopstate = function (e) { alert(e.state); }
history.pushState(1, "", "#1");
history.pushState(2, "", "#2");
history.pushState(3, "", "#3");
history.back();
</script>
...or this code:
<script>
window.onpopstate = function (e) { alert(e.state); }
history.pushState(1, "", "#1");
history.pushState(2, "", "#2");
history.pushState(3, "", "#3");
setTimeout(function () { history.back(); }, 0);
</script>
...which is to say, you should get an alert of "2", and the history should
be #1, #2, #3, with #2 being the document's address at the end.
In your testing, you may find browsers differ if you do the test in a
timeout after onload than before onload. There have at times been
requirements that made the behaviour differ before and after the 'load'
event fired. (These requirements have since been dropped, I believe.
There's now no difference; the API always acts the same.)
--
Ian Hickson U+1047E )\._.,--....,'``. fL
http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Friday, 29 June 2012 01:30:25 UTC