Das Problem ist, alle untergeordneten div-Tags von einem Wurzelknoten zu sortieren nach ihrer top
CSS-Eigenschaft.Wie kann ich Kindknoten nach Eigenschaftswert in Scala.js sortieren?
Hier ist mein Code:
val elements = global.document.getElementById("root").childNodes.asInstanceOf[dom.NodeList]
val clones = (for (i <- (0 to (elements.length - 1)) if (elements(i).isInstanceOf[dom.raw.HTMLDivElement])) yield {
val clone = elements(i).cloneNode(true)
val style = clone.attributes.getNamedItem("style").value
val parts = style.split("top: ")
val parts2 = parts(1).split("px")
val px = parts2(0).toDouble
Tuple2[dom.Node, Double](clone, px)
}).toList
val sorted = clones.sortWith((a, b) => a._2 > b._2)
global.document.getElementById("root").innerHTML = ""
for (e <- sorted) {
global.document.getElementById("root").appendChild(e._1)
}
Ich bin neu in Scala.js und es dauerte ziemlich Mühe mit dieser Lösung zu kommen. Es kompiliert und scheint zu funktionieren, aber ich bin mir nicht sicher, wie legitim es ist.
Zum Beispiel kann ich nur bekommen die top
Eigenschaft des Knotens in einer sehr komplizierten Art und Weise. Auch vermute ich, dass zum Löschen aller Kindknoten global.document.getElementById("root").innerHTML = ""
eine Hintertür ist. Ich bin nicht sicher, ob diese Sortierung an Ort und Stelle erfolgen kann, ohne Klone zu erzeugen. Ich freue mich über Verbesserungsvorschläge und hoffe, dass einige Anfänger diesen Code auch nützlich finden.
Danke für diese Vorschläge. Ich bin mir eigentlich bewusst, dass Scala.js.hat eine jQuery-Erweiterung, aber ich kann einfach nicht importieren diese Erweiterung: https://github.com/scala-js/scala-js-jquery, ich bekomme alle Arten von kryptischen Fehlermeldungen über Bündelung. D3.js Erweiterung ist einfach zu importieren und funktioniert als Charme und ich verwende dies für die Auswahl derzeit. Ich würde jede mögliche Hilfe, wie man jQuery (ein voll funktionierendes Beispiel kann sein), schätzen. Noch komplizierter macht es, dass ich ein integriertes Projekt verwende, in dem Client und Server (+ gemeinsamer Code) zusammen kompiliert werden: https://github.com/vmunier/play-with-scalajs-example. – sbtpr
Nun, die Verwendung der Vmunier-Bibliothek ist ein ziemlich übler Standard - ich benutze es selbst. Ich empfehle, die neuere jquery-Fassade (oben verlinkt) anstelle der älteren scala-js-jquery zu verwenden. Aber ich weiß nicht, woher die Bündelfehler kommen - das ist irgendwie komisch. Ich werde mich in Kürze auf den Weg machen, aber ich würde empfehlen, dies auf dem scala-js/scala-js-Gitter-Kanal (der das Herz der Scala.js-Community ist) einzubringen und die Fehler, die du siehst, zu posten - Leute dort können vielleicht helfen. –
Auch wenn es nicht offensichtlich ist: Denken Sie daran, dass es keine Art von jQuery * Extension * ist, es ist nur eine Fassade. Sie müssen jQuery selbst vor Ihrem Scala.js-Code einfügen. Die Scala.js-Fassade (ob Sie scala-js-jquery oder jquery-facade verwenden) teilt dem Scala-Code nur mit, wie * jQuery * verwendet werden soll. –