拖拽 SVG添加节点,调试代码添加成功但渲染无效果,为什么?

问题:看图
1没拖拽组件时
图片描述

2拖拽组件后,在SVG中没有渲染出组件
图片描述

HTML SVG标签代码

<template>
    <div>
      <svg class="svg-main" @drop='drop($event)' @dragover='allowDrop($event)'>
        <g class="pane-cell pane-node" transform="translate(110,15)">
          <g class="pane-scalable" transform="scale(1,1)">
            <foreignObject width="180" height="30">
              <body xmlns="http://www.w3.org/1999/xhtml">
              <div class="pane-node-content element-training">
                <span class="icon icon-shape"></span>
                <span></span>
                <span class="name">预测-1</span>
                <span class="status "></span>
              </div>
              </body>
            </foreignObject>
          </g>
        </g>
      </svg>
    </div>
</template>

克隆节点并插入svg标签中的代码

export default {
    methods: {
      drop:function(event){
        event.preventDefault();
        var datae = event.dataTransfer.getData("mlNodeid");
        var item = document.getElementById(datae).cloneNode(true);
        var div=document.createElement('div');div.setAttribute('class','pane-node-content element-training');div.appendChild(item);
        var body=document.createElement('body');body.setAttribute('xmlns','http://www.w3.org/1999/xhtml');body.appendChild(div);
        var Object=document.createElement('foreignObject');Object.setAttribute('width','180');Object.setAttribute('height',30);Object.appendChild(body);
        var g2=document.createElement('g');g2.setAttribute('transform','scale(1,1)');g2.setAttribute('class','pane-scalable');g2.appendChild(Object);
        var g=document.createElement('g');g.setAttribute('transform','translate(110,50)');g.setAttribute('class','pane-cell pane-node');g.appendChild(g2);
        event.target.appendChild(g);
      },
      allowDrop:function(event){//阻止冒泡
        event.preventDefault();
      }
    }
  };
阅读 3k
2 个回答

svg中添加图形节点,查看html,你会发现dom节点更新了,但图形没有变化。为什么?你要知道,svg是一个置换元素,置换元素是什么,你可以看看这篇文章,简单来说,svg和div这些dom元素这些不一样,其表现由其内部绘制元素决定,就像置换元素img一样,其表现由其属性src决定。另外你还需要因为这样,svg中的绘制元素,是不支持事件委托的。

export default {
    methods: {
      drop:function(event){
        event.preventDefault();
        var datae = event.dataTransfer.getData("mlNodeid");
        var item = document.getElementById(datae).cloneNode(true);
        var div=document.createElement('div');div.setAttribute('class','pane-node-content element-training');div.appendChild(item);
        var body=document.createElement('body');body.setAttribute('xmlns','http://www.w3.org/1999/xhtml');body.appendChild(div);
        var Object=document.createElementNS("http://www.w3.org/2000/svg",'foreignObject');Object.setAttribute('width','180');Object.setAttribute('height',30);Object.appendChild(body);
        var g2=document.createElementNS( "http://www.w3.org/2000/svg", "g" );g2.setAttribute('transform','scale(1,1)');g2.setAttribute('class','pane-scalable');g2.appendChild(Object);
        var g=document.createElementNS( "http://www.w3.org/2000/svg", "g" );g.setAttribute('transform','translate(110,50)');g.setAttribute('class','pane-cell pane-node');g.appendChild(g2);

        event.target.appendChild(g);
      },
      allowDrop:function(event){//阻止冒泡
        event.preventDefault();
      }
    }
  };
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