Maybe a little late, but here is my educated guess:
Any page change event triggers two transitions, one “forward” (page change) and one “backward” (hehe). If you move forward, hashChange is blocked; if you move backward, it is the other way around.
Check out the jqm source code and check the ignoreNextHashChange property.
This is responsible for blocking hashChange when moving forward, otherwise you will go back and forth.
I think your function fires twice because both events are fired from within changePage and hashChange.
If that were the case, JQM would have to block the hash hash record before firing this event.
source share