2011-07-15 48 views
2

希望我能很好地闡述這個問題。我正在研究Titanium Desktop中的一個簡單的音頻播放器。我專注於眼下的主要代碼如下:在JavaScript中的函數之間傳遞變量(鈦工作室桌面)

function pickMusicFolder(){ 
    var win = Titanium.UI.getCurrentWindow(); 

    win.openFolderChooserDialog(function(folderResponse) { 
     var file = Titanium.Filesystem.getFile(folderResponse[0]); 
     var listing = file.getDirectoryListing(); 
     for (var i = 0; i < listing.length; i++) { 
      if (listing[i].isDirectory()) { 
       // if the listing is a directory, skip over it 
       $('#main').append('DIRECTORY: ' + listing[i].nativePath() + 
        '<br />'); 
       // continue; 
      } 
      else { 
       // otherwise, print the filename of the file to the #main content window 
       var songOnList = listing[i].nativePath(); 
       var songURL = songOnList.replace(/\\/g,"/"); 
       $('#main ul').append('<li><a href="javascript:playSong(\'' + songURL + '\')">' + songURL + '</a></li>'); 
      } 
     } 
    }); 
}; 

function playSong(songURL){ 
    var currentSong = Titanium.Media.createSound(songURL); 
    currentSong.play(); 

    this.stopPlayback = stopPlayback; 

    function stopPlayback(currentSong){ 
     currentSong.stop(); 
    } 
} 

然後相關的HTML:

<input type="image" src="img/player_stop.png" name="stopPlayback" onClick="playSong.stopPlayback(songURL)" /> 
<input type="image" src="img/folder_add.png" name="pickMusicFolder" onClick="pickMusicFolder()" /> 

現在,無論pickMusicFolder和playSong本身正常工作。但是,stopPlayback無法正常工作,我很難掌握如何處理播放和停止音頻的不同功能,因爲生成可點擊鏈接的代碼完全在pickMusicFolder函數中進行了劃分,而停止代碼播放只附加到一個單獨的界面按鈕。

我只需要訪問多個函數之間的songURL變量,以便能夠在播放(或不播放)的同時對一首單曲進行操作。我避免訴諸全局變量,因爲我發現這是一個警察出局。

任何人有任何想法?任何提示都非常感謝! (呵呵,請忽略我的醜陋的代碼;在發佈前試圖一羣黑客-Y的解決方案。)

回答

3

很快解決方案是保存currentSong作爲功能playSong屬性:

function playSong(songURL){ 
    var currentSong = Titanium.Media.createSound(songURL); 
    playSong.currentSong = currentSong; // store curernt playing song as property of function 
    currentSong.play(); 
} 

playSong.stopPlayback = function() { 
    if (playSong.currentSong) { 
    playSong.currentSong.stop(); 
    delete playSong.currentSong; 
    } 
}; 

當歌會被停止只是刪除這個屬性,這意味着現在沒有歌曲正在播放

+0

對不起,也許我不清楚:我需要我的「停止」按鈕,我的HTML代碼段中顯示的代碼停止播放當前正在播放的歌曲。我不完全確定如何將songURL屬性附加到playSong幫助我? –

+1

我是編輯代碼,在playSong函數的第二行中,我們存儲了在屬性中播放的歌曲以及在stopPlayback中使用此屬性 –

+0

噢,我的天啊。非常感謝,作品像魅力! –

1

你應該使用閉包。見下面

var stopPlayback = function() { /* Placeholder, defined later */ }; 

var playSong = function(songURL){ 
    var currentSong = Titanium.Media.createSound(songURL); 
    currentSong.play(); 

    // Redefine stopSong in the parent scope 
    stopPlayback = function(){ 
    // currentSong is available to this function via closure 
    currentSong.stop(); 
    } 
} 

HTML編輯

<input type="image" src="img/player_stop.png" name="stopPlayback" onClick="stopPlayback()" /> 

作爲一個側面說明,你不應該使用HTML屬性附加JavaScript事件。 This is a great series on event attachment,但你真正應該閱讀的是this part。此外,每個JS庫都提供了附加事件的方法,讓您的生活更輕鬆。

+0

非常感謝你。兩個問題: 1.)「佔位符」區域究竟會發生什麼?它是否被保存用於某些特定的功能? (或者你的意思是「稍後定義」在playSong函數的範圍內定義) 2.)所以你說的不要生成HTML無序列表(包含JS事件)在按鈕輸入上使用JS事件?肯定會很快閱讀這些鏈接;再次感謝。 –

+0

1)稍後定義在playSong函數的範圍內定義。 2)閱讀鏈接,你會明白我對事件的意思,但基本上,你的結構/數據(HTML)中不應該有邏輯(JavaScript)。在JavaScript中連接事件,而不是在HTML中。 –