2011-07-15 15 views
2

うまくいけば、私はこの問題をうまく表現できます。私はTitanium Desktopのシンプルなオーディオプレーヤーで作業しています。今、自身が正常に動作pickMusicFolderとplaySong両方Javascriptの関数間で変数を渡す(Titanium Studio Desktop)

<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()" /> 

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:私は今に焦点を当てています主なコードは次のようです。しかし、stopPlaybackは機能しません。私はクリック可能なリンクを生成しているコードがpickMusicFolder関数内で完全に区切られているので、オーディオを再生したり停止したりするためのさまざまな関数を扱う方法を掴むのに苦労しています。再生は1つの別個のインターフェースボタンにのみ接続されています。

再生中(または再生中)に単独の曲を操作できるように、複数の機能間でsongURL変数にアクセスするだけで済みます。私はグローバル変数に頼っているのを避けています。

誰もが考えている?どんなヒントも大歓迎です!

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

曲は以下となります。

答えて

3

を非常に迅速に解決策が機能playSongのプロパティとしてcurrentSongを格納することです。(投稿する前にハック-Yソリューションの束をしようとしていたああ、そして私の醜いコードを無視してください。)停止してください。このプロパティを削除すると、現在再生中の曲がないことを意味します。

+0

申し訳ありませんが、わからないことがあります:現在再生中の曲の再生を停止するには、HTMLスニペットに表示されている「停止」ボタンが必要です。 playUongに添付されているsongURLプロパティをどのように持っているのか、私は完全にはわかりません。 –

+1

私はコードを編集しています。playSong関数の2行目で、プロパティで再生している曲と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

ありがとうございました。 2つの質問: 1.)「プレースホルダー」領域にはどんなものがありますか?特定の機能のために保存されていますか? (または、単に「playSong関数の範囲内で定義されている」のように定義されていますか?) 2.)JSのイベントを含むHTMLの順序付けられていないリストを生成せず、ボタン入力でJSイベントを使用しますか?間もなくこれらのリンクを間違いなく読んでいます。再度、感謝します。 –

+0

1)あとでplaySong関数のスコープ内で定義されているように定義します。 2)リンクを読んで、イベントの意味を理解しますが、基本的には構造/データ(HTML)にロジック(JavaScript)を使用しないでください。あなたのHTMLではなく、あなたのjavascriptのイベントを接続します。 –

関連する問題