2012-03-31 4 views
1

Ich möchte einen Musik-Player auf der Startseite platzieren (vielleicht sogar jede Seite innerhalb der gleichen Anwendung/Domäne) und Lieder beim Laden von Dokumenten spielen. Der Benutzer kann jedoch mehr als eine Instanz der Seite öffnen, die diesen Player zur gleichen Zeit enthält.Kommunikation zwischen mehreren Benutzer geöffneten Fenstern mit der gleichen URL

Also, wenn der Benutzer die Windows w1, w2, w3 mit der gleichen URL geöffnet, wie nur ein Fenster Songs gleichzeitig abspielen lassen? Zum Beispiel, w1 spielt, w2 und w3 nicht. Und wenn w1 geschlossen ist, sollten w2 und w3 in der Lage sein, dieses Ereignis zu finden, und dann zum Abspielen von Liedern wählen, und nur der Gewinner kann Lieder spielen.


Update: nach den geben Hinweisen, ich denke, das sollte in der Lage zu arbeiten:

// LOGICAL CODE 
// Cookie["playerId"] - record which player instance is running 
// Cookie["lastRefreshTime"] - record the running player last update time 
//  when running player instance is destoried (window is closed), and timeout, 
//  the left player instances should be able to modify Cookie["playerId"] for running. 
function Palyer(){ 
    this.playerId = randomString(); 
    var _this = this; 
    this.refreshHandle = setInterval(function(){ 
    // non-running players to check whether timeout, then competing 
    if(Cookie["playerId"] != _this.playerId 
     && sysTime - Cookie["lastRefreshTime"] > 1000*2){ 
     // competing for run, may have small probability going wrong 
     Cookie["playerId"] = _this.palyerId; 
    } 

    // running player to update timestamp for avoding timeout 
    if(Cookie["playerId"] == _this.playerId){ 
     Cookie["lastRefreshTime"] = sysTime; 
     if (!_this.isInitialized()) { 
     _this.init(); 
     } 
    } 
    }, 1000); 
    ... 
} 
var player = new Player(); 
+0

Kurze Antwort, können Sie nicht! Lange Antwort, wenn die neuen Fenster durch das erste Fenster geöffnet werden, das Sie kontrollieren können, und eine Art Flag an die geöffneten Fenster weiterreichen kann, wenn der Benutzer gerade entscheidet, die selbe Seite zehn Mal zufällig zu öffnen, gibt es nicht viel, was Sie können Machen Sie nichts anderes, als vielleicht einen Cookie zu setzen oder lokalen Speicher zu verwenden, um zu sehen, dass die Seite bereits geöffnet wurde, aber dann müssen Sie diesen Wert erneut auf window.unload usw. entfernen und alles wird sehr unzuverlässig schnell. – adeneo

Antwort

3

tatsächlich können Sie eine Abhilfe mit Cookies machen.

  • überprüfen Sie die Cookies beim Laden, wenn Sie einen Cookie setzen, der besagt, dass ein Spieler geöffnet ist.
  • können Sie ein Fenster geschlossen Cookie mit onbeforeunload oder onunload deklarieren.
  • Sie können die anderen Fenster den Cookie-Wert abfragen lassen, um zu überprüfen, ob ein Fenster geschlossen wurde. dann können sie von dort abholen.

aber das Problem ist die Genauigkeit des Cookies sowie Timing.

  • Was passiert, wenn der Browser "einen Schlag überspringt" und vergessen hat, ein geschlossenes Fenster zu deklarieren?
  • Was ist, wenn die anderen Registerkarten das Close-Value-Ereignis gleichzeitig aufnehmen? beide Spieler werden spielen?
  • Was passiert, wenn der Browser abstürzt und der Fensterstatus-Cookie "offen" bleibt? Wie würdest du wissen, wenn du von einem Unfall kommst?

eine andere Art und Weise Sie dies über storage events using localStorage tun können.

One Localstorage per Web-Anwendung, mit einer max Größe von 5 MB ist für einen bestimmten Browser zur Verfügung und wird von allen Fenstern und Tabs des Browsers geteilt ... Wenn Sie MyWebApp in mehreren Tabs und Fenster laufen, sie alle haben die gleichen LocalStorage-Daten und unterliegen einem maximalen Limit von 5 MB. (Chrome)

Wenn Daten zu LocalStorage oder SessionStorage hinzugefügt, geändert oder daraus entfernt werden, wird ein StorageEvent innerhalb der aktuellen Browser-Registerkarte oder des Fensters ausgelöst. Dieses Speicherereignis enthält das Speicherobjekt, in dem das Ereignis aufgetreten ist, die URL des Dokuments, für das dieser Speicher gilt, sowie die alten und die neuen Werte des Schlüssels, der geändert wurde. Jeder für dieses Ereignis registrierte Listener kann damit umgehen.

aber die Einschränkung, außer dass es ein HTML5-tech:

Obwohl die HTML5-Spezifikation fordert Speicher Ereignisse in allen Registerkarten des gleichen Browser oder alle Fenster des gleichen Browser abgefeuert werden, Einige Browser implementieren dies derzeit.

+1

Die Verwendung des Timeout-Mechanismus kann die meisten hier aufgelisteten Probleme lösen. Ich habe die Frage aktualisiert und einen logischen Code hinzugefügt. HTML5 kann noch ein wenig weit zur Verwendung sein. – btpka3

1

@adeneo es beantwortet: Sie haben die Verwendung von Cookies zu verwalten, die die Macht zu spielen hat. Es ist komplex aber möglich.

Verwandte Themen