(对不起,我英语不好)
你好,
我正在使用这个很棒的脚本来渲染 SVG 标签
当我将 SVG 中的文本标签渲染到画布时,有一些文本重叠
文本标签被处理为文本节点和 SVG
您可以使用转换属性轻松看到
这是示例代码(使用 html2canvas 0.5.0-alpha2)
<html>
<head>
<script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="js/html2canvas.js"></script>
</head>
<body>
<svg width="100" height="100">
<g transform="translate(20,20)">
<text dy=".45em" y="10" x="0" dx="-.8em" transform="translate(0,0) rotate(-70)" style="font-size:12px;">Text</text>
</g>
</svg>
<script>
$(document).ready(function() {
html2canvas(document.body, {
onrendered: function(canvas) {
document.body.appendChild(canvas);
}
});
})
</script>
</body>
</html
这是我的快速更改
NodeParser.prototype.getChildren = function(parentContainer) {
return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
var container = [node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
}, this));
};
我希望这个能帮上忙
谢谢#孝真。 这对我有帮助。
谢谢,帮了我很多!
感谢您的修复!
您还可以检查 tspan tagName :
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" && node.parentElement.tagName !== "tspan"
@ncoquelet我更新了我的代码。 谢谢!
@hyojin
在 IE 上对其进行测试后,您的修复不起作用,因为parentElement
属性未填充到当前节点上。 使用parentNode
代替! 无论如何,它会更清楚,因为我们进入了NodeParser
并且它谈论了节点。
否则,改为测试标签名称,我更改我的代码以测试parentNode
的实例,并仅在 parentNode 不是SVGElement
时才处理当前节点具有TextContainer
SVGElement
.
它适用于 chrome 和 ie11。 在 Firefox 上,由于空白画布错误,我无法对其进行测试!
我的代码
NodeParser.prototype.getChildren = function(parentContainer) {
return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
}, this));
};
我希望这有帮助。
修复我的 firefox 问题,也适用于 ff :-)
更清晰!
我还检查了它在 ff 上运行良好。
我合并了您的修复程序并更新了拉取请求。 谢谢 :)
@hyojin @ncoquelet感谢您对此的调查和修复。 前几天我遇到了完全相同的问题,我不完全确定是什么导致了它。
我不确定在这里我在哪里感到困惑,但我收到了“未捕获的 ReferenceError:NodeParser 未定义”的异常
@Suchetana10你什么时候得到异常? 在加载脚本中?
@hyojin谢谢你..为我工作
@hyojin谢谢! 也非常适合我
happyvishwasvadavi ugnugen我很高兴听到这个消息! :)
有些人仍然有文本元素的问题,我改变这个问题打开,我会再次发送 PR。
有没有人有我可以测试的带有此修复程序的库的构建? 在 highcharts 页面上看到同样的问题..
此版本是否可用于修复? 我仍然面临 highcharts 的这个问题。
此修复程序在构建中可用还是我们必须创建覆盖?
此问题已自动关闭,因为我们要求原作者提供更多信息的请求没有得到回应。 只有当前问题中的信息,我们没有足够的信息来采取行动。 如果您有或找到我们需要的答案,请联系我们,以便我们进一步调查。
亲爱的@niklasvh ,
感谢您提供这个惊人的图书馆。 我可以用最新版本 - v1.0.0-rc.3 重现这个问题
我在CodePen上创建了一个示例(仅限 Chrome),您将在其中看到一些文本节点(在图表标题中)被复制。
重现步骤 -
图表标题添加在第 193 行
@hyojin ,你
问候,
卡兰
嗨@karannagupta
你能试试我的分支来检查它是否来自同样的原因吗?
嗨@hyojin
对于您的库版本 (v0.5.0-alpha2),它不起作用。 你可以在这里在我的笔上测试你的
另外,我想使用最新版本的 html2canvas。 那时我也不需要使用 html2canvas.svg。
问候,
卡兰
原来这是Unicode字体的问题
最有用的评论
@hyojin
在 IE 上对其进行测试后,您的修复不起作用,因为
parentElement
属性未填充到当前节点上。 使用parentNode
代替! 无论如何,它会更清楚,因为我们进入了NodeParser
并且它谈论了节点。否则,改为测试标签名称,我更改我的代码以测试
parentNode
的实例,并仅在 parentNode 不是SVGElement
时才处理当前节点具有TextContainer
SVGElement
.它适用于 chrome 和 ie11。 在 Firefox 上,由于空白画布错误,我无法对其进行测试!
我的代码
我希望这有帮助。