2010-09-08 19 views
1

Voici un programme simple javascript:fermetures traitées différemment sur le navigateur de bureau et le safari mobile?

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

Lorsque le rappel fait de la lecture est appelée dans un navigateur de bureau (Safari/Firefox) tout fonctionne bien. Toutefois, lorsque vous utilisez exactement le même javascript dans iPhone Safari, je vois une exception "Impossible de trouver la variable moi".

Pourquoi y a-t-il une différence dans la façon dont les fermetures sont traitées? Y a-t-il moyen de contourner cela?

Mise à jour: J'ai omis de mentionner que l'audioPlayer repose sur la classe média de PhoneGap; qui n'accepte pas les fermetures dans ses rappels. Le problème est que le rappel est stocké en tant que chaîne dans le code natif, donc quand il revient la référence est partie. Pour les navigateurs de bureau, j'utilisais en fait une balise audio HTML5, donc je n'ai pas rencontré ce problème.

+0

Où créez-vous une instance d'AudioManager? Et qu'est-ce qui appelle la fonction interne 'playSegment()'? –

Répondre

0

J'avais omis de mentionner que l'audioPlayer se base sur la classe média de PhoneGap; qui n'accepte pas les fermetures dans ses rappels. Le problème est que le rappel est stocké en tant que chaîne dans le code natif, donc quand il revient la référence est partie. Pour les navigateurs de bureau, j'utilisais en fait une balise audio HTML5, donc je n'ai pas rencontré ce problème.

1

Quelle version de safari mobile utilisez-vous?

Je saisi l'essence de votre code ainsi:

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

Et il fonctionne sans erreur sur Chrome, iPod touch et iPad.

+0

Salut, voir ma mise à jour ci-dessus, ce qui explique la différence. Merci d'avoir pris le temps de répondre à +1. –