2011-07-26 11 views
9

Sto sviluppando un'applicazione per Facebook che utilizza backbone.js 0.3.3 e sto cercando di far funzionare correttamente il pulsante Indietro per gli utenti.Aggiunta di stati della cronologia in un'app Facebook backbone.js (in iframe)

Backbone salva lo stato tramite l'hash dell'URL, utilizzato per eseguire il routing interno. Ad esempio, #home caricherà la home page e #session è un'altra pagina. La cronologia viene salvata quando questo accade al di fuori di un iframe, quindi puoi navigare correttamente usando il pulsante Indietro.

La navigazione all'interno dell'iframe non è un problema, e tutti i collegamenti funzionano, ma nessuna cronologia viene salvata dal browser.

La domanda:

The Facebook iframe punti a http://app.example.com, che è l'applicazione Backbone. Come posso attivare il pulsante Indietro per l'utente sull'app Facebook? Punti bonus per una soluzione esistente utilizzando Backbone.


Ho esaminato questa domanda da diversi punti di vista e non riesco a trovare una soluzione soddisfacente disponibile da nessuna parte. Sembra che pochissime app di Facebook utilizzino backbone/si basino così tanto su Javascript.

Penso che la soluzione sia aggiungere gli stati della cronologia alla finestra padre dell'iframe, ma non so come farlo. Cronologia HTML5? Una sorta di API di Facebook? Anche una soluzione parziale (per i browser moderni) è preferibile alla situazione attuale.

+0

Hai controllato se l'URL dell'iframe ha effettivamente l'hash come '# home' durante la navigazione dell'utente? Perché nell'iframe, Facebook dirotta un sacco di API JavaScript, quindi non sono sicuro che window.location venga dirottato. –

+0

@Cat Chen: l'attributo iframe 'src' è impostato su' javascript: "", e sto riscontrando problemi nel trovare un vero URL per l'iframe utilizzando la console di sviluppo di Chrome (penso che la politica dei domini sia un colpevole) . – Wylie

+0

Capisco. Ho una spiegazione (vedi la mia risposta), ma non ho ancora una soluzione. –

risposta

3

Penso che la tua applicazione di Facebook sia in una sandbox come lo chiamano Canvas. Perché è una sandbox, non è un iframe diretto con il codice sorgente dal tuo sito web. Il fatto è che Facebook legge il codice sorgente dal tuo sito web, lo inserisce nella loro sandbox e rende la sandbox nell'iframe.

Non sono sicuro se questo è ancora vero. Nelle vecchie applicazioni Facebook, all'interno di questa sandbox, vengono dirottate molte API JavaScript. Ad esempio, document.getElementById non è l'originale document.getElementById. È qualcos'altro, che può solo recuperare elementi all'interno della sandbox. Si assicurano che quasi tutte le API JavaScript che useresti agiranno come ci si aspetta, ma senza la possibilità di raggiungere qualsiasi posizione al di fuori della sandbox.

Un problema è che non prendono in giro il comportamento originale window.location. Penso che sia perché si aspettano che dovrebbe essere al di fuori del tuo scopo. La tua applicazione vive nella tela (sandbox) e la sandbox vive nell'iframe. Quindi l'iframe dovrebbe essere qualcosa fuori dalla tua portata.

Non ho alcuna idea di implementare un supporto dell'API storia in Facebook Canvas finora. Poiché l'intera pagina è dirottata da Facebook e non puoi mettere nulla nel dominio di Facebook, la tua pagina è in realtà in un dominio che non puoi controllare. Con una situazione come questa, non riesco a pensare ad una possibile soluzione finora.

+0

Questa è una buona spiegazione, non è qualcosa di cui ero a conoscenza, ma potrebbe potenzialmente spiegare perché la cronologia non viene salvata. Mi piacerebbe comunque una soluzione che ci consenta di avere una cronologia, ma se è impossibile smetterò di provare ad aggiungere funzionalità limitate da Facebook. – Wylie

+0

Puoi inserire un iframe all'interno della tela? Se puoi, puoi provare a registrare la cronologia con quell'iframe. –

+0

@Jeff: Potresti elaborare? Sono a conoscenza delle restrizioni interdominio sugli iframe, ma in molti casi gli iframe _can_ salvano la cronologia. – Wylie

Problemi correlati