晨风交流论坛_CMP_CChat_Flash_音乐_视频_播放器_live直播_聊天室

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 20285|回复: 13

[教程] 关于cmp调用的优化【改用flashvars传参】

[复制链接]
发表于 2010-7-1 19:53:48 | 显示全部楼层 |阅读模式
官方QQ群:102348392 | 捐赠CMP
调用cmp时,我们总要传递一些参数,最快捷的方法就是从地址的问号后面的附加上去
比如单曲播放系统,就是采用这种方式
  1. cmp.swf?src=test.mp3
复制代码
引用到其他地方,非常简单方便

但是,如果你有一个音乐网站,里面每个音乐播放页也采用这种调用方式,就不是最佳方式了
因为每个不同的音乐地址都不同,对应参数也都不同,这样cmp的调用地址也都不同
所以加载每个不同的音乐,都会去服务器重新下载新的cmp主程序文件cmp.swf

实际上,cmp主程序文件是个静态文件,参数虽然不同,但下载的还是同一个东西
同时参数传到服务器,并没用任何作用,因为这些参数是被cmp在本地浏览器中读取的
所有参数是白白传递到服务器,还要每次都下载一遍cmp主程序文件,浪费大量网络和服务器资源
无故赔上一些流量,因为cmp也不小150kb,尤其访问次数多的话

最近发现很多调用cmp的网站都有此问题,有的站长还埋怨cmp主程序文件太大
而cmp要完成一些功能,已经不能再精简了,这里似乎是个矛盾

问题来了,能解决么?答案是肯定的

我们的浏览器实际上都有缓存机制,所以一般静态文件(flash、图片等等),只要地址相同,都只需下载一次
以后再调用时,浏览器会自动从缓存加载,不再从服务器请求

那么,怎样使浏览器从缓存加载cmp呢?

其实flashplayer早早(fp6开始)就为我们提供了解决方案,那就是使用属性flashvars
flashvars是专门用来给flash传递参数的,下面就来说说使用方法
首先看看有问题的插入方式:
  1. <object>
  2. <param name="movie" value="cmp.swf?src=test.mp3" />
  3. </object>
复制代码
这样每次参数不同,就会出现上面说的问题

下面采用flashvar传递参数:
  1. <object>
  2. <param name="movie" value="cmp.swf" />
  3. <param name="flashvars" value="src=test.mp3" />
  4. </object>
复制代码
这样就算参数不同,修改flashvars的值即可
而请求cmp主程序的地址总是不变,所以浏览器仅在第一次打开页面时需要下载cmp.swf,以后都会自动采用缓存
并且参数也不会传递到服务器,优化后为你的网站节约了大量资源,而且大大加快了显示速度(不再显示cmp加载loading动画)

事实上,如果你采用CMP安装包中的cmp.js脚本来调用cmp的话,可以更方便的进行优化
  1. <script type="text/javascript" src="cmp.js"></script>
  2. <script type="text/javascript">
  3. //id, width, height, url, vars, params, attrs
  4. CMP.write("cmp", "100%", "100%", "cmp.swf", "src=test.mp3", {wmode:"opaque"});
  5. </script>
复制代码
第5个参数就是flashvars,当然你也可以写成对象的形式:
  1. var flashvars = {src : "test.mp3", type : "1"};
  2. CMP.write("cmp", "100%", "100%", "cmp.swf", flashvars, {wmode:"opaque"});
复制代码
总之,把cmp所有参数都放到flashvars里面
希望这些对音乐站长有用!
发表于 2010-7-1 21:04:40 | 显示全部楼层
沙发又学到新的东西
发表于 2010-7-2 20:58:20 | 显示全部楼层
老大一出手就知道有没有。
发表于 2010-7-2 21:00:24 | 显示全部楼层
回复 4# sxw2005


    没有也得有!
         我又出来冒泡啦~!
发表于 2010-7-2 23:25:02 | 显示全部楼层
本帖最后由 sxw2005 于 2010-7-4 07:05 编辑

那对于百度的代理地址能不能优化下,而不要换首歌也再从服务器再次调用他呢?
发表于 2010-8-18 15:52:48 | 显示全部楼层
好东西要分享!
 楼主| 发表于 2010-8-21 00:09:23 | 显示全部楼层
用最新版本的CMP嵌入脚本:http://cmp.cenfun.com/cmp4/cmp.js
详细说明:http://bbs.cenfun.com/thread-11790-1-1.html

CMP.write("cmp", "580", "380", "cenfun/cmp.swf", "lists=%2Fplay%2Flist.php?<?php echo $param?>");
 楼主| 发表于 2010-8-21 06:58:04 | 显示全部楼层
应该是转义的问题,你试一下:
var flashvars = {lists : "/play/list.php?<?php echo $param?>", type : "1"};

或用字符串:
var flashvars = "type=1&lists=%2Fplay%2Flist.php?<?php echo $param?>";
严格的说,后面的?参数都需要转义,你这样可能在某些浏览器会有问题

也就是先定义一个列表地址,并单独对其进行转义:
var list = encodeURIComponent("/play/list.php?<?php echo $param?>");
var flashvars = "type=1&lists="+list;
当然用最上面的{}对象形式,无需转义,CMP.js会自动进行转义,因为转2次反而不认识了
发表于 2010-8-30 15:20:27 | 显示全部楼层
学习中,看看呀
发表于 2010-9-3 06:58:23 | 显示全部楼层
请教老大如何在这样的播放代码里指定自动播放和选择皮肤啊?

QQ|客服QQ44023478|Archiver|手机版|小黑屋|晨风交流论坛 ( 粤ICP备05008793号 )

GMT+8, 2019-1-17 06:26 , Processed in 0.058025 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表