Встроенное редактирование текста в SVG
Я предоставляю встроенный SVG на веб-сайте и должен позволить пользователю добавлять и изменять тексты в этом SVG с помощью WYSIWYG. В основном мне нужно что-то, что работает как svg-edit. Однако мне не нужен полностью редактор WYSIWYG, но только часть редактирования встроенного текста. Я посмотрел исходный код svg-edit, и, кажется, очень сложно извлечь только ту часть его.
Так что я ищу простой способ (возможно, с сторонней библиотекой) для реализации встроенного редактирования текста SVG. Я уже думал о замене текста SVG на ввод текста HTML при сфокусировке, но текст должен отображаться в режиме редактирования точно так же, как он отображается в полученном SVG.
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: Для тех, кто находит этот ответ сейчас, проект прекращен и никогда не достиг зрелой стадии :(
Я искал что-то подобное, но ничего не нашел, поэтому я и мой партнер по магистерской работе решили написать собственное решение. В настоящее время он работает довольно хорошо в Chrome и довольно хорошо в Firefox.
Демо: http://engelfrost.github.io/svg-input-elements/
Код: https://github.com/engelfrost/svg-input-elements
Ответ 2
Я сделал скрипку, которая создавала редактируемый текст везде, где вы нажимаете SVG. Последний шаг - захватить текст HTML и поместить его в элемент SVG.
http://jsfiddle.net/brx3xm59/
Код следует:
var mousedownonelement = false;
window.getlocalmousecoord = function (svg, evt) {
var pt = svg.createSVGPoint();
pt.x = evt.clientX;
pt.y = evt.clientY;
var localpoint = pt.matrixTransform(svg.getScreenCTM().inverse());
localpoint.x = Math.round(localpoint.x);
localpoint.y = Math.round(localpoint.y);
return localpoint;
};
window.createtext = function (localpoint, svg) {
var myforeign = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject')
var textdiv = document.createElement("div");
var textnode = document.createTextNode("Click to edit");
textdiv.appendChild(textnode);
textdiv.setAttribute("contentEditable", "true");
textdiv.setAttribute("width", "auto");
myforeign.setAttribute("width", "100%");
myforeign.setAttribute("height", "100%");
myforeign.classList.add("foreign"); //to make div fit text
textdiv.classList.add("insideforeign"); //to make div fit text
textdiv.addEventListener("mousedown", elementMousedown, false);
myforeign.setAttributeNS(null, "transform", "translate(" + localpoint.x + " " + localpoint.y + ")");
svg.appendChild(myforeign);
myforeign.appendChild(textdiv);
};
function elementMousedown(evt) {
mousedownonelement = true;
}
$(('#thesvg')).click(function (evt) {
var svg = document.getElementById('thesvg');
var localpoint = getlocalmousecoord(svg, evt);
if (!mousedownonelement) {
createtext(localpoint, svg);
} else {
mousedownonelement = false;
}
});
Ответ 3
Вот пример, где вы можете получить и изменить текст из текстового блока. Я предлагаю написать функцию JavaScript, которая помещает редактируемый div
или что-то подобное вместо текстового поля и при сохранении заменяет текстовый индекс на innerHTML
div
.
Пожалуйста, разместите окончательный код здесь, когда вам удастся.
<html>
<head>
<script>
function svgMod(){
var circle1 = document.getElementById("circle1");
circle1.style.fill="blue";
}
function svgMod2(){
var circle1 = document.getElementById("circle1");
t1.textContent="New content";
}
</script>
</head>
<body>
<svg id="svg1" xmlns="http://www.w3.org/2000/svg" style="width: 800; height: 1000">
<circle id="circle1" r="100" cx="134" cy="134" style="fill: red; stroke: blue; stroke-width: 2"/>
<text id="t1" x="50" y="120" onclick="alert(t1.textContent)">Example SVG text 1</text>
</svg>
<button onclick=circle1.style.fill="yellow";>Click to change to yellow</button>
<button onclick=javascript:svgMod();>Click to change to blue</button>
<button onclick=javascript:svgMod2();>Click to change text</button>
</body>
</html>