虽然 html5 提出了 audio 标签,ie 也有 bgsound (相对audio很弱),但是当前流行并且也统一的还是flash的解决方案。
既有代码复杂功能超全,具有html5前瞻的 soundmanager2 ,也有小巧灵活,简单够用的 niftyplayer ,这次介绍一下以上两者并推荐使用 kissy 的封装。
1.soundmanager2
官网推荐在head中引入库,并设置src为本机swf:
<script type="text/javascript" src="../../script/soundmanager2.js"></script>
<script type="text/javascript">
//setTimeout(function(){
// enable flash block handling
soundManager.useFlashBlock = true;
// custom demo options, not for your needs
soundManager.debugMode = true;
soundManager.url = '../../swf/';
//},1000);
</script>
</head>
但是我们一般将js放在页尾,或按需加载,在点击时才载入库(相当于上例 1秒 延迟),这时就可能会出现swf不能正常加载的现象,分析其源码可知,载入库的同时会new 出 soundmanager 对象时,它会自己绑定 window 的 load,DOMContentLoaded 事件,而如果页面载入后按需动态加载,则 load 事件不会再触发了 ,导致初始化失败,所以这里我推荐在引入 soundmanger2 库前定义SM2_DEFER,使用推迟初始化:
另一个问题是 soundmanager2 会在全局空间中引入两个变量 SoundManager 与 soundmanager,使用 kissy 封装后可达成完美不污染外部脚本。
kissy 封装:
KISSY.add("swfaudio", function (S, undefined) {
var SM2_DEFER=true;
//原始 soundmanager2 代码
//.................
// expose public interfaces
//封装到kissy,不要发布在全局空间
S.SoundManager = SoundManager; // SoundManager constructor
//内部实例没有必要,使用延迟初始化
//S.soundManager = soundManager; // public instance: API, Flash callbacks etc.
});
使用:
//等待页面ready
KISSY.ready(function (S) {
/**
统一使用延迟初始化,其他方式有问题
指定本地的swf地址
*/
var sm = new S.SoundManager("soundmanager2.swf");
sm.useFlashBlock = true;
//开始初始化
sm.beginDelayedInit();
sm.onready(function () {
//具体使用方法参见:http://www.schillmania.com/projects/soundmanager2/
/*播放音乐方式1:
@param {String} music id
@param {String} music path
*/
//sm.play("test","waka.mp3");
/*
播放音乐方式2:
createSound方法,可以播放前缓存
@param autoLoad 播放前缓存
*/
var s = sm.createSound({
id: "music_1",
url: "waka.mp3",
autoPlay:true, //注意使用 autoPlay 立即播放 ,
autoLoad: true //开始下载
});
});
2.niftyplayer
niftyplayer 的 swf 接口非常简单,使用 js 封装后总大小 4 k,对于简单应用非常适合。
1368

被折叠的 条评论
为什么被折叠?



