Antwort an „Felix Riesterer“ verfassen

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

freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen