2010-09-08 87 views
1

这里有一个简单的JavaScript程序:桌面浏览器和移动Safari浏览器的封闭处理方式有所不同?

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

你在哪里创建一个AudioManager的实例?什么调用内部函数'playSegment()'? – 2010-09-08 15:16:59

回答

0

我没有提到audioPlayer依赖于PhoneGap的媒体类;在回调中不接受收盘。问题在于回调以本地代码的形式存储为字符串,所以当它返回时,引用不再存在。对于我实际使用的桌面浏览器和HTML5音频标签,所以我没有发现这个问题。

1

你使用的是什么版本的移动Safari?

我抓住你的代码的本质这样的:

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); 
} 

,不受错误运行在浏览器,iPod touch和iPad。

+0

嗨,看到我上面的更新,这解释了区别。感谢您花时间回答+1。 – 2010-09-09 18:59:48

相关问题