2017-01-24 3 views
-1

Ich versuche, ein Skript auf drei Videos mit der gleichen ID (#vid) auf der gleichen Seite zu verwenden. Im Moment scheint nur ein Video das Skript zu verwenden.Mulitple Elemente mit der gleichen ID

var video = document.getElementById('vid') 
// When the 'ended' event fires 
video.addEventListener('ended', function(){ 
    // Reset the video to 
    video.currentTime = 0; 
    // And play again 
    video.load(); 
}); 

+2

'id' sollte eindeutig sein, sonst wird nur der erste ausgewählt –

+0

Danke Pranav, wie ändere ich das? – Exposian

+0

Klasse an deine Elemente anhängen – pravid

Antwort

0

Die meisten dieser Antworten sind nur teilweise richtig.

Für Ihre Markup gültig zu sein, id Bedürfnis zu sein eindeutig sein. Manchmal verwenden jedoch unvorsichtige Entwickler die gleiche ID im DOM. Fürchte dich nicht, es ist nicht das Ende der Welt, du kannst immer noch auf mehrere Elemente mit derselben ID zugreifen, wie du es vielleicht mit Klassen tun würdest.

Gibt eine HTMLCollection (array like object) von Elementen mit derselben ID zurück.

+0

FANTASTISCH. Das hat den Trick geschafft! Danke noch einmal! – Exposian

+0

Dies ist eine schlechte Praxis und sollte nicht gefördert werden. Diese Antwort ist nur ein Pflaster – j08691

+0

@ j08691 Es ist absolut schreckliche Praxis. Ich empfehle es nicht als etwas, das getan werden sollte. Ich betone, dass es ungültig ist HTML und fett geschriebene IDs müssen eindeutig sein. –

5

Id muss eindeutig sein. Sie sollten class stattdessen verwenden und dann den Einsatz von document.getElementsByClassName('className');

var video = document.getElementsByClassName('vid'); 
var myFunction = function() { 
    // Reset the video to 
    this.currentTime = 0; 
    // And play again 
    this.load(); 
}; 

for (var i = 0; i < video.length; i++) { 
    video[i].addEventListener('ended', myFunction, false); 
} 
+0

@epascarello Ja, ich habe das, ich habe den Code zu einzelnen Elementen, einen Fehler früher gemacht geändert –

0

IDs machen kann nur einmal in einem Dokument verwendet werden, und sie sollten eindeutig sein. Was Sie stattdessen tun sollten, ist, ihnen eine Klasse zu geben und dann diese Klasse zu tarnen und die Funktion für jedes Element mit dieser Klasse auszuführen.

Beispiel gibt ihnen eine class = „vid“

<script> 

var videos = document.getElementsByClassName('vid'); 
// When the 'ended' event fires 


for (var i = 0; i < videos.length; i++) { 
    videos[i].addEventListener('ended', function(){ 
    // Reset the video to 
    videos[i].currentTime = 0; 
    // And play again 
    videos[i].load(); 
    }); 
} 

</script> 

Ich bin nicht sicher, genau dieser Code funktioniert mit dem Ereignis-Listener hinzugefügt, aber das Konzept ist richtig.

+0

Danke, gibt den Videos eine Klasse noch scheint nicht zu funktionieren ... – Exposian

1

Das Attribut id sollte eindeutig sein, andernfalls wird immer nur das erste Attribut ausgewählt. Verwenden Sie daher class für eine Gruppe von Elementen und durchlaufen Sie sie, um den Ereignishandler anzuhängen.

<script> 
    var video = document.getElementsByClassName('vid'); 
    // convert the element collection to array using Array.from() 
    // for older browser use `[].slice.call()` for converting into array 
    // and iterate over the elements to attach listener 
    Array.from(video).forEach(function(v) { 
    v.addEventListener('ended', function() { 
     v.currentTime = 0; // or use `this` to refer the element 
     v.load(); 
    }); 
    }) 
</script> 
+0

FYI: ['Array.from'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from) wird nicht unterstützt in IE. Also benötigt entweder Polyfill oder eine for-Schleife. – epascarello

+0

@epascarello: als Alternative im Kommentar hinzugefügt –

+0

Scheint nicht zu funktionieren, wenn ich den Klassennamen verwende. – Exposian

0

die gleiche Kennung mehr verwenden, als solche ist ungültig Markup und als getElementById nur ein einzelnes Element zurückgegeben wird es das erste man es rüberkommt zurückzukehren.

Wenn Sie jedoch das Markup unter Verwendung Ihres vorhandenen Szenarios nicht genau ändern können, können Sie querySelectorAll verwenden, um alle Elemente mit demselben id Attributwert auszuwählen.

var videos = document.querySelectorAll('[id="vid"]') 

for (var i = 0; i < videos.length; i++) { 
    videos[i].addEventListener('ended', function() { 
     // Reset the video to 
     video.currentTime = 0; 
     // And play again 
     video.load(); 
    }); 
} 

Wenn Sie jedoch die Elemente andere Mittel verwenden, um zu identifizieren, sollten Sie, wie Datenattribute oder Klassen.

Persönlich lehne ich Datenattribute für die funktionale Verwendung und lassen Klassen für CSS verwenden.

Auf diese Weise bleiben ihre Anwendungen exklusiv und UI-Devs ändern Klassen/CSS wird nicht Auswirkungen auf Ihren Funktionscode, da sie Attribute nicht ändern sollten und umgekehrt.

Verwandte Themen