jquery - Scala.js:选择和操作生成的 SVG

标签 jquery scala dom svg scala.js

我正在努力解决一些看似简单的事情。

使用 Scaja.JS,我通过 ScalaTags 库生成了一些 SVG。

我现在希望使用事件操作 SVG 元素:

circ.onclick = { e: dom.MouseEvent => ... }

具体来说,我想选择某个类的所有元素,然后在它们上切换一些类属性。

我尝试了 Scala.js JQuery 绑定(bind)。虽然我可以用它检索选择,但我无法操作所选元素(设置类等)。这似乎是 SVG 作为一种不同类型的 DOM 的一个根本问题,无法使用 JQuery 进行操作。

接下来,我尝试了低级 DOM API。这让我做出选择:

document.body.getElementsByClassName("myClass").foreach { node =>  ... }

我现在很难操作节点的属性。我可以访问它们,但无法设置它们,因为 node.attributes.setNamedItem(...) 需要一个 raw.Attr 参数,但我在创建时遇到了麻烦,没有构造函数来设置 Attrname

此外,使用低级 API 非常不方便。我更愿意选择一些更容易操作的类,例如元素

有什么想法吗?

最佳答案

JavaScript DOM api 中也没有 Attr 的构造函数。尝试在 JavaScript 中计算 new Attr() 将导致“非法构造函数”类型错误。但是,您可以使用 document.createAttribute(name: String) 创建属性。

尽管 getElementsByClassName 返回一个 NodeList,但每个项目实际上都是一个 Element(您必须使用模式匹配或类似方法对其进行向下转换)。从 dom.Element 中,您可以调用 setAttribute(name: String, value: String),这可能比手动创建 Attr 更方便这么低的水平。

此外,jQuery 使用表达式选择 dom 元素的能力现在大部分已使用 document.querySelectorAll 内置到 DOM 中。您可以尝试类似 svgDocument.querySelectorAll(".foo").map(_.asInstanceOf[dom.raw.SVGElement]) .foreach { _.setAttribute("someAttribute", "newValue") }.

当然,要将 NodeList 视为 Scala 集合,需要 import org.scalajs.dom.ext._ 将隐式引入范围,但看起来您已经在这样做了那个。

关于jquery - Scala.js:选择和操作生成的 SVG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30647361/

相关文章:

javascript - jQuery 匿名函数的 ESLint 错误

javascript - 使用 JavaScript 导航复杂/臃肿的 DOM 结构

javascript - 为什么我的 JS/DOM 代码不显示任何内容?

javascript - 如何将 AJAX 请求从 vanilla JS 重写为 JQuery?

javascript - 如何使用 getJson 单击事件(从 href 触发)返回的数据填充模式主体?

scala - ScalaZ OptionT 异常

scala - 在一个模式中多次使用相同的变量

Scala,如何访问整个匹配项 : X match {case Y(z) as matched =>

javascript - 如何在浏览器窗口中显示此 javascript 片段的结果?

javascript - 如何使用 jQuery 按多个条件正确过滤列表?