Может быть, немного поздно, но вот мое образованное предположение:
Любое событие смены страницы вызывает два перехода, один «вперед» (pagechange) и один «назад» (hashchange).Если вы идете вперёд, hashChange блокируется, если вы идете назад, это наоборот.
Просмотрите исходный код jqm и проверьте свойство ignoreNextHashChange .
Это отвечает за блокировку hashChange при переходах вперед, иначе вы будете переходить туда-сюда.
Полагаю, ваша функция запускается дважды, потому что оба события запускаются изнутри changePage и hashChange.
Если бы это было так, JQM пришлось бы блокировать рутину hashChange, прежде чем запускать это событие.