Lieber Linuchs,
// Audios und Videos auf halbe Lautstaerke und addEvent canplaythrough arr_ausgewaehlte_medien = document.querySelectorAll( "audio:not(.nogroup), video:not(.nogroup)" ); consoleOut( "lied_mehrspurig.js: " +arr_ausgewaehlte_medien.length +" Audios und Videos, Master ist [" +arr_ausgewaehlte_medien[0].src +"]" );
Du holst Dir mit querySelectorAll
so etwas ähnliches wie ein Array (genauer eine NodeList) mit Referenzen auf die DOM-Objekte. Deine Array-Schreibweise arr_ausgewaehlte_medien[0]
ist syntaktisch richtig. Aber: Hat das erste Element auch eine Eigenschaft src
, und wenn ja, ist ihr Wert in Stringform ein Leerstring?
Du solltest unbedingt neben Deinem consoleOut
noch dieses hier probieren:
console.dir(arr_ausgewaehlte_medien[0]);
Damit bekommst Du das Objekt auf der Konsole auf eine Art und Weise ausgegeben, bei der Du Dich durch seine Ebenen bewegen kannst, weil seine Darstellung ähnlich wie mit einem <details>
-Element realisiert wird. Dort siehst Du dann auch, ob es eine Eigenschaft (oder Methode?) src
gibt, und was sich dahinter verbirgt.
Bei einem einzelnen Video kann ich video.src setzen. Ist Setzen und Abfragen unterschiedlich?
Es stellt sich die Frage, was Du genau für ein Objekt bei arr_ausgewaehlte_medien[0]
hast. Deine Debug-Ausgabe mit consoleOut
ist in diesem Punkt zu spezifisch, weil sie eine Objekteigenschaft src
ausgeben möchte, die das Objekt aber vielleicht nicht hat.
Frage:
Kannst Du Dir sicher sein, dass Dein Selektor so gewählt ist, dass das erste Element in der NodeList auch tatsächlich Deine führende Spur ist, oder ist es anhand Deines DOMs möglich, dass die Reihenfolge im Dokument manchmal eine andere ist, als Du sie in Deiner Liste erwartest?
Frage:
Kannst Du Deine Multimedia-Elemente erst sortieren, wobei Du das Merkmal der führenden Spur „nach oben sortierst“, damit Du sicher sagen kannst, dass [0] auf das Element mit der führenden Spur zeigt? Natürlich müsstest Du dafür sorgen, dass das Ergebnis von querySelectorAll
zuerst in ein Array umgewandelt wird, weil das NodeList-Objekt keine Sortiermethode kennt.
arr_ausgewaehlte_medien = Array.from(
document.querySelectorAll( "audio:not(.nogroup), video:not(.nogroup)" )
);
arr_ausgewaehlte_medien.sort( (a, b) => {
// <video> vor <audio> - oder implementiere ein anderes Merkmal
if ("VIDEO" == a.tagName && "VIDEO" != b.tagName) {
return -1; // a vor b, weil a ein <video> ist
}
if ("VIDEO" != a.tagName && "VIDEO" == b.tagName) {
return 1; // b vor a, weil b ein <video> ist
}
// sekundäres Sortierkriterium hier
//
return 0; // Reihenfolge egal
});
Mir ist nicht klar, ob arr_ausgewaehlte_medien Pointer enthält oder Kopien. Die Kopie beeinflusst nicht das Original?
Es werden keine Kopien angelegt. Das wäre ineffizient, weil die Objekte erst geklont werden müssten und das wiederum macht Vergleiche kaputt, weil a==b dann nicht mehr true ergeben kann.
Liebe Grüße
Felix Riesterer