首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在“节点”上执行“appendChild”失败:仅允许文档上的一个元素

在“节点”上执行“appendChild”失败:仅允许文档上的一个元素
EN

Stack Overflow用户
提问于 2016-12-23 06:58:23
回答 2查看 51.3K关注 0票数 57

我正在尝试加载一个外部svg文件,然后在其之上编写额外的SVG元素。当我这样做时,我会得到以下错误

在“节点”上执行“appendChild”失败:仅允许文档上的一个元素

当我在铬里面检查的时候。

下面是HTML:

代码语言:javascript
运行
AI代码解释
复制
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="css/index.css">
    <title>Hello World</title>
  </head>
  <body>
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="mySvg">
        <circle cx="40" cy="30" r="15" fill="#FF00FF"
          stroke="#000000" stroke-width="2" />
      </svg>
      <object data="img/drawing.svg" type="image/svg+xml"
        align="center" id="svgDrw" height="80vh"></object>
    <script type="text/javascript" src="js/problem.js"></script>
  </body>
</html>

这里是problem.js:

代码语言:javascript
运行
AI代码解释
复制
var svgXtraDoc;
var d = document.getElementById("svgDrw");

d.addEventListener("load",function(){

  // get the inner DOM 
  svgXtraDoc = d.contentDocument;
  // get the inner element by id
  svgRect1 = svgXtraDoc.getElementById("MyRect1");
  svgRect2 = svgXtraDoc.getElementById("MyRect2");
}, false);


function addRect() {
  var svgRect = document.createElementNS("http://www.w3.org/2000/svg", 
    "rect");
  svgRect.setAttribute("x", 100);
  svgRect.setAttribute("y", 100);
  svgRect.setAttribute("width", 100);
  svgRect.setAttribute("height", 100);
  svgRect.style.fill = "red";
  // mySvg.appendChild(svgRect);
  svgXtraDoc.appendChild(svgRect);
}

document.getElementById("mySvg").addEventListener("click", addRect);

..。这里是drawing.svg,去掉了一些Inkscapy巡洋舰:

代码语言:javascript
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   width="29.02857mm"
   height="37.092064mm"
   viewBox="0 0 102.85714 131.42857"
   id="svg2"
   version="1.1">
  <g
     id="layer1"
     transform="translate(-205.71428,-218.07649)">
    <rect
       style="stroke:none;fill-opacity:1;fill:#5eb056"
       id="MyRect1"
       width="102.85714"
       height="131.42857"
       x="205.71428"
       y="218.07649" />
    <rect
       style="fill:#000000;stroke:none;fill-opacity:1"
       id="MyRect2"
       width="42.857143"
       height="65.714287"
       x="231.42857"
       y="252.3622" />
  </g>
</svg>

当您单击圆圈时会出现错误:应该出现在两个矩形导入绘图中的矩形没有出现,并且错误消息“未能在‘Node’上执行'appendChild‘:仅允许文档上的一个元素”。显示在控制台中。

如果我将此更改为将矩形添加到包含圆圈的svg中,即取消注释行"// mySvg.appendChild(svgRect);",则该矩形将成功显示。

我还知道绘图文件正在成功加载,因为在其他代码中(出于简洁的原因,此处不包括),我可以更改该文件中矩形的颜色。因此,我似乎可以访问文件中的现有元素,但不能添加元素。

关于外部加载的SVG还是内联的SVG,我没有考虑到吗?

最后一件事--这是进入Cordova应用程序,所以我想保持它的小,所以纯JavaScript解决方案是首选的。如果有必要的话,我将使用JQuery或SnapSVG,但似乎我的需求非常简单,没有外部库应该可以做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-23 11:26:37

文档的根节点与文档元素之间存在差异。您需要的是<svg>文档元素,但.contentDocument为您获取根节点。

根节点是更高一级的层次结构。这意味着<svg>文档元素驻留在根节点中,根节点可能只有一个<svg>子元素。

要获得文档元素,请执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
svgXtraDoc = d.contentDocument.documentElement;
票数 23
EN

