gpt4 book ai didi

javascript - 利用 d3 在 SVG 中渲染 foreignObject 失败

转载 作者:行者123 更新时间:2023-11-29 22:16:20 26 4
gpt4 key购买 nike

我已经阅读了相关的帖子,感觉我的代码是准确的;我也尝试过对这段代码进行多次修改。我希望有人能找到我确定是我的代码中的小错误,因为我没有运气检测到它。

问题:foreignObject 元素的内容未在浏览器中以可视方式呈现。 DOM 元素显然已插入到 DOM 中但不可见。

我注意到在 Chrome web 开发人员中,foreignObject 元素在元素检查器中不是驼峰式,但是在编辑 html 内联时它是可编辑的驼峰式,所以显然该元素被保存为驼峰式。这可能对问题没有影响,但我想我会提到它。

执行后的DOM:

<g class="component" transform="translate(75,20)">
<rect width="100" height="100" fill="red" opacity="1">
<foreignObject width="100" height="100" requiredExtensions="http://www.w3.org/1999/xhtml">
<body xmlns="http://www.w3.org/1999/xhtml">
<div style="width: 100px; height: 100px; background-color: yellow;" data-uid="special_uid">
</div>
</body>
</foreignObject>
</rect>
</g>

D3 SVG/XHTML 生成代码(CoffeeScript):

  component = canvas.select("[data-uid=#{entityObj.name}]").selectAll('.component')
.data(entityObj.components)
.enter()
.append("g")
.each( (componentObj,i,d) =>
@generateAssociationLocalCache(entityObj,componentObj,i,d)
@generateComponentLocalCache(entityObj,componentObj,i,d)
)
.attr("data-uid", (o,i,d)-> o.name)
.attr("id", (o,i,d)-> o.name)
.attr("class", "component")
.attr("transform", (componentObj,i,d) =>
coords = @rows[entityObj.name]['components'][componentObj.uid]
"translate(#{coords.x},#{coords["y#{i}"]})"
)
.append("rect")
.attr("width", (componentObj,i,d) => componentObj.width)
.attr("height", @get('component').height)
.attr("fill", "red")
.attr("opacity", "1")
.append("foreignObject")
.attr("width", (componentObj,i,d) => componentObj.width)
.attr("height", @get('component').height)
.attr("requiredExtensions", "http://www.w3.org/1999/xhtml")
.append("body")
.attr("xmlns","http://www.w3.org/1999/xhtml")
.append("div")
.attr("style", (componentObj,i,d) => "width: #{componentObj.width}px; height: #{@get('component').height}px; background-color: yellow;")
.attr("data-uid", (o,i,d) -> o.uid)

Rendered rect element

最佳答案

您至少有 2 个问题。首先<foreignObject>不能是 <rect> 的 child 元素。我不确定您要实现什么目标,但您可能需要拆分代码

  var g = component.append("g")
.each( (componentObj,i,d) =>
@generateAssociationLocalCache(entityObj,componentObj,i,d)
@generateComponentLocalCache(entityObj,componentObj,i,d)
)
.attr("data-uid", (o,i,d)-> o.name)
.attr("id", (o,i,d)-> o.name)
.attr("class", "component")
.attr("transform", (componentObj,i,d) =>
coords = @rows[entityObj.name]['components'][componentObj.uid]
"translate(#{coords.x},#{coords["y#{i}"]})"
)

然后做

g.append("rect")  
.attr("width", (componentObj,i,d) => componentObj.width)
.attr("height", @get('component').height)
.attr("fill", "red")
.attr("opacity", "1");

g.append("foreignObject")
...

这将使 rect 和 foreignObject 成为 sibling 。

其次,xmlns 不是您可以在创建对象后设置的属性,所以

.append("body")
.attr("xmlns","http://www.w3.org/1999/xhtml")

应该是

.append("xhtml:body")

d3 然后会在正确的命名空间中创建元素。

关于javascript - 利用 d3 在 SVG 中渲染 foreignObject 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14941971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com