2010-09-08 85 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

相關問題