La única forma de hacer esto realmente (y es cómo la 'historia realmente simple' hace esto), es estableciendo un intervalo que siga verificando el hash actual y comparándolo con lo que era antes, hacemos esto y permitimos que los suscriptores se suscriban a un cambio evento que activamos si el hash cambia ... no es perfecto, pero los navegadores realmente no admiten este evento de forma nativa.
Actualice para mantener esta respuesta fresca:
Si está utilizando jQuery (que hoy debería ser algo fundamental para la mayoría), entonces una buena solución es utilizar la abstracción que le proporciona jQuery utilizando su sistema de eventos para escuchar eventos de cambio de hash en el objeto de la ventana.
$(window).on('hashchange', function() {
//.. work ..
});
Lo bueno aquí es que puede escribir código que ni siquiera tiene que preocuparse por el soporte de hashchange, sin embargo, necesita hacer algo de magia, en forma de una característica jQuery algo menos conocida de eventos especiales jQuery .
Con esta característica, esencialmente puede ejecutar algún código de configuración para cualquier evento, la primera vez que alguien intenta usar el evento de alguna manera (como el enlace al evento).
En este código de configuración, puede verificar la compatibilidad con el navegador nativo y, si el navegador no lo implementa de forma nativa, puede configurar un solo temporizador para sondear los cambios y activar el evento jQuery.
Esto libera por completo su código de la necesidad de comprender este problema de soporte, la implementación de un evento especial de este tipo es trivial (para obtener una versión de trabajo simple del 98%), pero ¿por qué hacerlo cuando alguien más ya lo ha hecho ?