2015-07-21 3 views
3

У меня возникли проблемы с выяснением того, почему два разных svg заставляют мой javascript работать в одном экземпляре, но не в другом. Я только поменял элементы svg в обоих примерах, один работает, а другой нет. Вот код в двух jsFiddles. Рабочий пример я получил от here.svg to png не работает, подозрительные svg отличия элементов

В конечном счете, моя цель - сохранить текущий элемент svg плана этажа и вставить преобразованный png как встроенный img в область с расширенным текстом. Как будто вы сняли снимок экрана плана пола и вложили его в область с богатым текстом, как вы видите на сайтах службы поддержки. У меня просто проблемы с преобразованием в png.

Рабочая: JsFiddle

не работает: JsFiddle

Вот это JS, я не могу добавить код SVG или это поставит меня предел символьного Stackoverflow.

var svgString = new XMLSerializer().serializeToString(document.querySelector('#svg2')); 

var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 
var DOMURL = self.URL || self.webkitURL || self; 
var img = new Image(); 
var svg = new Blob([svgString], { 
    type: "image/svg+xml;charset=utf-8" 
}); 
var url = DOMURL.createObjectURL(svg); 
img.onload = function() { 
    ctx.drawImage(img, 0, 0); 
    var png = canvas.toDataURL("image/png"); 
    document.querySelector('#png-container').innerHTML = '<img src="' + png + '"/>'; 
    DOMURL.revokeObjectURL(png); 
}; 
img.src = url; 

Edit:

С тех пор я остановился на этом коде опуская преобразования PNG/холст, и пытается поместить последовательную строку в формате SVG, непосредственно богатому текстовой области, но он получает сообщение об ошибке в IE, декларации пространства имен, отличные от по умолчанию, не должны иметь пустой URI. Линия: 1, column142

var svgString = new XMLSerializer().serializeToString(document.querySelector('#svg2')); 

var img = new Image(); 

var url = "data:image/svg+xml; charset=utf8, "+encodeURIComponent(svgString); 
img.onload = function() { 

    document.querySelector('.ze_body').innerHTML = '<img src="'+url+'"/>'; 

}; 
img.src = url; 

Также я думаю, что это поможет, если я показал более структуру, как в настоящее время находится эта богатая текстовая области. Это не наше дело, его продукт, который мы используем, и я просто пытаюсь получить карты для вставки в область описания, чтобы он мог жить с билетом. Только доступ у нас есть js, вызванный правилами в форме. Screenshot of ze_body element as it stands in the DOM

ответ

1

Он исходит из вашего объявления пространства имен:

Изменитьxmlns:NS1="" NS1:xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:NS2="" NS2:xmlns:cc="http://creativecommons.org/ns#" xmlns:NS3="" NS3:xmlns:dc="http://purl.org/dc/elements/1.1/"

кxmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> и should work.

отметить также, что, поскольку вы используете XMLSerializer().serializeToString(), вам не нужно, чтобы создать blob и objectURL, можно передавать только data:image/svg+xml; charset=utf8, " и encodeURIComponent(svgString) как адрес вашего изображения. (fiddle).

ps: Вы можете прочитать про декларацию пространства имен here.

+0

Большое спасибо, я вижу, что люди все время чистят пространство имен в видеороликах, но я сделал эти svg с помощью inkscape и даже экономя их Оптимизированный, он по-прежнему оставляет много очистки. Я больше читаю, чтобы выглядеть, спасибо, еще раз. – Dogbyte

+0

У вас есть идея, почему ваш Jsfiddle не будет работать в IE? Я первоначально пробовал это в Chrome, но мне нужно это, чтобы работать и в IE 11. Я не могу получить какие-либо ошибки в консоли, но png img определенно не печатает на экране. – Dogbyte

+0

Да, IE очень ограничен для этой задачи. По-видимому, это не поддерживает объявление какого-либо пространства имен ... Если вы удалите их все, вы сможете рисовать на холст: http://jsfiddle.net/jdh0y4c2/9/. Но тогда это испортит полотно, что сделает невозможным доставку своих данных «dataURL» или «imageData» (по-видимому, IE dev считает, что svg может включать скрипты, поэтому canvas CORS должен применяться к любому svg-изображению, нарисованному в холст.Я не знаю обходных решений, кроме тех, которые просят пользователя IE щелкнуть правой кнопкой мыши по svg или холсту, «сохранить изображение как ...», но это не будет полезно в вашем случае ... – Kaiido