时下很多人用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的绝对路径分割为
和eote.swf两部分.把
附加到songs.xml的后面(前提是eote.swf和songs.xml必须在同一目录).获得eote.swf的绝对路径我们已经解决了,接下来的就是把eote.swf的绝对路径分割为
和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文件,(也一定要为test.xml), test.xml里的内容如下:
<?xml version="1.0" encoding="GB2312" ?>
<data>
你想要输入的内容
</data>
第五步:在本地或上传到空间去测试.
至此,问题就搞定了.非凡要注重:testurl.swf和test.xml要在同一目录,放在空间时,要在根目录里.这样做的好处是,任何人把testurl.swf和test.xml放在空间的根目录,再引用到其他地方时就不必在fla文件里改test.xml的地址了.这样省去了很多麻烦. 当然有利也有弊,这样轻易暴露xml文件的地址,被他人窃取.分割_root._url的方法还有很多种,像以"."号分割,"/"分割,原理都是一样,我是看那种方法简单就用那种了.
_root._url的用处还有很多,在这里,我只就解决自己的问题学习了一下_root._url,在这里就算是抛砖引玉吧,假如大家有什么好的方法,请踊跃发表.学无止境!
正确的思路+正确的方法=成功
作者:hcf214236 QQ:17638974 07.1.6