2011-07-26 10 views
9

Estoy desarrollando una aplicación de Facebook que usa backbone.js 0.3.3 y estoy tratando de hacer que el botón Atrás funcione correctamente para los usuarios.Agregando estados de historial en una aplicación de Facebook backbone.js (en iframe)

Backbone guarda el estado a través del hash URL, que se utiliza para enrutar internamente. Por ejemplo, #home cargará la página de inicio y #session es otra página. El historial se guarda cuando esto ocurre fuera de un marco flotante, por lo que puede navegar correctamente utilizando el botón Atrás.

La navegación dentro del iframe no es el problema, y ​​todos los enlaces funcionan, pero el navegador no guarda ningún historial.

La pregunta:

Las Facebook iframe puntos a http://app.example.com, que es la aplicación de Backbone. ¿Cómo puedo hacer que el botón Atrás funcione para el usuario en la aplicación de Facebook? Puntos de bonificación para una solución existente que utiliza Backbone.


He examinado esta cuestión desde varios ángulos y no puedo encontrar una solución satisfactoria disponible en ninguna parte. Parece que muy pocas aplicaciones de Facebook usan backbone/dependen tanto de Javascript.

Creo que la solución es agregar estados de historial a la ventana principal del iframe, pero no sé cómo hacerlo. Historia HTML5? Algún tipo de API de Facebook? Incluso una solución parcial (para navegadores modernos) es preferible a la situación actual.

+0

¿Ha comprobado si la url del iframe en realidad tiene el hash como '# home' durante la navegación del usuario? Porque en el iframe, Facebook secuestra una gran cantidad de JavaScript API, por lo que no estoy seguro de si se secuestra window.location. –

+0

@Cat Chen: el atributo iframe 'src' está establecido en' javascript: "" ', y tengo problemas para encontrar una URL real para el iframe con la consola de desarrollo de Chrome (creo que la política entre dominios es la culpable) . – Wylie

+0

Ya veo. Tengo una explicación (ver mi respuesta), pero aún no tengo una solución. –

Respuesta

3

Creo que su aplicación de Facebook está en una caja de arena a la que llaman Canvas. Debido a que es un entorno limitado, no es un iframe directo con el código fuente de su sitio web. El hecho es que Facebook leyó el código fuente de su sitio web, lo colocó en su caja de arena y lo renderizó en el marco flotante en el iframe.

No estoy seguro de si esto sigue siendo cierto. En las antiguas aplicaciones de Facebook, dentro de este entorno limitado, muchas API de JavaScript son secuestradas. Por ejemplo, document.getElementById no es el document.getElementById original. Es otra cosa, que solo puede recuperar elementos dentro de la caja de arena. Se aseguran de que casi todas las API de JavaScript que utilizará actúen como espera, pero sin la posibilidad de llegar a ninguna parte fuera de la zona de pruebas.

Un problema es que no se burlan del comportamiento original de window.location. Creo que es porque esperan que esté fuera de su alcance. Su aplicación vive en el lienzo (sandbox) y el sandbox vive en el iframe. Entonces, el iframe debería estar fuera de tu alcance.

No tengo idea de implementar una API histórica en Facebook Canvas hasta ahora. Como toda la página está secuestrada por Facebook y no puedes poner nada en el dominio de Facebook, tu página está en realidad en un dominio que no puedes controlar. En una situación como esta, no puedo pensar en una posible solución hasta el momento.

+0

Esta es una buena explicación, no es algo que yo sepa, pero podría explicar por qué no se guarda el historial. Todavía me gustaría una solución que nos permita tener un historial, pero si es imposible, dejaré de agregar funcionalidad que Facebook restringe. – Wylie

+0

¿Puedes poner un iframe dentro del lienzo? Si puede, puede intentar registrar el historial con ese iframe. –

+0

@Jeff: ¿Podrías dar más detalles? Soy consciente de las restricciones entre dominios en iframes, pero en muchos casos iframes _can_ save history. – Wylie

Cuestiones relacionadas