当前位置: 首页 > news >正文

反向遍历--当你修改一个元素的outerHTML时,该元素会被从 DOM 中移除

var spans = editor.querySelectorAll('span[mytag]'); // 将 NodeList 转换为数组 //var spansArray = Array.from(spans); var id = 0 spans.forEach(span => { span.outerhtml这里无法直接修改吗? }

在 JavaScript 中,outerHTML 是一个可写属性,但你需要注意以下几点:

1. 属性名大小写问题

JavaScript 是大小写敏感的,正确的属性名是 outerHTML(大写的HL),而不是outerhtml。你代码中的拼写错误会导致无法修改元素。

修正:javascript

span.outerHTML = '<div>新内容</div>'; // 注意大小写

2. 直接修改outerHTML的副作用

当你修改一个元素的outerHTML时,该元素会被从 DOM 中移除,并被新的 HTML 内容替换。这会导致以下问题:

  • 循环中断:在forEach循环中修改outerHTML会使原有的NodeList失效,因为原始元素已被替换。后续循环可能无法按预期继续。
  • 引用丢失:修改后,span变量仍然指向被移除的旧元素,而非新创建的元素。

3. 安全修改 DOM 的推荐方法

为了避免循环问题,建议从后向前遍历元素或使用文档片段。以下是几种解决方案:

方法一:从后向前遍历javascript
var spans = editor.querySelectorAll('span[mytag]');
for (let i = spans.length - 1; i >= 0; i--) {const span = spans[i];span.outerHTML = '<div class="new-element">新内容</div>';
}
方法二:转换为数组再处理 javascript
var spans = Array.from(editor.querySelectorAll('span[mytag]'));
spans.forEach(span => {span.outerHTML = '<div class="new-element">新内容</div>';
});
方法三:使用文档片段(更安全)

javascript

var spans = editor.querySelectorAll('span[mytag]');
spans.forEach(span => {const newElement = document.createElement('div');newElement.textContent = '新内容';// 使用 replaceWith 方法更安全span.replaceWith(newElement);
});

4. 示例代码修正

结合你之前的代码,修正后的版本如下:

javascript

var spans = Array.from(editor.querySelectorAll('span[mytag]'));
var id = 0;spans.forEach(span => {// 修正属性名大小写span.outerHTML = `<div id="item-${id}">${span.textContent}</div>`;id++;
});

总结

  • 修正拼写:将outerhtml改为outerHTML
  • 避免循环问题:使用数组转换或从后向前遍历
  • 优先使用现代 API:如replaceWith()方法替代直接修改outerHTML

这些方法可以确保安全地修改 DOM 结构,同时避免因元素替换导致的循环异常。

从后向前遍历修改`outerHTML`的具体示例

如何安全地修改`outerHTML`以避免循环中断?

除了`outerHTML`,还有哪些安全的方法修改DOM?

http://www.dtcms.com/a/268336.html

相关文章:

  • 大模型RLHF中PPO强化学习代码学习笔记(二)
  • 回环检测 Scan Contex
  • DolphinScheduler 3.2.0 后端开发环境搭建指南
  • XML 笔记
  • 极简的神经网络反向传播例子
  • 用户中心Vue3项目开发2.0
  • Docker 容器编排原理与使用详解
  • 125.【C语言】数据结构之归并排序递归解法
  • FileZilla二次开发实战指南:C++架构解析与界面功能扩展
  • 操作系统王道考研习题
  • 76、覆盖最小子串
  • 【STM32】通用定时器PWM
  • 漫漫数学之旅046
  • ThreadLocal的挑战与未来:在响应式编程与虚拟线程中的演变
  • ARMv8 创建3级页表示例
  • 【嵌入式电机控制#11】PID控制入门:对比例算法应用的深度理解
  • Python数据容器-str
  • ch03 部分题目思路
  • 数据驱动实时市场动态监测:让商业决策跑赢时间
  • 端到端矢量化地图构建与规划
  • Solidity——什么是selfdestruct
  • Java线程池知识点
  • RAG技术新格局:知识图谱赋能智能检索与生成
  • 【机器学习笔记Ⅰ】2 线性回归模型
  • 图灵完备之路(数电学习三分钟)----逻辑与计算架构
  • 在phpstudy环境下配置搭建XDEBUG配合PHPSTORM的调试环境
  • ESMFold 安装教程
  • 手动使用 Docker 启动 MinIO 分布式集群(推荐生产环境)
  • list和list中的注意事项
  • 三位一体:Ovis-U1如何以30亿参数重构多模态AI格局?