2016-09-25 24 views
1

我正在使用Javascript构建自定义音频播放器,但是我无法将事件监听器附加到列表中的每首歌曲。当我点击播放列表中的曲目时,我想通过名为selectTrack(x)的函数解析数据属性,以告诉播放器播放哪首歌曲。但是,我不断收到一个错误,说这个函数没有定义。如何将eventlisteners附加到一个html元素数组并将数据属性解析为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循环中的第二行:mylistenermyListener(大写大号
  2. 在事件监听器的datavalue未定义,首先声明它。
  3. 正如指出的意见,selectTrack是在initBeatPlayer,因此不公开。但是,由于selectTrack也需要参考initBeatPlayer中的其他变量,所以最好将中的处理程序绑定工作移动到里面。

这里是一个“工作”的jsfiddle,你仍然需要清理其他部分是片段旁边: https://jsfiddle.net/bosjuLmo/1/

+0

感谢您的解决方案。这些公共变量是否会导致内存泄漏或类似问题?公共变量在这种情况下会是一件坏事吗? –

+0

@RonaldThompson在记忆方面,几个全球变量不是什么大不了的,但可能还有其他问题。这篇文章是一个很好的阅读:http://stackoverflow.com/questions/19313248/global-variables-in-js-harmfull –

0

您需要声明所有变量,在脚本的顶部听众;这样你就知道每个元素都是在函数需要时定义的。功能一样,最好在通话之前写下来。

请记住,在函数内用'var'声明的变量在本地范围内具有代表性。全局作用域中的'var dir'与函数内的'var dir'不同,JS会将它们视为单独的东西。

希望这有助于它的工作确定:

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

    }); 
} 
相关问题