Подтвердить что ты не робот

Создание элементов SVG динамически с помощью javascript внутри HTML

Я хочу создать прямоугольник внутри HTML-страницы, а затем написать текст на этом прямоугольнике. Мне также нужен, чтобы текст был гиперссылкой. Это то, что я сделал, но он не работает:

    <!DOCTYPE html>
<html>
<body>

<script>

    var svg   = document.documentElement;
    var svgNS = svg.namespaceURI;

    var rect = document.createElementNS(svgNS,'rect');
    rect.setAttribute('x',5);
    rect.setAttribute('y',5);
    rect.setAttribute('width',500);
    rect.setAttribute('height',500);
    rect.setAttribute('fill','#95B3D7');
    svg.appendChild(rect);
    document.body.appendChild(svg);

    var h=document.createElement('a');
    var t=document.createTextNode('Hello World');
    h.appendChild(t);
    document.body.appendChild(h);


</script>

</body>
</html>

Вы можете помочь? Спасибо.

4b9b3361

Ответ 1

Изменение

var svg   = document.documentElement;

в

var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");

так что вы создаете элемент SVG.

Чтобы ссылка была гиперссылкой, просто добавьте атрибут href:

h.setAttributeNS(null, 'href', 'http://www.google.com');

Демонстрация

Ответ 2

Добавьте это в html:

<svg id="mySVG" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>

Попробуйте эту функцию и адаптируйте для вас программу:

var svgNS = "http://www.w3.org/2000/svg";  

function createCircle()
{
    var myCircle = document.createElementNS(svgNS,"circle"); //to create a circle. for rectangle use "rectangle"
    myCircle.setAttributeNS(null,"id","mycircle");
    myCircle.setAttributeNS(null,"cx",100);
    myCircle.setAttributeNS(null,"cy",100);
    myCircle.setAttributeNS(null,"r",50);
    myCircle.setAttributeNS(null,"fill","black");
    myCircle.setAttributeNS(null,"stroke","none");

    document.getElementById("mySVG").appendChild(myCircle);
}     

Ответ 3

Чтобы облегчить редактирование svg, вы можете использовать промежуточную функцию:

function getNode(n, v) {
  n = document.createElementNS("http://www.w3.org/2000/svg", n);
  for (var p in v)
    n.setAttributeNS(null, p, v[p]);
  return n
}

Теперь вы можете написать:

svg.appendChild( getNode('rect', { width:200, height:20, fill:'#ff0000' }) );

Пример (с улучшенной функцией getNode, позволяющей camelcase для свойства с тире, например, strokeWidth > ширина штриха):

function getNode(n, v) {
  n = document.createElementNS("http://www.w3.org/2000/svg", n);
  for (var p in v)
    n.setAttributeNS(null, p.replace(/[A-Z]/g, function(m, p, o, s) { return "-" + m.toLowerCase(); }), v[p]);
  return n
}

var svg = getNode("svg");
document.body.appendChild(svg);

var r = getNode('rect', { x: 10, y: 10, width: 100, height: 20, fill:'#ff00ff' });
svg.appendChild(r);

var r = getNode('rect', { x: 20, y: 40, width: 100, height: 40, rx: 8, ry: 8, fill: 'pink', stroke:'purple', strokeWidth:7 });
svg.appendChild(r);