Как установить IMG src с данными SVG + XML?

У меня есть функция, которая возвращает файл SVG, который ранее был сгенерирован jSignature и сохранен в файл. Мой скрипт получает фактическое содержимое файла через вызов ajax вместе с другими данными о подписи в большом объекте JSON.

Это автономный проект, поэтому я пытаюсь сохранить данные SVG в локальном хранилище для рендеринга в автономном режиме. Вот почему я не могу просто ссылаться на файлы SVG на сервере.

Я хочу назначить данные изображения SVG элементу IMG, чтобы пользователь мог видеть его в браузере. Как я могу установить эти данные SVG непосредственно в тег IMG без необходимости сначала записывать их в файл?

Если я попытаюсь установить свойство src, изображение покажет недопустимый значок изображения. Я также добавил текст «data: image / svg + xml» перед фактическими данными SVG, но без изменений.

Вот пример:

// This would be read from localStorage:
var image_data = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"1000\" height=\"151\"><path />...snipped...</svg>';

// Show the SVG image:
$("#image1").attr('src', 'data:image/svg+xml,' + image_data);

Однако это не работает. Что я делаю неправильно?

вам нужно будет закодировать URL-адрес image_data. Если он содержит # символов, их нужно будет заменить, например, на% 23, поскольку # является зарезервированным символом в URL-адресах. Вам также не нужны обратные косые черты, если вы не собираетесь кодировать строку в "вместо"

Robert Longson 02.05.2018 09:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 430
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я почти уверен, что вы можете встроить svg в такой src, только если svg закодирован в base64.

Вам, вероятно, будет лучше использовать элемент <svg id = "image1"></svg> и использовать jQuery .replaceWith(..) для его замены, не так ли? (вам не понадобится мусор xml / doctype).

Пример: JFiddle

HTML

<svg id = "image1"></svg>

Javascript

var imageData = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg height = "100" width = "100"><circle cx = "50" cy = "50" r = "40" stroke = "black" stroke-width = "3" fill = "red" /></svg>';
$('#image1').replaceWith( $('<div/>').append(imageData).find('svg:first').attr('id','image1') );

Как мне удалить объявление doctype и т. д. В начале этих данных SVG? Эти данные возвращаются из плагина jSignature, поэтому я не могу изменить их сейчас.

Ryan Griggs 02.05.2018 05:19

Другие вопросы по теме