日期:2013-12-01  浏览次数:20719 次

     时下很多人用CenFun Music Player播放器(论坛:http://bbs.cenfun.com/),并把它引到QQ空间,给爱扮QQ空间的Q族们炫了一把.前几天用千千静听的WMP11皮肤做背景做了个flashMP3播放器,视觉效果还不错.并把它放到   http://bbs.cenfun.com/dispbbs.asp?BoardID=2&ID=2710&replyID=9167&skin=1里展览,没想到很多人说这播放器漂亮,要我给他们.我想作品能得到大家的喜欢,当然是件快乐的事,给就给吧.(首先说明下我flashMP3播放器包含的文件:eote.swf和songs.xml,eote.swf是flashMP3,songs.xml是外部更新mp3信息文件).
      不过很快就收到他们反映的问题:在存放flashMP3播放器的空间上是可以播放的,但把eote.swf引到QQ空间或其他论坛时就播放不了.我检查了一遍,发现援用到QQ空间或其他论坛时载入不了songs.xml,由于我是在flash中是这样载入ongs.xml的:myxml=new XML();myxml.load("songs.xml")用的是绝对路径,这样当把eote.swf引到其他地方时,自然就不能载入songs.xml了,自然也就不能播放了.既然找到了问题,就要处理它.也许你会说,把myxml.load("songs.xml")改成绝对路径不就行了吗?对,没错,这样是行了,但当这个播放器放于不同的空间时,songs.xml的地址也就不同了,这时就不得一个个来改myxml.load("songs.xml")的绝对路径了,这样做实在是太麻烦了!一两个还行,上百上千上万个那还不得累个半死.
      我的想法就是:有没有办法让eote.swf来检测songs.xml的绝对路径,这样就不必每换一个存放空间就改一次.有了绝对路径,eote.swf引到其他地方时也能播放.有了想法,但要处理这个问题对我来说还是有点难,想好久也没想通,我就上论坛求助.
cenfun论坛:http://bbs.cenfun.com/dispbbs.asp?boardID=2&ID=2779&page=1
闪吧论坛:http://space.flash8.net/bbs/thread-318889-1-1.html
经典论坛:http://bbs.blueidea.com/thread-2710072-1-2.html
蓝屋的快闪分坛:http://www.hslk.com/lkbbs/dispbbs.asp?boardID=2&ID=9195&page=1
      由于表达不是很清楚,致使大家很多人都不知我要问什么.问题也就得不到处理.在回答我的问题中,经典论坛的一位坛友给了我启示:_root._url. 查看协助,了解到_url是检索创建的 SWF 文件的 URL,我用trace(_root._url),发现前往的是该SWF 文件的绝对地址.有兴味的朋友的可以做个试验:在主场景创建一个动态文本,实例名为:testurl_txt,在第一帧写AS:
testurl_txt.text=_root._url;
导出名为testurl.swf文件,放到空间上去,会发现前往的是testurl.swf绝对路径.那么,放在http://hcf214236.808.nuno.cn/空间的eote.swf的绝对地址就是http://hcf214236.808.nuno.cn/eote.swf(你这话不是废话吗?),至此我们学会了在flash怎样获得eote.swf文件的绝对地址(用_root._url). 这时有人就问了,你获得eote.swf的绝对地址有什么用,和songs.xml文件有关系吗?有关系,这关系相当的大了,由于eote.swf文件和songs.xml是放在同一目录的(假设是这样的),那么songs.xml的绝对路径就是http://hcf214236.808.nuno.cn/songs.xml(又是废话一句).有了eote.swf的绝对路径,我们应该怎样让eote.swf本人判断songs.xml的绝对路径呢?我们再看看eote.swf和songs.xml的绝路径:http://hcf214236.808.nuno.cn/eote.swf, http://hcf214236.808.nuno.cn/songs.xml,细心看后,会发现  http://hcf214236.808.nuno.cn/这部分是相反的.既然找到了共同点,那就好办了,我们只需把http://hcf214236.808.nuno.cn/eote.swf拆分为两部分,http://hcf214236.808.nuno.cn/和eote.swf,把第一部分加在songs.xml的前面,就得songs.xml的绝对路径了(怎样还是废话啊!),
myxml=new XML();
myxml.load("http://hcf214236.808.nuno.cn/"+"songs.xml")
总结一下:
原理就是这样:首先通过_root._url获得eote.swf的绝对路径,然后把eote.swf的绝对路径分割为http://********/和eote.swf两部分.把 http://********/附加到songs.xml的后面(前提是eote.swf和songs.xml必须在同一目录).获得eote.swf的绝对路径我们曾经处理了,接下来的就是把eote.swf的绝对路径分割为http://********/和eote.swf两部分提到分割,可能很多人都会想到String里的split方法,该方法是:
split(String.split 方法),public split(delimiter:String, [limit:Number]) : Array. 在指定的 delimiter 参数出现的所有位置断开String 对象,将其拆分为子字符串,然后以数组方式前往子字符串。如果使用空字符串 ("") 作为分隔符,则该字符串中的每个字符都将作为一个元素放入到数组中。如果未定义delimiter 参数,则会将整个字符串放入前往的数组的第一个元素中。既然知道了方法,我们还等什么,赶快动手吧!在第一帧写AS:
var rooturl_String = new String(_root._url);
//定义String对象,并把_root._url的值作为字符串附加给这个对象.
var rooturl_Array = rooturl_String.split("testurl.swf");
//以testurlswf为分割符,把_root._url的值拆分为两个子符串,并存放在rooturl_Array数组里.
var testxml = new XML();
//定义XML对象
testxml.ignoreWhite = true;
//忽略空白
System.useCodepage = true;
//防止载入外部文本时出现乱码
testxml.load(rooturl_Array[0]+"test.xml");
//把rooturl_Array的第一部分附加在test.xml后面,这样就得到test.xml的绝对路径了
testxml.onLoad = function(success) {
if (success) {
  testxml_txt.text = testxml;
} else {
  testxml_txt.text = "载入出错!请检查";
}
};
第二步:创建个动态文本,实例名为:testxml_txt
第三步:导出swf文件,命名为testurl.swf(一定要为testurl.swf)
第四步:创建名为test.xml的xml文件,(也一定要为