有没有办法控制同域名下的其他页面(非父--子)?请教下音乐播放器只同时打开一个的问题

elig_luan 2012-09-05 08:37:10
项目需要做一个类似的播放器.要求是多次点击只能往一个已打开的播放页面添加歌曲,不能不同的页面点击一次就打开一个新的播放窗口.

晚上回家研究了一下,发现百度音乐是属于在A页面打开窗口后B后,只能A页面点击不同的音乐都在B窗口切换,如果新建一个空白页面然后手动输入地址再访问,因为这个新地址不是现有的B窗口的父页面,所以不能控制,点击后会打开一个新的播放窗口页面.


QQ音乐的则比较有趣.它是通过cookie实现的..举例:
先试听了A和B两首歌曲,这时候打开一个新的页面,页面加载后播放音乐C,再回到先开始的页面,播放D.这时候全部关闭后,新打开一个页面,播放列表里的是ABD这3首歌.应该是页面的播放器在执行播放动作时,会把当前页面播放器的播放列表存入COOKIE,从而覆盖了别的页面的播放器列表.

但是其中有个功能是我想要实现的,就是甲页面的播放器正在播放,而如果乙页面的播放器点击播放后,会自动让甲页面的播放器暂停.


另外,虾米网的音乐播放器,则完全实现了不管页面如何在新标签还是新窗口打开,甚至复制标签,都能指向同一个已有的播放器页面,而不会打开新的

当时白天在公司开会的时候,我的思路是播放器页面用一个setInterval不断向服务器发送一个ajax请求,判断session里保存的播放列表,或者说一些定义好的动作参数,来决定页面的具体动作.

但是这个存在一个通信延时的问题.

晚上看到QQ用的是cookie,正好提醒了我,不需要用ajax请求而直接每次去cookie里读取一些控制参数.

不知道各位对这个方案有什么看法没有?希望大家不吝赐教


另外, 也想请教下各位,QQ播放器刚才描述的,乙页面播放的同时甲页面的停止,是不是用的JS来控制其他的页面的方法?

因为印象中JS只能控制由自己打开的页面. JS水平有限,如果说错了还请各位海涵.

如果不能的话,是不是每个页面生成一个类似于令牌的字符串,同样通过cookie,乙页面有播放请求了的话,去cookie里将一个比如叫"current_player"的值换成自己的令牌,其他页面的播放器在读取cookie一旦发现这个值被替换成了非自己令牌的内容的话,停止自己的播放动作.


这样的话涉及到一个js读取cookie效率的问题,这样的方案是否合理?

一直以来从来没法过帖,分很少,希望各位见谅.
...全文
126 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
elig_luan 2012-10-01
  • 打赏
  • 举报
回复
提完这个问题之后CSDN一直说维护刷新不出来,后来就是出差去外地一直没办法上网.

结帖结晚了,非常抱歉.但是非常开心的是回来看到您给出的非常详细的解答,在此非常感谢了.这个target来确定命名的方法试了,非常好用.

比之前的很多想法都简单明了.

再一次感谢您.

第一次结贴,如果分数给错了,还烦请您指出.
泡泡鱼_ 2012-09-06
  • 打赏
  • 举报
回复
1:如果你想要的是当前有播放页,然后用户又选择了新歌曲播放时,要求在原有播放页打开。则链接中加上target='_play'即可
<a href='对应的播放页地址' target='_play'>歌曲1</a>
<a href='对应的播放页地址' target='_play'>歌曲2</a>
<a href='对应的播放页地址' target='_play'>歌曲3</a>
……
<a href='对应的播放页地址' target='_play'>歌曲n</a>


2:如果你是要在当前有播放页[A]时用户在歌曲列表页[B]选择增加歌曲时,直接在当前播放页[A]的播放列表中添加。那么:
1:B页面中取得了用户选择的所有歌曲后
var newWindow;
try{
newWindow= open('','_play');//_play为A页面的window.name,后面会说到
newWindow.add2playlist(list);//list为用户所选择的全部歌曲ID,可以用,号进行拼接
}catch(e){
//先执行将list写入cookie中的操作,写cookie时domain的设置必须与A页面[播放页]中获取cookie时的domain值一致,且为同一主域下
newWindow = open('你的播放页地址','_play');}
}

2:A页面[播放页]:
  2.1:window.name = '_play';
2.2:
function Initplaylist(){
//初始化播放列表,从cookie中获取
}
function add2playlist(list){
//执行将list中所包含的所有歌曲列表加入当前列表的操作
}

如此:
当用户选择增加歌曲,
1:并未存在播放页时,将open一个以_play命名的播放页,并在Initplaylist函数从cookie中获取用户选择的歌曲列表来进行列表初始化。
2:如果存在播放页时,将直接调用播放页中的add2playlist函数来进行列表的增加操作

以上代码是我N年前做音乐站时使用的方法,在IE中绝无问题,其他浏览器并没进行测试。

至于你上面说的两个页面的播放状态进行关联,你说的cookie处理方法也是可行的。两个页面都加多一个定时器去检查cookie就可以了

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