Закрытия обрабатываются по-разному в настольном браузере и мобильном сафари? - PullRequest
1 голос
/ 08 сентября 2010

Вот простая программа на 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) вызывается обратный вызов для завершения воспроизведения, все работает нормально. Однако при использовании точно такого же javascript в iPhone Safari я вижу исключение «не удалось найти переменную me».

Почему существует разница в способах обработки замыканий? Есть ли способ обойти это?

Обновление: Я не упомянул, что audioPlayer использует медиа-класс PhoneGap; который не принимает замыкания в своих обратных вызовах. Проблема в том, что обратный вызов хранится в виде строки в собственном коде, поэтому, когда он возвращает, ссылка исчезает. Для настольных браузеров я фактически использовал и аудио тег HTML5, поэтому я не обнаружил эту проблему.

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Какую версию мобильного сафари вы используете?

Я уловил суть вашего кода следующим образом:

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.

0 голосов
/ 09 сентября 2010

Я не упомянул, что audioPlayer использует медиа-класс PhoneGap; который не принимает замыкания в своих обратных вызовах. Проблема в том, что обратный вызов хранится в виде строки в собственном коде, поэтому, когда он возвращает, ссылка исчезает. Для настольных браузеров я фактически использовал аудио-тег HTML5, поэтому я не обнаружил эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...