Google отказался поддерживать offsetWidth для SVG.
Есть идеи?
Документ: https://www.chromestatus.com/features/5724912467574784
Собирался это поднять! Слегка обеспокоенный что-то просто перестанет работать в этом месяце.
Да видимо на Opera 37 beta не работает. Кроме того, в последней версии плагина проблемы с отображением фона и границ. У меня один, не проверяют?
В демонстрации также не отображаются фон и границы ((
Это большая проблема, поскольку наши SVG-файлы больше не будут отображаться.
Самый большой виноват в этой функции:
function offsetBounds(node) {
var parent = node.offsetParent ? offsetBounds(node.offsetParent) : {top: 0, left: 0};
return {
top: node.offsetTop + parent.top,
bottom: node.offsetTop + node.offsetHeight + parent.top,
right: node.offsetLeft + parent.left + node.offsetWidth,
left: node.offsetLeft + parent.left,
width: node.offsetWidth,
height: node.offsetHeight
};
}
lines 1887 - 1898
в html2canvas.js
Все offsetTop, offsetLeft, offsetWidth, offsetHeight
теперь не определены для SVG
Рекомендуемое решение - getBoundingClientRect()
, но оно по-прежнему не работает.
У кого-нибудь есть решение для этого?
@MarcBalaban Я еще не пробовал, но разве это не просто добавление этого к возврату в этой функции;
if ( node.tagName === 'SVG' ) {
return node.getBoundingClientRect();
}
@Dayjo, к сожалению, нет, он определенно на правильном пути, но эта строка
var parent = node.offsetParent ? offsetBounds(node.offsetParent) : {top: 0, left: 0};
также не выполняется должным образом, поскольку offsetParent также был амортизирован:
Хм, да, если присмотреться, возможно, здесь потребуется что-то вроде функции getBoundingBoxInArbitrarySpace; https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js согласно http://stackoverflow.com / questions / 5996005 / how-to-use-element-offsetparent-with-html-svg-elements # ответы
Хотя еще не было возможности провести какое-либо тестирование.
Есть новости по этому поводу? Спасибо!
@chemitaxis - несмотря на предупреждение, пока у меня не было проблем с результатом html2canvas. Однако кто знает, будет ли это изменение действительно реализовано в Chrome?
Похоже, теперь Chrome перестал работать. Кажется, что SVG либо вообще не отображаются, либо неправильно, либо имеют неправильный масштаб / положение на холсте.
@niklasvh - есть мысли по этому
Я попробовал это сделать, используя https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js
Но не был уверен, где мне это нужно реализовать, я пробовал использовать обе функции offsetBounds
и getBounds
но безрезультатно. Координаты X и Y кажутся правильными, но ширина и высота неверны, не уверен, что это из-за того, что я использую css, чтобы сделать SVG 100% ширины контейнера и автоматической высоты. Потребуется провести более обширное тестирование.
У меня есть предварительная ветка (https://github.com/Dayjo/html2canvas/tree/issue-846), использующая последнюю бета-версию. если кто-то хочет протестировать, у него должна быть возможность использовать версию dist
или просто пересобрать, если хотите. Не знаю, насколько хорошо / будет ли вообще это работать.
@Dayjo Да, я тоже это заметил. SVG находятся совершенно в неправильном положении и почти всегда не отображаются на экране, когда все смещения * оцениваются как undefined. Я также попробовал решить эту проблему с помощью рекурсивного getBoundingClientRect, но не повезло :( Я посмотрю на вашу ветку.
Решил ... Добавлю раствор в конце недели, если
иметь время. Извините за задержку ... Работает в FF, Safari и Chrome.
Лучший.
В среду, 29 июня 2016 г., в 19:00, Юки К. [email protected] написал:
@Dayjo https://github.com/Dayjo Да, я тоже это заметил. SVG - это
полностью в неправильном положении и почти всегда за пределами экрана, когда
все смещения * оцениваются как неопределенные. Я тоже пробовал свои силы в решении
это с использованием рекурсивного getBoundingClientRect - но не повезло :( Я возьму
посмотрите на свою ветку.-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
или отключить поток
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.
@chemitaxis Замечательно ! С нетерпением жду исправления.
Привет, @chemitaxis , можешь ли ты создать пиар или ссылку на свой форк, если у тебя есть время?
@chemitax есть в этом прогресс? Я надеюсь протестировать код в проекте, над которым я работаю, чтобы увидеть, решит ли он все мои проблемы с SVG, особенно с IE.
Привет @atdiff :) Решил проблему с помощью других библиотек ...
With this, I can convert SVG to Canvas, and them, export fine...
2016-07-21 20:36 GMT+02:00 atdiff notifications@github.com:
@chemitaxis https://github.com/chemitaxis any progress on this? I'm
hoping to test the code out on a project I'm doing to see if it solves all
of my SVG problems especially with IE.—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment-234343779,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ABWseVDGMW_cSyV_ZMDkkUilXC5mK_Mrks5qX7wcgaJpZM4IDr12
.
Итак, @chemitaxis не
Да, используя микширование ... Но я полностью интегрировался, мне нужно провести рефакторинг, чтобы интегрировать и сделать запрос на перенос ... Но у меня нет времени ... Извините, я загружу пример как можно скорее. Лучший.
Вряд ли это решение ... Нет необходимости обойти эту проблему с помощью других библиотек. SVG просто неправильно выложены, и это должно быть просто вопросом расчета правильных позиций.
Кто-нибудь действительно нашел исправление для этого? Кажется, что SVG просто больше не отображается.
Это не исправление, но я нашел небольшое обходное решение. Мне также не удалось заставить SVG правильно отображаться в Chrome, но он будет отображаться в Safari. Все, что я сделал, это добавил атрибут ширины к встроенному элементу SVG. Даже с неточным атрибутом ширины он распечатывается, как и в Chrome и Safari:
var deferred = $q.defer();
element.find('svg').attr('width', '100px');
html2canvas(element, {
background: '#eee',
onrendered: function(canvas) {
var a = document.createElement('a');
a.href = canvas.toDataURL('image/jpeg', 1).replace('image/jpeg', 'image/octet-stream');
a.download = fileName + '.jpg';
a.click();
deferred.resolve();
}
});
return deferred.promise;
Изменить: добавить что-то, что не связано, но другие могут оказаться полезными при поиске здесь. Firefox, похоже, не работал с моим вышеупомянутым методом. В моем SVG было # знаков для шестнадцатеричных цветов (например: #ccc). Поскольку это зарезервированные символы в URL-адресах, и Firefox строго к этому относится, SVG не появился. Вместо этого я заменил значения rgb, и теперь Firefox отображается правильно.
@ jgunderson-IAS спасибо за это, я попробую это как быстрое решение.
Я надеюсь, что у меня будет возможность потратить день на изучение этой ошибки, ну, может быть, полдня на это, затем полдня на то, для чего я его использую, но это должно дать мне возможность, возможно, реализовать реальное решение.
@niklasvh не уверен, смотрели ли вы вообще на это, или есть ли у вас какие-либо предложения относительно того, как лучше всего реализовать исправление (см. https://github.com/niklasvh/html2canvas/issues/846#issuecomment-229035694 )
@ jgunderson-IAS Я явно устанавливал размер SVG, и хотя этот хакерский подход действительно означает, что они отображаются, похоже, что размер непоследователен, я устанавливаю свойства высоты и веса, но они регулярно появляются `` раздавленными '' '. К сожалению, мои страницы полагаются на размеры svg, которые контролируются CSS и являются 100% их контейнера, поэтому, хотя это является ступенькой, я думаю, что мне придется взглянуть на перекодирование библиотеки, чтобы правильно рассчитать размеры.
Вот пример того, как визуализируются svgs теперь, когда я устанавливаю ширину для события 'onClone' на основе ширины родительского элемента (все svgs имеют ширину 100% в css), высота, кажется, еще больше испортила это;
Я использую;
onclone: function(doc){
var w,h;
var svgs = doc.querySelectorAll('svg');
for ( var s = 0; s < svgs.length; ++s ) {
w = svgs[s].parentElement.offsetWidth;
svgs[s].setAttribute('width', w );
}
}
Похоже, что это действительно зависит от самого svg относительно того, насколько хорошо он отображает соотношение сторон. Например, первый (лист) SVG сдавлен намного сильнее, чем два других.
К сожалению, мне пришлось отказаться от использования html2canvas и вместо этого использовать решение на стороне сервера ( wkhtmltoimage
) именно потому, что оно не может точно отображать svgs. Мне не удалось заставить его работать с помощью getBoundingClientRect
или getBBox
т. Д.
Исправлено в 1.0.0
Самый полезный комментарий
Решил ... Добавлю раствор в конце недели, если
иметь время. Извините за задержку ... Работает в FF, Safari и Chrome.
Лучший.
В среду, 29 июня 2016 г., в 19:00, Юки К. [email protected] написал: