2013-02-25 11 views
6

Ich habe einige Javascript, die auf die Verwendung von window.open und Inter-Window-Kommunikation angewiesen (wo das neue 'Kind' Fenster communicates success/failure to the 'parent' window).Erkennung der Browser-Unterstützung für Inter-Fenster-Kommunikation

Diese (Inter-Window-Kommunikation) funktioniert in den meisten Fällen gut, funktioniert aber nicht für einige Browser, die Inter-Window-Kommunikation nicht unterstützen. Beispiele umfassen Windows Phone und iPhone's UIWebView.

Ich mache derzeit Client-Seite (Javascript-basierte) user-agent sniffing, um diese Szenarien zu erkennen - und Fallback auf einen anderen Code-Pfad, um das Problem zu umgehen.

Gibt es eine Alternative zum User-Agent-Sniffing, die ich verwenden könnte?

Um klar zu sein, funktioniert die window.open (wo funktioniert bedeutet 'es öffnet die angeforderte URL'). Was nicht zuverlässig ist, verwendet window.opener und postMessage, um Inter-Window-Kommunikation vom 'Kind' zum 'Eltern' zu tun.

+0

Das Kind kann auch auf die window.opener-Eigenschaft zugreifen - die null sein sollte - aber das ist leider keine zuverlässige Erkennungstechnik. Wenn Sie beispielsweise das untergeordnete Fenster direkt öffnen (ohne window.open vom übergeordneten Element zu verwenden), ist window.opener gleich null, obwohl das untergeordnete Element tatsächlich die Kommunikation zwischen Fenstern unterstützt. – mjwills

+0

ich weiß 'window.open' wird funktionieren, aber wird die Funktion Kind Fenster ID zurückgeben? – Raptor

+0

Ich bin mir nicht sicher, wie es hilft, diese Informationen zu haben. Was ich will, ist Feature-Erkennung im untergeordneten Fenster, ob es mit seinem Elternteil sprechen kann. Der Rückgabewert des Funktionsaufrufs window.open ist offensichtlich nur für den Elternteil verfügbar, so dass "es sich eher auf der anderen Seite dieser luftdichten Luke befindet". Alles, was gesagt wird, die Überprüfung des Rückgabewerts ergibt Null in mobilen IE9 und ein Fensterobjekt in UIWebView. Beachten Sie, dass das neue Fenster in beiden Fällen korrekt geladen wurde (aber nicht mit dem übergeordneten Fenster kommunizieren kann). – mjwills

Antwort

2

In Ihrem Opener Fenster Nachricht Rückruf können Sie eine Antwort zurück zum Kind Fenster wie folgt senden:

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

Dann können Sie auf der Sendeseite einen Timer tun, die Sie löschen können, wenn die Antwort eintrifft:

// 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); 

Ich weiß, das könnte ein bisschen hackish Lösung sein, aber vielleicht weniger als User Agent Sniffing?

+0

Ich fürchte, ich missverstanden möglicherweise Ihren Vorschlag @sactor. Soll der erste Codeblock innerhalb des Elternfensters und der zweite Codeblock im Kindfenster platziert werden? Denken Sie daran, dass [postMessage an den Elternteil nicht funktioniert] (http://stackoverflow.com/a/12265816/34092). – mjwills

+0

Oder schlägst du vor, "versuch einfach postMessage, und wenn wir kein 'ack' zurückbekommen, dann wissen wir, dass es nicht funktioniert hat." Das könnte funktionieren, hat aber wahrscheinlich das gleiche Problem wie der zweite Kommentar zu meinem ursprünglichen Beitrag. Wenn also das untergeordnete Fenster direkt vom Endbenutzer in einem Browser geöffnet wird - und nicht im Fenster window.open des Elterns -, kann die vorgeschlagene Technik nicht erkennen, ob Inter-Frame-Kommunikation unterstützt wird oder nicht. – mjwills

+0

Ja, ich würde nur vorschlagen, ob wir zurückkommen. Ich dachte, dein Ziel sei es zu überprüfen, ob du tatsächlich die Nachricht an die Eltern bekommen kannst, nicht, wenn es theoretisch möglich ist (wenn es nicht falsch eröffnet wurde). Dafür habe ich leider keine Antwort. – sactor

Verwandte Themen