タブ間の通信とアクティブなタブの識別のタスク

タスクの良い例はvk.comです。 1つのタブで音楽またはビデオを再生するたびに、他のタブで再生が停止します。 また、この問題を解決するためにインターネットにアクセスすると、 Storage EventsPage Visibility APIの説明、またはVisibility.jsなどの既製のソリューションも見つかるはずです。

ハブには、これらの事柄の概要がすでにありました 。たとえば、 ここなどです。



私はこの道を歩きましたが、私に合った解決策はありませんでした。 シンプルで軽量で、詳細を詳しく調べる必要のないものが欲しかった。

最終的に判明したソリューションの名前はDuelJS(ランダムに一意の名前)になりました。以下では、不必要な批判を避けるために、Visibility.jsと比較してみます。

アクティブなタブ


visibility.jsの「このタブは現在アクティブです」という状態を簡単に反映するための便利なクロスブラウザーラッパーは、次のようになります。

if ('visible' == Visibility.state()) { //    } 

[可視性]タブには3つの状態があります: visiblehiddenprerender

Visibilityには、タブのアクティブ化、アクティブウィンドウでのsetIntervalなど、さまざまなイベントで待機できるコールバックもあります。

DuelJSの哲学はわずかに単純化されています。
1.すべてのタブには、 マスタースレーブの 2つの状態しかありません
2.マスタータブは、作業が実行されるタブです-これ以上、誰もがスレーブを持っています。

このアプローチでは、 window.isMaster() -タブがウィザードであるかどうかを確認する関数のみで十分です。

 if (window.isMaster()) { //    } 

タブ間の通信


次に、タブ間の通信に渡します。 Storage Eventsを使用するのが最も適切なソリューションのように思えましたが、問題がないわけではありません。 ちなみに、GoogleでpostMessage APIやWebSocketを使用するなどのオプションもありました。

ストレージイベントの主な問題は、 一部の MSIEによる不十分なサポートです。ただし、最近まで、他のブラウザでもこの問題が発生する場合がありました。

Visibility.jsは基本的にPage Visibility APIのラッパーであるため、Storage Eventsを使用した作業はありません。

DuejJSには、ストレージイベントのクロスブラウザーラッパーがあります。これは、次の哲学で表されています。
1.タブ間の通信は、チャネルを使用して実行されます
2.チャンネル内で、タブはこのチャンネルの他のタブが応答できるイベントをトリガーできます。

チャネルの作成は非常に簡単です。

 var ch = duel.channel('channel_name'); // channel_name -   

次に、 qwertyイベントが呼び出されたときの動作を定義します。

 ch.on('qwerty', function (a, b, c, ...) {}) 

チャネルのonメソッドは、その動作を決定します。 2番目のパラメーターで渡される関数には、好きなだけ引数を含めることも、まったく引数を持たないこともできます。

イベントの実行も同様に簡単です。 onという単語 broadcastに置き換えられ、渡された引数はイベント名の後に挿入されます。

 ch.broadcast('qwerty', a, b, c, ...) 


vk.comのような動作を持つプレーヤーを作成する


せっかちな読者のために、私はすぐに実際の例へのリンクを提供します。

アプリケーションの主な本質は、次の3行です。
1. var player = duel.channel( 'player'); (チャネル定義)
2. player.on( 'stop'、function(){...(停止イベントの動作を決定する)
3. player.broadcast(「停止」); (停止イベントを開始)

完全なページコードは次のとおりです。
 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <!--  (title)    . --> <script type="text/javascript" src="duel.min.js"></script> <link rel="stylesheet" type="text/css" href="pretty.css"> </head> <body> <!-- div #preview     ,      iframe   youtube --> <div id="preview"><div>PLAY</div></div> <a href="index.html" target="_blank">  </a> <script type="text/javascript"> /**     player */ var player = duel.channel('player'); /**   - */ var previewDiv = document.getElementById('preview'); /** *     player */ player.on('stop', function () { /** *  iframe */ var frame = document.getElementsByTagName('iframe')[0]; frame.parentNode.removeChild(frame); /** *   */ previewDiv.style.display = 'block'; /** *    */ document.title = ''; }); previewDiv.onclick = function () { /** *   stop   player */ player.broadcast('stop'); /** *    iframe    youtube */ var frame = document.createElement("iframe"); frame.width = '859'; frame.height = '480'; frame.src = '//www.youtube.com/embed/xsV8TrF4gN0?rel=0&autoplay=1'; frame.frameborder = '0'; /** *        */ previewDiv.parentNode.insertBefore(frame, previewDiv.nextSibling); previewDiv.style.display = 'none'; /** *    */ document.title = '...'; } </script> </body> </html> 



おわりに


このソリューションがあなたを助け、あなたがあなたのプロジェクトでそれを使用するならば、私は非常にうれしいです。 私は改善のためのアイデアを受け入れています。 Libaはクロスブラウザであり、組み込みのハッキングによりIEを含めて動作します。



便利なリンク


サイト上の簡単なDuelJSドキュメント
GitHubのDuelJSリポジトリ
DuelJSの別のデモ
ドキュメントを読む

Source: https://habr.com/ru/post/J247739/


All Articles