Stack Overflow用户

发布于 2018-02-22 14:50:47

在我的例子中,DOM抱怨是因为我试图在文档本身的中添加一个子元素。

代码语言:javascript
运行
AI代码解释
复制
document.appendChild(myElement);

我通过获取到body标记的引用来解决这个问题:

代码语言:javascript
运行
AI代码解释
复制
document.body.appendChild(logger);
票数 163
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41303634

复制
相关文章
DistributtedShell的container在所有节点上仅执行一次
博客将主要介绍过程2的实现过程,主要思路是首先获取节点列表,再在申请container时,指定节点。具体过程如下:
jiewuyou
2022/09/29
4550
带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败
就地编辑文件(如果提供了后缀,则进行备份),可见参数后缀 SUFFIX 是可选的,即带或者不带这个参数都可以执行。
程序熵
2023/09/25
3880
带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败
在Windows上运行单节点的Cassandra
Cassandra可以安裝在很多系统上, 我是安装在windows server 2008 R2上,安装相当简单,只要把下载下来的压缩包解压缩放到一个目录下就可以了,这里主要是记录下使用体验: Cassandra官网: http://cassandra.apache.org/,下载页面 http://cassandra.apache.org/download/ Cassandra用java开发的,要求安装JVM 1.6以上,推荐 Version 6 Update 23  到Java官网下载 http://w
张善友
2018/01/19
2.4K0
在Windows上运行单节点的Cassandra
在 Docker 上建立多节点的 Hadoop 集群
在上篇文章中你已经看到了在你的devbox创建一个单点Hadoop 集群是多么简单。
星哥玩云
2022/07/01
1.1K0
BackgroundWorker在单独的线程上执行操作
直接使用多线程有时候会带来莫名其妙的错误,不定时的发生,有时候会让程序直接崩溃,其实BackgroundWorker 类允许您在单独的专用线程上运行操作。可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
张果
2022/05/09
1.2K0
BackgroundWorker在单独的线程上执行操作
js插入节点appendChild和insertBefore
首先 从定义来理解 这两个方法:  appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点。语法:appendChild(newchild)  insertBefore() 方法:可在已有的子节点前插入一个新的子节点。语法 :insertBefore(newchild,refchild)  相同之处:插入子节点  不同之处:实现原理方法不同。       appendChild方法是在父级节点中的子节点的末尾添加新的节点(相对于父级节点 来说)。       insertBefore 方
蓓蕾心晴
2018/04/12
3K0
在元素上写事件和addEventListener()的区别[通俗易懂]
语法: element.addEventListener( type , listener , useCapture ) – – 添加事件监听 – – type: 事件类型字符串,不使用“on”前缀 – – callback:事件处理程序(回调函数) – – useCapture:可选参数,是否使用事件捕获的方式处理事件。不传递时,默认为false,表示不使用事件捕获(使用事件冒泡),如果需要显示事件捕获,则显示传递true。
全栈程序员站长
2022/09/18
1.2K0
怎样在windows上定时执行python
作为一个需要在电脑上工作和学习的人,一件十分困扰我的事情就是怎样不受互联网中其他内容的干扰而专注于自己想要做的事情,有的时候真的是沉浸于微博上的消息,忘了自己本来想要做的事。不过我有一件神器,自己爱豆的音频激励,所以决定写一个python脚本,让电脑每小时定时播放,提醒自己专注学习。
py3study
2020/01/19
1.6K0
git+jenkins在windows机器上新建一个slave节点
前言 我们在跑自动化项目的时候,希望有单独的测试机能跑自动化项目,并且能集成到jenkins上构建任务。如果公司已经有jenkins环境了,那无需重新搭建。 只需在现有的平台基础上,新增一个slave
上海-悠悠
2018/04/08
2.9K2
git+jenkins在windows机器上新建一个slave节点
Kafka在Zookeeper上的节点信息和查看方式
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
子润先生
2021/07/06
3.6K0
HTML-JavaScript动态添加元素appendChild
开始自学一下前端的基础知识,这里记录一下知识点,毕竟不熟,不记录很容易就忘记了。前端最佳的学习资料就是在MDN,没有之一。
傅_hc
2020/02/18
1.9K0
HTML-JavaScript动态添加元素appendChild
TKE中在节点上获取容器资源配置
从本质上,容器其实就是一种沙盒技术。就好像把应用隔离在一个盒子内,使其运行。因为有了盒子边界的存在,应用于应用之间不会相互干扰。并且像集装箱一样,拿来就走,随处运行。其实这就是 PaaS 的理想状态。
聂伟星
2020/07/31
1K0
python smtplib在linux上发送邮件失败解决方式
之后放在linux上却 /usr/local/python3/lib/python3.7/socket.py
陈灬大灬海
2020/07/03
2K0
OpenProcess在某些XP系统上打开进程失败的原因
最近用AAU写游戏外挂代码,结果几个客户的电脑上打开游戏进程失败,通过远程协助在客户电脑上鼓捣了好久都没有找到原因。最后想到以前用AU3写的同样功能的软件没有遇到过这种问题,所以就去分析这2个语言打开外部进程时有什么区别。通过对比,发现这两种语言打开外部进程都是调用的kernel32.dll的OpenProcess函数,新说这就好办了,如果他们两个的机制不同,就无法下手。再仔细对比,发现AU3调用OpenProcess时,参数DesiredAccess参数使用的0x1F0FFF,而AAU的process库调
用户2135432
2018/06/04
2.1K0
在腾讯云容器服务Node上执行 kubectl
默认 容器服务 的 Node 上无法执行 kubectl ,需要配置集群访问凭证,如果你开启了内网访问 按照官方教程很好解决,这里介绍下在不开启内网访问的情况下,如何在 Node 上执行 kubectl。
SRE扫地僧
2022/07/03
1.3K0
在腾讯云容器服务Node上执行 kubectl
在Linux上如何查看Python3自带的帮助文档?
俩个步骤: 在Linux终端下输入: ortonwu@ubuntu:~$ pydoc -p 8000 pydoc server ready at http://localhost:8000/ 打开浏览
Tencent JCoder
2018/07/02
1.4K0
在navicat上设置定时计划执行存储过程
有一个存储过程,需要每天定时执行一次。所以在navicat上使用事件处理,当然还有其他的方法,这只是一种。作为参考
Java架构师历程
2019/03/08
2.2K0
在navicat上设置定时计划执行存储过程
腾讯文档品牌升级 (上)
未来已经在那儿了,只不过若隐若现而已。 ——威廉·吉布森 《重来2∶更为简单高效的工作方式》[美] 贾森·弗里德(Jason Fried)[丹]戴维·海涅迈尔·汉森(David Heine 著,李瑜偶秦昊译),中信出版社2018 为什么要做品牌升级? “效率一直是公共舆论中的一个重要话题:在古希腊人眼中,它是政治和社会运转的方式;工业革命早期,亚当·斯密将其视作提升生产力的强劲动力。”时至今日,它被奉为公共生活的首要目标,效率升级实质是广义世界里生产力的一次革新。 科技和物联网以看不见的方式正重塑这个
腾讯ISUX
2020/10/21
1.3K0
在RenderTransform上叠加一个ScaleAt
代码很简单,就是在缩放时,获取鼠标对元素的相对坐标,调用ScaleAt,然后添加到它现有的RenderTransform中
黄腾霄
2020/06/10
5480
如何实现文档检索(上)
MongoDB提供了一个名为db.collection.find()的函数,该函数用于从MongoDB数据库中检索文档。
MongoDB中文社区
2020/03/27
1.7K0

相似问题

错误:在‘Node’上执行'appendChild‘失败:仅允许文档上的一个元素

11

在“节点”上执行“appendChild”失败

10

在节点错误上执行appendchild失败

10

获取错误:在“节点”上执行“appendChild”失败

12

“在‘节点’上执行'appendChild‘失败是什么意思?”

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文