2013-02-25 7 views
6

Ho qualche javascript che si basa sull'uso di window.open e comunicazione inter-finestra (dove la nuova finestra "figlio" communicates success/failure to the 'parent' window).Rileva supporto browser per comunicazione inter-finestra

Questa (comunicazione tra finestre) funziona nella maggior parte dei casi, ma non funziona con alcuni browser che non supportano la comunicazione tra finestre. Gli esempi includono Windows Phone e iPhone's UIWebView.

Attualmente eseguo il client (basato su javascript) user-agent sniffing per rilevare questi scenari e il fallback su un percorso di codice diverso per risolvere il problema.

Esiste un'alternativa allo sniffing user-agent che potrei utilizzare?

Per essere chiari, window.open funziona (dove funziona significa 'apre l'URL richiesto'). Cosa non è affidabile sta usando window.opener e postMessage per fare comunicazione inter-finestra dal 'figlio' al 'genitore'.

+0

Il bambino può anche accedere alla proprietà window.opener - che dovrebbe essere nullo - ma sfortunatamente questa non è una tecnica di rilevamento affidabile. Ad esempio, se si apre direttamente la finestra secondaria (senza utilizzare window.open dal padre), window.opener sarà nullo anche se il bambino effettivamente supporta effettivamente la comunicazione tra finestre. – mjwills

+0

so che 'window.open' funzionerà, ma la funzione restituirà l'ID della finestra figlio? – Raptor

+0

Non sono sicuro di come possa essere utile avere queste informazioni. Quello che voglio è il rilevamento di funzionalità all'interno della finestra figlio per sapere se può parlare con il genitore. Il valore di ritorno della chiamata a funzione window.open è ovviamente disponibile solo per il genitore - quindi "è piuttosto coinvolto dall'altra parte di questo boccaporto ermetico". Tutto ciò che viene detto, controllando il valore restituito produce null in mobile IE9 e un oggetto finestra in UIWebView. E notare che in entrambi i casi la nuova finestra è stata caricata correttamente (ma non sarà in grado di comunicare con il suo genitore). – mjwills

risposta

2

Nel vostro apri messaggio finestra di richiamata si può inviare una risposta indietro alla finestra figlio in questo modo:

function yourMessageCallback(event) { 
    // your other handler stuff here... 
    event.source.postMessage('Yeah I got it', event.origin); 
} 

allora si può fare un timer sul lato di invio che è possibile cancellare quando la risposta arriva:

// do your postmessage here 

function notReceived() { 
    // do stuff if the message didn't go through 
} 

var messageTimer = setTimeout(notReceived, 500); // 500ms should be enough for everyone? 

window.addEventListener('message', function(event) { 
    // do necessary origin checks first etc... (not shown here) 

    if (event.data == 'Yeah I got it') { 
    clearTimeout(messageTimer); 
    // do stuff if the message went through 
    } 
}, false); 

so che questo potrebbe essere una soluzione hackish po ', ma forse meno di quanto user agent sniffing?

+0

Temo di poter fraintendere la tua proposta @sactor. Il primo blocco di codice deve essere inserito all'interno della finestra principale e il secondo deve essere inserito nella finestra secondaria? Tieni presente che [postMessage al genitore non funzionerà] (http://stackoverflow.com/a/12265816/34092). – mjwills

+0

O stai suggerendo 'prova solo postMessage, e se non otteniamo un' ack 'allora sappiamo che non ha funzionato'.? Potrebbe funzionare ma probabilmente ha lo stesso problema del secondo commento sul mio post originale. Pertanto, se la finestra secondaria viene aperta direttamente dall'utente finale in un browser, anziché dalla finestra padre. Apen, la tecnica proposta non sarà in grado di rilevare se la comunicazione tra frame è supportata o meno. – mjwills

+0

Sì, sto solo suggerendo di controllare se torniamo indietro. Pensavo che il tuo scopo fosse quello di verificare se puoi effettivamente ottenere il messaggio al genitore, non se è teoricamente possibile (se non è stato aperto nel modo sbagliato). Per questo non ho purtroppo una risposta. – sactor