这是一个简单的javascript程序:
var $d = {};
var AudioPlayer = function(filename, timeUpdateCallback, playbackDone){
// An HTML5 audio player is defined here.
}
$d.AudioPlayer = AudioPlayer;
var AudioManager = function(chapterId){
var audioPlayer;
var me=this;
this.next = function(){
...
}
function playSegment(){
// var path='/test.mp3';
$d.utils.log('Path is: '+path+'');
audioPlayer = new $d.AudioPlayer(path, function(p){} ,
function(){
me.next();
}
);
audioPlayer.play();
}
}
当在桌面浏览器(safari / firefox)中调用回放完成回调时,一切正常。但是,当在iPhone Safari中使用完全相同的JavaScript时,我看到一个例外“无法找到变量我”。
为什么闭包的处理方式有所不同?无论如何要解决这个问题吗?
更新:我没有提到audioPlayer依赖于PhoneGap的媒体类;它不接受其回调中的闭包。问题是回调在本机代码中存储为字符串,因此当它返回时,引用就消失了。 对于桌面浏览器,我实际上使用的是HTML5音频标签,所以我没有意识到这个问题。
答案 0 :(得分:1)
您使用的是什么版本的移动游戏?
我抓住了代码的本质:
var d = {
AudioPlayer: function (filename, timeUpdateCallback, playbackDone){
document.write ("Audioplayer<br/>");
return {
play : function () {playbackDone && playbackDone ();}
}
}
};
try {
(function AudioManager (chapterId) {
var me = this;
this.next = function (){
document.write ("AudioManager next<br/>");
}
function playSegment (){
var audioPlayer = new d.AudioPlayer ('/test.mp3', function(p){} ,
function () {
document.write ('playbackdone<br/>');
me.next ();
}
);
audioPlayer.play();
}
playSegment ();
}) ();
} catch (e) {
document.write(e);
}
它可以在Chrome,iPod touch和iPad上正常运行。
答案 1 :(得分:0)
我没有提到audioPlayer依赖于PhoneGap的媒体类;它不接受其回调中的闭包。问题是回调在本机代码中存储为字符串,因此当它返回时,引用就消失了。对于桌面浏览器,我实际上使用的是HTML5音频标签,所以我没有意识到这个问题。