You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fetch与模板字符串向DOM追加内容时遇TypeError报错求助

解决Uncaught (in promise) TypeError: appendChild参数不是Node类型的问题

嘿,这个坑我当初刚上手原生DOM操作时也踩过!咱们先把问题根源掰扯清楚:

你用模板字符串生成的markup是普通字符串,但原生DOM的appendChild()方法只认Node对象(也就是真实存在的DOM元素节点)。而jQuery的append()之所以能直接用字符串,是因为它内部偷偷帮你把字符串转换成了DOM节点——原生JS可没这么贴心,得咱们自己动手处理这一步。

下面给你两种靠谱的解决方案,按需选就行:

方案1:直接使用innerHTML(最简单高效)

如果你的内容是可信的(比如像这里一样是接口返回的可控数据),直接用innerHTML拼接字符串是最快的办法。顺便提个小优化:把DOM元素的获取移到循环外面,避免重复查询DOM浪费性能,而且最好把所有内容先拼接成一个字符串再一次性插入,比循环里多次插入性能更好:

fetch(url)
 .then(function(res){ return res.json() })
 .then(function(data){
   const grid = document.getElementById('grid'); // 只查询一次DOM,移到循环外
   let html = '';
   for(let i = 0; i < data.length; i++){
     // 用解构赋值简化变量声明
     const { name, price, percent_change_24h: dayChange, percent_change_7d: weekChange } = data[i];
     html += `
       <div class="coin-info">
         <div class="coin">
           <p>${name}</p>
         </div>
         <div class="price">
           <p>${price}</p>
         </div>
         <div class="changes">
           <p>24h change:</p> ${dayChange}
           <p>7 day change:</p> ${weekChange}
         </div>
       </div>
     `;
   }
   grid.innerHTML += html; // 一次性插入所有生成的内容
 })

方案2:把字符串转换成DOM节点再追加(更安全)

如果要处理用户输入这类不可信内容,或者需要后续对生成的DOM元素做操作,建议先把字符串转换成真实的DOM节点:

fetch(url)
 .then(function(res){ return res.json() })
 .then(function(data){
   const grid = document.getElementById('grid');
   for(let i = 0; i < data.length; i++){
     const name = data[i].name;
     const price = data[i].price;
     const dayChange = data[i].percent_change_24h;
     const weekChange = data[i].percent_change_7d;
     const markup = `
       <div class="coin-info">
         <div class="coin">
           <p>${name}</p>
         </div>
         <div class="price">
           <p>${price}</p>
         </div>
         <div class="changes">
           <p>24h change:</p> ${dayChange}
           <p>7 day change:</p> ${weekChange}
         </div>
       </div>
     `;
     // 创建临时容器解析字符串为DOM节点
     const tempContainer = document.createElement('div');
     tempContainer.innerHTML = markup.trim(); // 去除多余空白字符
     const coinElement = tempContainer.firstElementChild; // 取出目标元素
     grid.appendChild(coinElement); // 现在传入的是Node对象,不会报错了
   }
 })

为啥jQuery能直接用字符串?

说白了就是jQuery的append()方法做了兼容处理:当你传入字符串时,它会自动执行类似上面方案2的逻辑,把字符串转换成DOM节点后再追加到目标元素里。既然咱们想用原生JS实现,就得自己补上这一步~

内容的提问来源于stack exchange,提问作者charliework

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:48