2012-03-31 17 views
1

我想在主页上放置一个音乐播放器(甚至可能是同一个应用程序/域中的每个页面),并在文档加载时播放歌曲。但是用户可以同时打开包含该播放器的页面的多个实例。因此,如果用户打开具有相同url的窗口w1,w2,w3,如何让一次只有一个窗口播放歌曲?例如,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

简短的回答,你不能!很长的回答,如果新的窗口被第一个窗口打开,您可以控制某些窗口,并且可以将某种标志传递给打开的窗口,如果用户决定随机打开同一个页面十次,则没有多少除了可能设置一个cookie或使用本地存储来查看该页面已被打开,但是接下来必须在window.unload等上再次删除该值,并且这一切都变得非常不可靠。 – adeneo 2012-03-31 02:32:10

回答

3

实际上,您可以使用cookie做一个解决方法。

  • 如果您设置了一个说明播放器处于打开状态的cookie,则可以在加载时检查Cookie。
  • 您可以使用onbeforeunloadonunload声明窗口关闭的cookie。
  • 您可以让其他窗口轮询cookie值以检查窗口是否已关闭。然后他们可以从那里接。

但问题是cookie的准确性以及时间。

  • 如果浏览器“跳过节拍”并忘记声明封闭的窗口,该怎么办?
  • 如果其他选项卡同时拾取关闭值事件,该怎么办?两个球员都会打?
  • 如果浏览器崩溃并且窗口状态cookie处于“打开”状态,该怎么办。你如何知道你是否从坠机事件中醒来?

另外一种方式来做到这一点是通过storage events using localStorage。每个Web应用程序

一个本地存储,具有5MB的最大尺寸,适用于特定的浏览器,并通过所有窗口和浏览器的标签页共享...如果您在多个标签和窗口运行MyWebApp,他们(Chrome)

当向LocalStorage或SessionStorage添加,修改或删除数据时,会在当前浏览器选项卡或窗口中触发StorageEvent。该Storage事件包含事件发生的存储对象,应用该存储的文档的URL以及已更改的密钥的旧值和新值。任何注册此事件的监听者都可以处理它。

但是,需要提醒的,除了它是一个HTML5技术:

虽然HTML5规范要求的存储事件在同一浏览器的所有选项卡或同一浏览器的所有窗口被解雇,目前很少有浏览器实现这一点。

+1

使用超时机制可能会解决您在此处列出的大多数问题。我更新了问题并添加了逻辑代码。 HTML5可能还有点用处。 – btpka3 2012-03-31 10:59:55

1

@adeneo的答案是:你必须使用cookies来管理谁可以发挥的力量。这很复杂,但可能。

相关问题