2011-02-11 8 views
8

Estoy desarrollando una aplicación web con CodeIgniter en back-end y Backbone.js en front-end. También estoy usando HTML5 Boilerplate como mi plantilla de inicio.Backbone.js causa error solo en IE7

Estoy usando el controlador e historial de Backbone como navegación principal a través de mi aplicación. Lo he hecho una vez en el pasado y todo ha funcionado bien. El problema es que cuando comienzo la captura de eventos de hashchange con Backbone.History.start() y hago clic en un enlace example.com/#home, el cambio de hash en la url, el evento se dispara pero 2 segundos después, se borra el hash desde url y un error de javascript se lanza solo en ie7.

He echado un vistazo al código fuente y el evento hashchange se logra en IE7 creando un IFRAME ejecutando un intervalo para verificar el cambio del valor hash.

¿Alguien ha tenido este extraño error antes y sabe cómo solucionarlo?

Respuesta

4

La forma correcta de manejar una aplicación de base #hash con Backbone parece Backbone.history.saveLocation (hash) y después de Backbone.history.loadUrl() para el controlador de capacitación de enrutamiento

Whish i sabía esto antes ... Diviértete con esta biblioteca impresionante MVC :)

+0

'Backbone.history.start()' funciona correctamente, excepto para IE7. Parece que IE7 no desencadena un evento 'hashchange'. En mi caso, utilicé ['Modernizr.hashchange'] (http://www.modernizr.com/docs/#hashchange) para verificar primero si es compatible. Si no, usaré '.saveLocation()' y '.loadUrl()'. – Shiki

2

Al hacer clic en un hash-URL no se guarda una entrada del historial en IE, use la función saveLocation de Backbone para colocar un marcador de una ubicación a la que desee volver. Para la primicia, consulte:

http://documentcloud.github.com/backbone/#Controller-saveLocation

+1

Desafortunadamente, saveLocation de Backbone no desencadena el evento hashchange y toda mi aplicación necesita esta característica. Tengo este error en la consola de depuración de IE 'SCRIPT1014: carácter inválido javascript: 0, línea 1 carácter 2;' que parecen estar relacionados con IE invisible IFRAME. ¿Alguna idea para solucionarlo? –

+0

He probado otro tutorial de Backbone.js que hace uso de la historia de Backbone y ocurre el mismo problema en IE7. Aquí está la URL de la demostración hecha por Elf Sternberg [link] (http://clients.dominic-mercier.com/backbone/). Como puede ver, cuando hace clic en un elemento, el hash cambia a # elemento/c1 y vuelve a cambiar a # después de 50 ms (que es el marco de intervalo que comprueba el cambio de hash). ¿Tal vez ambos usamos la historia del Backbone equivocado? ¿Puedes proporcionar algún uso real del caso? –

+0

El problema es que el comportamiento en ie7 es completamente diferente de otro navegador.La etiqueta hash no se carga en la carga de la página, la etiqueta hash no se guarda en el historial automáticamente después de un cambio como en otros navegadores. Supongo que esto debe abordarse en el futuro para que todos los navegadores se comporten de la misma manera. – Julien

1

he encontrado una solución para este problema de Jon Leighton en la lista tema oficial: https://github.com/documentcloud/backbone/issues/228

Hasta que un oficial parche añadir esto a los Backbone.js (línea 689 en Backbone 0.3.3)

 
this.iframe.document.open().close(); 
this.iframe.location.hash = window.location.hash; 

después de la línea siguiente:

this.iframe = $('iframe src="javascript:0" tabindex="-1" ').hide().appendTo('body')[0].contentWindow;

(no pude escribir la etiqueta i-frame completo < & /> - que NO ES permitido aquí :))

+0

Uh ... desafortunadamente el navegador no funciona en IE7. –

3

La solución que he encontrado para el trabajo era utilizar Ben Alman de hashchange plugin. Vaya a la función de inicio en Backbone.History y reemplace el código de la función de inicio con esto.

 
start : function() { 
    $(window).hashchange(this.checkUrl); 
    return this.loadUrl(); 
} 

Y asegúrese de incluir el archivo de complemento hashchange en su código.