javascript - 使用 Javascript 以编程方式创建 SVG 标记

标签 javascript svg marker

是否可以使用 Javascript 在 SVG 中创建标记,然后将其应用于新创建的行?如果是这样,请告诉我下面的代码有什么问题。我希望红线和绿线都有箭头,但在 Chrome 和 Firefox 3.6 中只有绿线有。

<?php

header('Content-type: application/xhtml+xml');
echo '<?xml version="1.0" encoding="utf-8" ?>';

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>SVG test</title>
<script type="text/javascript">
function init()
{
    var div = document.getElementById('mainDiv');

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

    svgNode.style.width = "200px";
    svgNode.style.height = "200px";
    svgNode.style.overflow = 'visible';
    svgNode.style.position = 'absolute';
    svgNode.setAttribute('version', '1.1');
    svgNode.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
    div.appendChild(svgNode);

    var defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
    var marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker');
    marker.setAttribute('id', 'Triangle');
    marker.setAttribute('viewBox', '0 0 10 10');
    marker.setAttribute('refX', '0');
    marker.setAttribute('refY', '5');
    marker.setAttribute('markerUnits', 'strokeWidth');
    marker.setAttribute('markerWidth', '4');
    marker.setAttribute('markerHeight', '3');
    marker.setAttribute('orient', 'auto');
    var path = document.createElementNS('http;//www.w3.org/2000/svg', 'path');
    marker.appendChild(path);
    path.setAttribute('d', 'M 0 0 L 10 5 L 0 10 z');

    svgNode.appendChild(defs);
    defs.appendChild(marker);

    var obj = document.createElementNS('http://www.w3.org/2000/svg', 'line');
    obj.setAttribute('x1', 50);
    obj.setAttribute('y1', 50);
    obj.setAttribute('x2', 50);
    obj.setAttribute('y2', 150);
    obj.setAttribute('stroke', '#ff0000');
    obj.setAttribute('stroke-width', 7);
    obj.setAttribute('marker-end', 'url(#Triangle)');

    svgNode.appendChild(obj);


}
</script>
</head>

<body onload="init();">
<div id="mainDiv" style="width: 100%; height: 100%; visibility: visible; overflow: visible; position: absolute; background: white;">
    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" style="width: 200px; height: 200px; position: absolute;">
        <defs>
            <marker id="Triangle-static" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="4" markerHeight="3" orient="auto">
                <path d="M 0 0 L 10 5 L 0 10 z"></path>
            </marker>
        </defs>
        <line x1="150" y1="50" x2="150" y2="150" stroke="#00ff00" stroke-width="7" marker-end="url(#Triangle-static)" />
    </svg>
</div>
</body>

</html>

最佳答案

如果我像这样更改您的代码的某些部分,它工作正常:

var newmarker = oldmarker.cloneNode(true);
newmarker.setAttribute("id", "Triangle");

...这表明错误出在创建标记元素的代码中。

关于javascript - 使用 Javascript 以编程方式创建 SVG 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3290392/

相关文章:

javascript - 如何禁用 bsdatePicker 中的 future 日期

javascript - 如何在@click 上更新模板

java - 使用 Java 读取 svg 路径数据的最简单方法?

ios - 从 mapview 获取所有 GMSMarker 并在不使用 mapview.clear() 的情况下删除所有标记

python - 子图中每个标记中变量的数据值

javascript - 查询 : Put line break (press enter button) on entering certain character in text area

javascript - 如何从 Google 我的商家 API 获取帖子

angular - 带有 angular-cli 的 SVG 图标系统

javascript - ScrollMagic,反向 z 索引顺序

android - 长按 map 以打开警报对话框以在 Google map 中创建标记