javascript - d3.create() 返回一个带.node() 的元素,但在浏览器中不显示

标签 javascript svg d3.js

<分区>

  1. 我试图让 D3.js 使用 d3.create() 生成矩形元素。它不工作/显示。

  2. 首先,我创建了一个 rectangle() 函数,它返回一个元素:

    function rectangle() {
    
        _el = d3.create("rect")
            .attr("stroke", "black")
            .attr("fill", "black")
            .attr("stroke-width", "10px")
            .attr("x", 0)
            .attr("y", 0)
            .attr("width", 300)
            .attr("height", 200);
    
        return _el
    
    }
    
  3. 然后我创建了一个 SVG 选择,我在其中附加了一个 rectangle().node() 的实例:

    
    const SVG_WIDTH = 1000;
    const SVG_HEIGHT = 1000;
    
    svg = d3.select("body").append("svg")
        .attr("width", SVG_WIDTH)
        .attr("height", SVG_HEIGHT)
        .attr("id", "generated")
    
    svg.append(
        // () => rectangle().node()
        function () { return rectangle().node() }
    )
    
  4. 但我的浏览器 (Google Chrome) 中没有视觉输出。

  5. 但是,当我查看 DOM(通过 Chrome 的“元素”选项卡)时,D3 已生成正确的 SVG/矩形代码:

    <svg width="1000" height="1000" id="generated">
        <rect stroke="black" fill="black" stroke-width="10px" x="0" y="0" width="300" height="200" rx="10" ry="10"></rect>
    </svg>
    
  6. 事实上,如果我复制上面的代码并将其不加修改地放置在我的 HTML 文件中的其他任何位置,我的浏览器中就会出现一个矩形。

  7. 为什么 SVG 对浏览器 DOM 的修改不显示/工作,但它生成的代码是正确的,并且在手动复制/粘贴到 HTML 时会显示?

最佳答案

来自 d3.create documentation :

This method assumes the HTML namespace, so you must specify a namespace explicitly when creating SVG or other non-HTML elements [...]

    d3.create("svg") // equivalent to svg:svg  
    d3.create("svg:svg") // more explicitly  
    d3.create("svg:g") // an SVG G element  
    d3.create("g") // an HTML G (unknown) element  

因此,创建矩形的函数应该使用svg:rect。否则它将创建一个“HTML 矩形”而不是“SVG 矩形”。

默认情况下,d3.create 方法在 HTML 命名空间中创建元素。当您使用 d3.create('rect') 时,您创建的不是 SVG 矩形,而是 HTML 矩形(HTML 规范中不存在)。该元素出现在 DOM 中,但浏览器不知道如何呈现它(它具有 SVG 元素的名称,但不是 SVG 元素),因此它不会出现在屏幕上。

每个 HTML 元素都有一个隐含的 xhtml: 前缀,而 SVG 中的每个 SVG 元素都隐含有一个 svg: 前缀。通常你不需要担心它,因为命名空间通常很明显,可以由库处理。但是,d3.create 无法告诉您想要哪个,因为它是一个分离元素;所以它默认为 HTML。

因此,即使 svg:rectxhtml:rect 在 DOM 上具有相同的名称,它们指的是不同的规范,并且是唯一有意义的对于浏览器是 svg:rect

关于javascript - d3.create() 返回一个带.node() 的元素,但在浏览器中不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65871522/

相关文章:

javascript - D3.js如何从具有多个Y轴列的数据数组中提取Y域值

javascript - d3 使用 d3.map 和 d3queue() 函数读取 csv

javascript - 如何配置 StrongLoop LoopBack MongoDB 数据源以部署到 Heroku

javascript - SVG 的 toggleClass 效果如何?

javascript - 隐藏可滚动的标题(HTML ID)

javascript [array].splice 不工作 ("Uncaught TypeError: collisions.splice is not a function")

iOS : display svg from JSON

javascript - 使用 d3.js 未显示选择选项?

即使使用正确的语法,JavaScript 仍显示空白值

javascript - Angular Promises - 从成功跳转到失败回调?