2016-09-25 3 views
1

Javascriptでカスタムオーディオプレーヤーを構築していますが、リスト内の各曲にイベントリスナーを付けることができません。プレイリストのトラックをクリックすると、selectTrack(x)という関数を使ってデータ属性を解析して、再生する曲をプレイヤーに伝えたいとします。しかし、この関数が定義されていないというエラーが出ています。html要素の配列にeventlistenersを付け、JavaScriptの引数としてデータ属性を解析するにはどうすればよいですか?

// attach event listener and get data value from div 
var myListener = document.getElementsByClassName("trackListRow"); 
for (var i=0; i < myListener.length; i++) 
{ 
    myListener[i].getAttribute("data-track-index"); 
    mylistener[i].addEventListener("click", function(){ 

    selectTrack(datavalue); 

    }); 
} 

完全なコードを以下に掲載されています。これは

は、私はとのトラブルを持っている部分です。

var trackListContainer, playPrevBtn, playPauseBtn, PlayNextBtn; 
 
var trackRow, songArray; 
 
songArray = ["Aminaiyoamoore", "adg3com_chuckedknuckles" ]; 
 

 
// create track list - append to container 
 
var i; 
 
for (i = 0; i < songArray.length; i++) { 
 
    trackRow = document.createElement("div"); 
 
    trackRow.textContent = songArray[i]; 
 
    trackRow.className = "trackListRow"; 
 
    // set data attribute to array index number for event handling 
 
    trackRow.setAttribute("data-track-index", songArray.indexOf(songArray[i])); 
 

 
    trackListContainer = document.getElementById("trackListContainer"); 
 
    trackListContainer.appendChild(trackRow); 
 
    
 
} 
 
      
 
     // Problems here 
 
// attach event listener and get data value from div 
 
var myListener = document.getElementsByClassName("trackListRow"); 
 
for (var i=0; i < myListener.length; i++) 
 
{ 
 
    myListener[i].getAttribute("data-track-index"); 
 
    mylistener[i].addEventListener("click", function(){ 
 
    
 
    selectTrack(datavalue); 
 
    
 
    }); 
 
} 
 

 

 
    
 
var playPrevBtn, playPauseBtn, playNextBtn; 
 
playPrevBtn = document.getElementById("playPrevBtn"); 
 
playPauseBtn = document.getElementById("playPauseBtn"); 
 
playNextBtn = document.getElementById("playNextBtn"); 
 

 
function initBeatPlayer() { 
 
    // var dir = "audio/"; 
 
    var dir = "http://www.puntlandtvradio.net/placeholders/audio/" 
 
    
 
    var ext = ".mp3"; 
 
    playlist_array_index = 0; 
 
    audio = new Audio(); 
 

 

 
    playPauseBtn.addEventListener("click", playPause); 
 
    playPrevBtn.addEventListener("click", seekBackward); 
 
    playNextBtn.addEventListener("click", seekForward); 
 
    audio.addEventListener("ended", function() { 
 
     switchTrack() 
 
    }); 
 

 

 
    // functions 
 

 
    
 
    function selectTrack(datavalue){ 
 
    
 
    playlist_array_index = datavalue 
 
    audio.src = dir + songArray[playlist_array_index] + ext;   
 
      audio.play(); 
 
    
 
    } 
 
    
 
    
 
    
 
    
 
    
 
    
 
    function playPause() { 
 
     if (audio.paused) { 
 
      audio.play(); 
 
      document.getElementById("playPauseBtn").textContent = "PAUSE"; 
 
     } else { 
 
      audio.pause() 
 
      document.getElementById("playPauseBtn").textContent = "PLAY" 
 
     } 
 
    } 
 

 

 
    function seekBackward() { 
 
     if (playlist_array_index <= 0) { 
 

 
      playlist_array_index = 0; 
 
      audio.src = dir + songArray[playlist_array_index] + ext; 
 
      audio.pause(); 
 
      audio.currentTime = 0; 
 
      audio.play(); 
 
     } else { 
 

 
      playlist_array_index--; 
 
      audio.src = dir + songArray[playlist_array_index] + ext; 
 
      audio.play(); 
 
     } 
 
    } 
 

 
    function seekForward() { 
 

 
     if (playlist_array_index == (songArray.length - 1)) { 
 
      playlist_array_index = 0; 
 

 
     } else { 
 

 
      playlist_array_index++; 
 
      audio.src = dir + songArray[playlist_array_index] + ext;   
 
      audio.play(); 
 

 
     } 
 

 
    } 
 

 
    //end functions 
 
} 
 
window.addEventListener("load", initBeatPlayer);
#container{width: 320px; margin: auto; overflow: hidden;} 
 
#controls {} 
 
#playPrevBtn, #playPauseBtn, #playNextBtn{ font-size: 25px; margin: 5px;} 
 
.trackListRow {font-size: 20px; background-color: aliceblue; color: black; padding: 10px; margin: 5px;} 
 
.trackListRow:hover {background: brown; color: white; }
<!--player control buttions --> 
 
