项目需要做一个类似的播放器.要求是多次点击只能往一个已打开的播放页面添加歌曲,不能不同的页面点击一次就打开一个新的播放窗口.晚上回家研究了一下,发现百度音乐是属于在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效率的问题,这样的方案是否合理?一直以来从来没法过帖,分很少,希望各位见谅.

解决方案 »

  1.   

    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就可以了
      

  2.   

    提完这个问题之后CSDN一直说维护刷新不出来,后来就是出差去外地一直没办法上网.结帖结晚了,非常抱歉.但是非常开心的是回来看到您给出的非常详细的解答,在此非常感谢了.这个target来确定命名的方法试了,非常好用.比之前的很多想法都简单明了.再一次感谢您.第一次结贴,如果分数给错了,还烦请您指出.