3

了解しました。window.onblurやwindow.onfocusなどのネイティブ関数に関する回答がたくさん見つかりました...しかし、それらは役に立たないので、より具体的にしたいと思います。

  1. 1つのWebサイトの複数のタブを開いたとします
  2. メッセージを受信し、メッセージをアナウンスする音が鳴ったとします
  3. 複数のタブを開いているので、開いているタブの数だけ音が聞こえます。どのように'd'u'callit交響曲になります

これまでに見つけたが機能しない最善の解決策1.window.onfocusとwindow.onblur2.var infocusがtrueと評価された場合はサウンドを再生し、そうでない場合は再生しない3.クロスブラウザ4.シンプル5.動作しません

なぜ最良の解決策が機能しないのですか?別のWebサイトの別のタブにフォーカスを切り替えると、Webサイトのフォーカスが失われるため、音が聞こえなくなります。さらに悪いことに、別のプログラムに切り替えると、ブラウザ自体がフォーカスを失い、音が聞こえなくなります。

それで私は何をしますか?

4

3 に答える 3

1

了解しました。2週間後、本当の解決策を見つけたようです。これは、あなたが何かをしたいのなら、助けを求めるのではなく、ただそれをすることを実際に証明しています

これは私がしたことです:

  1. ランドンIDと現在の時刻(winid + t1)を使用してCookieを作成します。Cookieは、読み込み時に開いたタブごとに作成されます。document.cookie ='winid ='+ winid + t1;

  2. 設定されたCookieの現在の時刻をたとえば3秒ごとに更新する関数を作成します(クライアントをオーバーフローさせたくないので、1秒ではなく3秒です)。Cookie内のwinidと現在のタブのwinidが一致せず、3秒が経過したことが関数で検出された場合、タブは閉じられ、同じ関数内でプライマリタブを再定義します。window.setInterval(setwinid、3000);

  3. これは、たとえばサウンドを再生する必要があるたびに、それを再生するタブであるかどうかを最初に確認する必要があります。

秘訣は、各タブに独自のwinidがあることです。ただし、Cookieに保存されているwinidは1つだけであり、更新されるため、1つのタブでアクションを実行できます。ものすごく単純。私は実際にこの方法を使用して、音楽を再生するだけでなく、すべてのタブのボックス内のメッセージを更新し始めました

于 2012-06-07T05:19:26.130 に答える
1

最後の onFocus() イベントのタイムスタンプを JavaScript 変数と Cookie (Web サイトのルートに設定されたアクセス) に保存できます。次に、アラート サウンドを再生する場合は、変数と Cookie の現在の値を比較し、それら 2 つが一致する場合にのみサウンドを再生します。

于 2012-05-23T11:01:04.227 に答える
0

1 つの解決策は、通知を 1 回だけ再生するサーバー側のソリューションを用意することです。サイトがメッセージを受信する方法を指定していませんが、サーバーからメッセージを取得するのは何らかの形式の AJAX 呼び出しであり、メッセージはデータベースに保存されると思います。

メッセージが送信されたことを示すフラグをデータベースに追加します。ユーザーのブラウザが初めて新しいメッセージを照会するときにフラグを設定します。ページ自体では、フラグが設定されていない場合にのみサウンドを再生し、それ以外の場合はサウンドを再生しません。これで、メッセージを取得した最初のページだけがサウンドを再生します。

于 2012-05-23T10:59:24.897 に答える