<div id="container"> 
 
    <div id="trackListContainer"> </div> 
 
    
 
    
 
    <div id="controls"> 
 
    <button id="playPrevBtn"> << </button> 
 
    <button id="playPauseBtn">PAUSE</button> 
 
    <button id="playNextBtn">>></button> 
 

 
    </div> 
 
    
 
    <div> music by puntlandtvradio.net - for educational purposes </div> 
 
</div>

+2

あなたはこのコードを縮小化することができますか?それの半分が質問に不要に見える – Isaac

+0

この関数は、使用しようとしているスコープに定義されていません。 'selectTrack'は' initBeatPlayer'の中で定義されていますので、 'initBeatPlayer'の外で使用したい場合は、それを外側に移動してください。 – Damon

+0

更新されました。質問にコードのスニペットを掲載しました。 –

答えて

2

物事のカップル:

  1. forループ内の二行目:mylistenerイベントリスナーにDataValueはmyListenerLを大文字)
  2. なければなりません定義されていないので、最初に宣言します。
  3. selectTrackのコメントは、initBeatPlayerの中にあり、公開されていません。しかし、selectTrackinitBeatPlayer内の他の変数を参照する必要があるので、initBeatPlayerの中にハンドラバインド作業を移動する方が良いでしょう。ここで

jsFiddleを「作業」され、あなたはまだそのスニペットの横に他の部品をクリーンアップする必要があります。 https://jsfiddle.net/bosjuLmo/1/

+0

ソリューションをありがとう。それらのパブリック変数がメモリリークやそのような問題の原因になりますか?公共の変数はこの文脈では悪いことでしょうか? –

+0

@RonaldThompson 2つのグローバルバールは記憶の点で大きな問題ではありませんが、他にも懸念があります。この記事は良い記事です:http://stackoverflow.com/questions/19313248/global-variables-in-js-harmfull –

0

あなたはすべての変数、スクリプトの先頭にリスナーを宣言する必要があります。このようにして、関数が必要とするすべての要素が定義されていることがわかります。関数の場合と同じこと、呼び出しの前に書くほうが良い。

関数内で 'var'で宣言された変数は、ローカルスコープでは代表的なものです。グローバルスコープ内の 'var dir'は関数内の 'var dir'と同じではないため、JSはそれらを別のものとして扱います。このことができます

希望は、それがOK働いている:

var trackListContainer, playPrevBtn, playPauseBtn, PlayNextBtn; 
var trackRow, songArray; 
songArray = ["Aminaiyoamoore", "adg3com_chuckedknuckles" ]; 
var myListener = document.getElementById("trackListContainer"); 
var dir=''; 
var ext=''; 

var playPrevBtn, playPauseBtn, playNextBtn; 
playPrevBtn = document.getElementById("playPrevBtn"); 
playPauseBtn = document.getElementById("playPauseBtn"); 
playNextBtn = document.getElementById("playNextBtn"); 

window.addEventListener("load", initBeatPlayer); 

// functions 


    function selectTrack(datavalue){ 

    playlist_array_index = datavalue 
    audio.src = dir + songArray[playlist_array_index] + ext;   
      audio.play(); 

    } 






    function playPause() { 
     if (audio.paused) { 
      audio.play(); 
      document.getElementById("playPauseBtn").textContent = "PAUSE"; 
     } else { 
      audio.pause() 
      document.getElementById("playPauseBtn").textContent = "PLAY" 
     } 
    } 


    function seekBackward() { 
     if (playlist_array_index <= 0) { 

      playlist_array_index = 0; 
      audio.src = dir + songArray[playlist_array_index] + ext; 
      audio.pause(); 
      audio.currentTime = 0; 
      audio.play(); 
     } else { 

      playlist_array_index--; 
      audio.src = dir + songArray[playlist_array_index] + ext; 
      audio.play(); 
     } 
    } 

    function seekForward() { 

     if (playlist_array_index == (songArray.length - 1)) { 
      playlist_array_index = 0; 

     } else { 

      playlist_array_index++; 
      audio.src = dir + songArray[playlist_array_index] + ext;   
      audio.play(); 

     } 

    } 

function initBeatPlayer() { 
    // var dir = "audio/"; 
    dir = "http://www.puntlandtvradio.net/placeholders/audio/" 

    ext = ".mp3"; 
    playlist_array_index = 0; 
    audio = new Audio(); 


    playPauseBtn.addEventListener("click", playPause); 
    playPrevBtn.addEventListener("click", seekBackward); 
    playNextBtn.addEventListener("click", seekForward); 
    audio.addEventListener("ended", function() { 
     switchTrack() 
    }); 
} 

//end functions 

// create track list - append to container 

for (var i = 0; i < songArray.length; i++) { 
    trackRow = document.createElement("div"); 
    trackRow.textContent = songArray[i]; 
    trackRow.className = "trackListRow"; 
    // set data attribute to array index number for event handling 
    trackRow.setAttribute("data-track-index", songArray.indexOf(songArray[i])); 

    trackListContainer = document.getElementById("trackListContainer"); 
    trackListContainer.appendChild(trackRow); 

} 

     // Problems here 
// attach event listener and get data value from div 

for (var i=0; i < myListener.length; i++){ 
    myListener[i].getAttribute("data-track-index"); 
    mylistener[i].addEventListener("click", function(){ 

    selectTrack(datavalue); 

    }); 
} 
関連する問題