JS往HTML中添加节点的流程总结
HTML元素 通常是由 元素节点 和 文本节点 组成。
- 使用createElement()创建 元素节点
- 使用createTextNode() 创建 文本节点
- 使用appendChild() 将节点添加到另一个节点列表的末尾
例子
创建一个标题 (H1), 你必须创建 “H1” 元素 和 文本节点 :
1 | // 创建元素名称为H1的元素节点h |
HTML DOM Document 对象
- 每个载入浏览器的 HTML 文档都会成为 Document 对象。
- Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
Node.appendChild() 添加/移动 子节点
- 语法:
node1.appendChild(node2)
appendChild()
方法可向节点(node1)的子节点列表的末尾添加新的子节点(node2)。- 注意:
- node2是添加到node1内部的!
- 如果node2已存在于js文件中,则appendChild()会将node2 移动 到node1之中
- 参数node2:(节点对象)必须,你要添加的节点对象。
- 返回值:(节点对象)添加的节点。
- 例子
document.createElement()创建元素节点
- createElement() 方法通过指定名称创建一个元素。
- 语法:
document.createElement(nodename)
- 参数nodename:(String)必须,创建元素的名称。(注意不是自定义的!!)
"BUTTON"
/"button"
:创建按钮元素"H1"
/"h1"
:创建H1标题"div"
等,以此类推。
- 返回值:(元素对象)创建的元素节点。
注意:createElement()要与appendChild()结合起来使用才能使创建的元素显示在页面上。
例子:HTML元素经常包含文本。创建指定文本的按钮你需要在按钮元素后添加文本节点
document.createTextNode() 创建 文本节点
HTML元素 通常是由 元素节点 和 文本节点 组成。
- createTextNode() 可创建文本节点。
- 语法:
document.createTextNode(text)
- 参数text:(String)必须。文本节点的文本。
- 返回值:(文本节点对象)创建的文本节点。
- 例子
Node.removeChild() 删除子节点
- removeChild() 方法删除子节点。
- 语法:
let oldChild = node.removeChild(child);
或element.removeChild(child);
- child:是要移除的那个子节点.
- node:是child的父节点.
- oldChild保存对删除的子节点的引用.
oldChild === child
.
- 返回值:成功该函数返回被删除的节点,如果失败则返回 NULL。
- 被移除的这个子节点仍然存在于内存中,只是没有添加到当前文档的DOM树中,因此,你还可以把这个节点重新添加回文档中,当然,实现要用另外一个变量比如上例中的oldChild来保存这个节点的引用. 如果使用上述语法中的第二种方法, 即没有使用 oldChild 来保存对这个节点的引用,则认为被移除的节点已经是无用的,在短时间内将会被内存管理回收.
- 如果上例中的child节点不是node节点的子节点,则该方法会抛出异常.
- MDN参考
- 例子
使用let实现面试常见小例子
代码解析:
- 先在HTML文档中创建一个按钮节点btn
- 再改变节点文字
- 然后给节点btn设置一个点击事件
- 最后将节点btn添加到body中
原因:
执行事件时,alert()首先需要i,但是当前作用域找不到,它就会到上一级找,上一级通过自调用时有传进来的i,这个i是随着函数的调用而产生,随着函数调用结束而释放的,不是作用在一开始的var i身上的,所以每一个函数都对应不同的数字。
变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。所以每一次循环中btn的innerText所指向的i其实都是同一个,循环到最后时前面的i全部被最后的结果覆盖了。而局部变量的话就是每循环一次产生一个新的i,所以不会被覆盖。
原因:
执行事件时,alert()首先需要i,但是当前作用域找不到,它就会到上一级找,上一级直接就是var i了,所有的代码都作用在它身上,所以他会是11。
可以发现,使用let以后就不需要额外放一个自调用函数把他们框起来了。
变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。