3

好吧,我找到了一堆关于window.onblur和window.onfocus等原生函数的答案......但它们无济于事,所以我想更具体一些

  1. 假设您打开一个网站的多个标签
  2. 假设您收到一条消息,并且有声音宣布消息
  3. 当您打开了多个选项卡时,您会听到打开选项卡数量的声音。这是一首how'd'u'callit交响曲

到目前为止我找到的最佳解决方案,但不起作用 1. window.onfocus 和 window.onblur 2. 如果var infocus评估为真,则播放声音,如果不是,则不要播放 3. 它是跨浏览器 4. 它是简单 5. 它不起作用

为什么最好的解决方案行不通?假设您将焦点切换到不同网站的另一个选项卡,您的网站会失去焦点,因此您将听不到声音。更糟糕的是,假设您切换到另一个程序,然后浏览器本身失去焦点,您将听不到声音

那我该怎么办?

4

3 回答 3

1

您可以将最后一个 onFocus() 事件的时间戳保存在 JavaScript 变量和 cookie 中(访问设置为您的网站根目录)。然后,当您想播放警报声音时,您将变量和 cookie 的当前值进行比较,并且仅在两者匹配时才播放声音。

于 2012-05-23T11:01:04.227 回答
1

好吧,两周后我似乎找到了真正的解决方案。这实际上证明了如果你想做某事,不要寻求帮助,只要去做

这就是我所做的:

  1. 创建一个带有随机 id 和当前时间 (winid + t1) 的 cookie。cookie 由加载时打开的每个选项卡创建。document.cookie = 'winid='+winid+t1;

  2. 创建一个函数,它将更新设置的 cookie 中的当前时间,例如,每 3 秒(我有点不喜欢溢出客户端,所以它是 3 秒而不是 1)。如果该函数发现 cookie 中的 winid 和当前选项卡的 winid 不匹配并且已过去 3 秒,则该选项卡已关闭,请在同一函数内重新定义主选项卡。window.setInterval(setwinid,3000);

  3. 就是这样,每次你需要,比如说,播放一个声音,你应该先检查一下,是不是要播放它的标签

诀窍是每个选项卡都有自己的 winid。但是只有一个 winid 存储在 cookie 中,被更新,因此允许一个选项卡执行操作。很简单。我实际上开始使用这种方法来更新所有标签框中的消息,而不仅仅是播放音乐

于 2012-06-07T05:19:26.130 回答
0

一种解决方案是拥有一个只播放一次通知的服务器端解决方案。您没有指定站点如何接收消息,但我假设它是某种形式的 AJAX 调用,它从服务器获取消息并将消息保存在数据库中。

向数据库添加一个标志,表示消息已发送。在用户的浏览器第一次查询新消息时设置标志。只有在没有设置标志的情况下,页面本身才播放声音,否则不播放声音。现在只有获取消息的第一页才会播放声音。

于 2012-05-23T10:59:24.897 回答