Html2canvas: Текстовые теги в SVG перекрываются (дублируются / удваиваются)

Созданный на 19 февр. 2015  ·  24Комментарии  ·  Источник: niklasvh/html2canvas

(Извините, я не очень хорошо говорю по-английски)

Привет,
Я использую этот замечательный скрипт для рендеринга тегов SVG
Когда я визуализирую текстовый тег в SVG на холсте, наблюдается перекрытие текста.
Текстовый тег обрабатывается как текстовый узел, а также как SVG
Вы можете легко убедиться в этом с помощью свойства transform
2015-02-19 15 08 29_2
Вот пример кода (с 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));
};

Я надеюсь, это поможет

Needs More Information

Самый полезный комментарий

@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));
};

Надеюсь, это поможет.

Все 24 Комментарий

Спасибо, # Хёджин. Это мне помогает.

Спасибо, очень помогите мне!

Спасибо за исправление!

вы также можете проверить 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.

image

Есть ли у кого-нибудь сборка библиотеки с этим исправлением, которую я могу протестировать? Увидеть ту же проблему на странице высоких диаграмм ..

Доступна ли эта сборка с исправлением? Я все еще сталкиваюсь с этой проблемой с высокими диаграммами.

Доступно ли это исправление в сборке или нам нужно создать переопределение?

Это все еще проблема с версией 1.0.0 ? Если да, не могли бы вы поделиться примером на jsfiddle .

Эта проблема была автоматически закрыта, потому что на наш запрос о дополнительной информации от первоначального автора не поступило ответа. Имея только ту информацию, которая в настоящее время является проблемой, у нас недостаточно информации для принятия мер. Если у вас есть или вы найдете нужные нам ответы, свяжитесь с нами, чтобы мы могли продолжить расследование.

Уважаемый @niklasvh ,

Спасибо за эту замечательную библиотеку. Я могу воспроизвести эту проблему в последней версии - v1.0.0-rc.3

Я создал здесь пример на CodePen (только для Chrome), где вы увидите, что некоторые текстовые узлы (в заголовке графика) дублируются.

Действия по воспроизведению -

  1. Откройте ссылку CodePen - https://codepen.io/karannagupta/pen/RXpddB только в Chrome
  2. Нажмите кнопку Копировать в буфер обмена.
  3. Подождите, пока анимация закончится (или см. В консоли скопированное сообщение)
  4. Вставьте график в краску или документ (ctrl + v)

Заголовки графиков добавлены в строке №193.

@hyojin , не могли бы вы снова открыть вопрос?

С уважением,
Каран



text-duplication

Привет @karannagupta
Не могли бы вы попробовать мою ветку, чтобы проверить, исходит ли она по той же причине?

Привет @hyojin

С вашей версией библиотеки (v0.5.0-alpha2) это не работает. Вы можете протестировать свою библиотеку на моей ручке здесь

Также я хотел бы использовать последнюю версию html2canvas. Тогда мне также не нужно использовать html2canvas.svg.

С уважением,
Каран

Оказывается, проблема в шрифтах Unicode.

image

Была ли эта страница полезной?
0 / 5 - 0 рейтинги