2016-12-07 21 views
1

我有以下腳本,它會返回給定網頁上的所有video元素:循環內的頁面和訪問元素的多部影片 - 使用Javascript

var amountWatched = ''; 

var video = document.getElementsByTagName("video"); 

console.log(video); // Returns HTMLCollection 

for(var i = 0; i < video.length; i++){ 

    console.log(video[i]); 

    video[i].addEventListener('playing', function(){ 
    var mytimer = setInterval(function(){ 

    console.log(video[i]); 

    console.log(video[i].children[0].outerHTML); // Currently undefined 


    }, 300); 
    }) 
} 

我們bascially設立playing事件,這將允許我們訪問percentage觀看等,而不是有多個視頻的多個腳本。

現在第一console.log返回我的以下內容:

​​

這是我所期望的,然後我就可以導航到每個條目並訪問我需要給定的變量。

然而,當我們是for循環內,並且我console.log(video[i]);我看到以下內容:

enter image description here

現在的問題是,當我嘗試訪問children我得到的錯誤undefined我的問題是如何能我確定我在for循環內循環了HTMLcollection,它使我可以訪問HTMLcollection內的所有元素?

+0

'playing'事件處理函數中'setInterval()'調用的目的是什麼? – guest271314

回答

0

在循環添加eventListener之後會發生播放事件......因此i將等於數組的長度,因此您正在訪問未定義的數組元素......最簡單的修正是閉合,在此case an IIFE

var amountWatched = ''; 

var video = document.getElementsByTagName("video"); 

console.log(video); // Returns HTMLCollection 

for(var i = 0; i < video.length; i++){ 
    (function(vid) { 
     console.log(vid); 
     vid.addEventListener('playing', function(){ 
      var mytimer = setInterval(function(){ 
       console.log(vid); 
       console.log(vid.children[0].outerHTML); // Currently undefined 
      }, 300); 
     }); 
    })(video[i]); 
} 
+0

請注意,'timeupdate'或'progress'事件可以代替'playing'事件中的'setInterval()'調用。您還在每次調用'setInterval()'的迭代中分配並覆蓋相同的'timerID'變量'mytimer'。如何在IIFE封閉和事件處理器之外訪問mytimer? – guest271314

+0

@Jaromanda X這隻適用於一個視頻,一旦一個視頻完成,我點擊另一個沒有任何反應 –

+0

在控制檯沒有錯誤?什麼都沒有?如果原始邏輯以某種方式存在缺陷,我會忍不住 - 也許如果你創建了一個最小的完整和可驗證的例子,我可以幫助更多 –

相關問題