問題是根據它們的top
CSS屬性對根節點的所有子div進行排序。如何通過Scala.js中的屬性值對子節點進行排序?
這裏是我的代碼:
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)
}
我是新來Scala.js,並花了相當的努力,想出這個解決方案。它編譯和似乎工作,但我不知道它是多麼合法。
例如,我只能以非常複雜的方式獲取節點的top
屬性。另外我懷疑,要刪除所有子節點global.document.getElementById("root").innerHTML = ""
是一種後門方式。我不確定這種排序是否可以在不創建克隆的情況下完成。我歡迎任何有待改進的建議,我希望有些初學者可能會發現這些代碼甚至有用。
感謝您提出這些建議。我實際上知道Scala.js.有一個jQuery擴展,但是我根本無法導入這個擴展:https://github.com/scala-js/scala-js-jquery,我得到了所有關於它的神祕錯誤信息捆綁。 D3.js擴展程序很容易導入,並且可以作爲魅力使用,目前我用它來進行選擇。我將不勝感激任何關於如何導入jQuery的幫助(一個完整的工作示例可能)。使用客戶端和服務器(+共享代碼)編譯在一起的集成項目使事情進一步複雜化:https://github.com/vmunier/play-with-scalajs-example。 – sbtpr
那麼,使用vmunier的庫是非常符合沼澤標準的 - 我自己使用它。我建議使用較新的jquery-facade(上面鏈接)而不是舊的scala-js-jquery。但我不知道捆綁錯誤來自哪裏 - 這有點奇怪。我將很快出發,但我建議將它放在scala-js/scala-js Gitter頻道(這是Scala.js社區的核心),併發布您看到的錯誤 - 那裏的人可能會有幫助。 –
另外,萬一它不明顯:請記住,它不是任何類型的jQuery *擴展*,它只是一個門面。您仍然需要在您的Scala.js代碼之前包含jQuery本身。 Scala.js外觀(無論使用scala-js-jquery還是jquery-facade)只是告訴Scala代碼如何*使用* jQuery。 –