2012-03-31 11 views
1

私は、同じアプリケーション/ドメイン内のすべてのページであっても、ホームページに音楽プレーヤーを置き、ドキュメントの読み込み時に曲を再生したいと考えています。しかし、ユーザーは、このプレーヤーを含むページの複数のインスタンスを同時に開くことができます。同じURLの複数のユーザーが開いているウィンドウ間の通信

したがって、ユーザーが同じURLのウィンドウw1、w2、w3を開いた場合、一度に1つのウィンドウで1つのウィンドウのみを再生させる方法はありますか?たとえば、w1は再生し、w2とw3は再生しません。そして、w1とw2とw3は、このイベントを見つけて、曲を選ぶことができ、勝者だけが曲を演奏できるはずです。


更新:与えるヒントに従って、私はこれが動作することができるはずだと思う:

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

短い回答、できません!長い答えは、最初のウィンドウで新しいウィンドウを開いたときに何らかのコントロールがあり、開かれたウィンドウに何らかのフラグを渡すことができます。ユーザーがランダムに同じページを10回ランダムに開くと決めると、クッキーを設定したり、ページがすでに開かれていることを確認するためにローカルストレージを使用したりすることを除いて、それについてはやってください。しかし、window.unloadなどでその値をもう一度削除する必要があります。 – adeneo

答えて

3

実際には、Cookieを使用して回避策を講じることができます。

  • プレーヤーが開いているというCookieを設定すると、負荷時にCookieを確認できます。
  • onbeforeunloadまたはonunloadを使用して、閉じたクッキーを宣言することができます。
  • 他のウィンドウにクッキー値をポーリングさせて、ウィンドウが閉じられたかどうかを確認することができます。彼らはそこから拾うことができます。

しかし、問題はクッキーの正確さとタイミングです。

  • ブラウザが「ビートをスキップしました」と閉じたウィンドウを宣言するのを忘れた場合はどうなりますか?
  • 他のタブが同時にclose valueイベントを取得した場合はどうなりますか?両方のプレイヤーがプレイしますか?
  • ブラウザがクラッシュし、ウィンドウステータスCookieが「オープン」のままになっている場合はどうなりますか?あなたがクラッシュから来たかどうかあなたはどのように分かりますか?

あなたがこれを行うことができます別の方法はstorage events using localStorage経由です。

Webアプリケーションごとに最大5MBのローカルストレージを1つのブラウザで使用でき、そのブラウザのすべてのウィンドウとタブで共有されます...複数のタブとウィンドウでMyWebAppを実行すると、 (Chrome)

LocalStorageまたはSessionStorageにデータを追加、変更、または削除すると、現在のブラウザのタブまたはウィンドウ内でStorageEventが発生します。このStorageイベントには、イベントが発生したストレージオブジェクト、このストレージが適用されるドキュメントのURL、変更されたキーの古い値と新しい値の両方が含まれます。このイベント用に登録されたリスナーは、それを処理できます。

しかし、注意点、それはHTML5の技術だという以外:

ストレージイベントが同じブラウザのすべてのタブまたは同じブラウザのすべてのウィンドウで焼成されるためにHTML5の仕様は、呼び出したが、現在、これを実装しているブラウザはほとんどありません。

+1

タイムアウトのメカニズムを使用すると、ここにリストされているほとんどの問題が解決される可能性があります。私は質問を更新し、論理的なコードを追加しました。 HTML5はまだ少し使っているかもしれません。 – btpka3

1

@adeneoはそれに答え:あなたは、再生する力を持っている人に管理するためにクッキーを使用する必要があります。それは複雑ですが可能です。

関連する問題