繁体   English   中英

在桌面浏览器和移动Safari上关闭的处理方式不同?

[英]closures handled differently on desktop browser and mobile safari?

这是一个简单的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音频标签,因此我没有遇到这个问题。

您正在使用哪个版本的移动浏览器?

我因此捕获了代码的本质:

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上正常运行。

我没有提到audioPlayer依赖于PhoneGap的媒体类。 在其回调中不接受闭包。 问题在于,回调函数以字符串形式存储在本机代码中,因此返回时,引用已消失。 对于台式机浏览器,我实际上使用的是HTML5音频标签,因此我没有遇到这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM