(Извините, я не очень хорошо говорю по-английски)
Привет,
Я использую этот замечательный скрипт для рендеринга тегов SVG
Когда я визуализирую текстовый тег в SVG на холсте, наблюдается перекрытие текста.
Текстовый тег обрабатывается как текстовый узел, а также как SVG
Вы можете легко убедиться в этом с помощью свойства transform
Вот пример кода (с 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! == "текст" && node.parentElement.tagName! == "tspan"
@ncoquelet Я обновил свой код . Спасибо!
@hyojin
После тестирования в IE ваше исправление не работает, потому что свойство parentElement
не заполнено на текущем узле. Вместо этого используйте parentNode
! В любом случае это будет более понятно, потому что мы находимся в NodeParser
и он говорит об узле.
В противном случае вместо проверки имени тега я изменяю свой код для проверки экземпляра parentNode
и обрабатываю текущий узел, имеющий TextContainer
только если parentNode не является 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 благодарит за расследование и исправление. На днях я столкнулся с той же проблемой, и я не совсем понял, что ее вызывает.
Я не уверен, где я здесь запутался, но получаю исключение: "Uncaught ReferenceError: NodeParser is not defined"
@ Suchetana10 Когда вы получили исключение? в скрипте загрузки?
@hyojin спасибо .. работал у меня
@hyojin, спасибо! отлично работает и для меня
happyvishwasvadavi ugnugen Я рада это слышать! :)
У некоторых людей все еще есть проблема с текстовым элементом, я открываю эту проблему и снова отправлю PR.
Есть ли у кого-нибудь сборка библиотеки с этим исправлением, которую я могу протестировать? Увидеть ту же проблему на странице высоких диаграмм ..
Доступна ли эта сборка с исправлением? Я все еще сталкиваюсь с этой проблемой с высокими диаграммами.
Доступно ли это исправление в сборке или нам нужно создать переопределение?
Это все еще проблема с версией 1.0.0 ? Если да, не могли бы вы поделиться примером на jsfiddle .
Эта проблема была автоматически закрыта, потому что на наш запрос о дополнительной информации от первоначального автора не поступило ответа. Имея только ту информацию, которая в настоящее время является проблемой, у нас недостаточно информации для принятия мер. Если у вас есть или вы найдете нужные нам ответы, свяжитесь с нами, чтобы мы могли продолжить расследование.
Уважаемый @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
и обрабатываю текущий узел, имеющийTextContainer
только если parentNode не являетсяSVGElement
.Работает на chrome и ie11. в firefox я не могу проверить это из-за ошибки пустого холста!
Мой код
Надеюсь, это поможет.