文章写到第 25 篇,从这样的过程也稳固了自己不少观念,今天依然搅进脑汁将查找的资料尽量用自己的话写出来,也为今天的自己加油吧。
document.createElement()
/ 可依指定的标签名称 ( tagName ) 建立一个新的 HTML 元素。
var newDiv = document.createElement('div');
自己测试的时候会发现,这个时候虽然有写入 createElement()
,但是在浏览器上还看不到他,因此要能看见他的运作,我们还需要透过 appendChild()
、insertBefore()
或 replaceChild()
,才能将新元素加入指定位置,并在浏览器上呈现,不过这里我们可以了解到在范例上他是这麽写的:
<ul id="textList">
<li>text 1</li>
<li>text 2</li>
<li>text 3</li>
</ul>
<script>
var textList = document.getElementById('textList');
var newTextList = document.createElement('li');
</script>
底下这个范例是创建一个按钮,在实例上我们也可以这麽写,
var btn = document.createElement("BUTTON");
var t = document.createTextNode("CLICK ME");
btn.appendChild(t);
我们也可以针对createElement()
新创的元素指定一个属性:
textList.id = "seeTheNewList";
textList.className = "isText";
document.createTextNode()
/ 文字也属於一个文字节点,document.createTextNode()
方法为创建一个新的文字节点,使用方法直接在 document.createTextNode()
加入文字即可。
var text = document.createTextNode(data);
我们使用上面的范例接着看,经过测试会发现 document.createTextNode()
新增的文字仍然没有出现,因此在被加入某个节点之前,他不会在浏览器上呈现:
<ul id="textList">
<li>text 1</li>
<li>text 2</li>
<li>text 3</li>
</ul>
<script>
var textList = document.getElementById('textList');
var newTextList = document.createElement('li');
var textNode = document.createTextNode("Hi,I'm here");
</script>
再举一个 document.createTextNode()
的例子:
var h = document.createElement("H1")
var t = document.createTextNode("Hello");
h.appendChild(t);
上面这个范例是一个修改标题的动作,在修改标题之前我们需要有一个 h1
,所以 document.createElement()
创建了一个 h1
,再使用 document.createTextNode()
方法更改了标题。
document.createDocumentFragment()
/ 这是一个可以大幅增进 web page 效能物件,使用以下大神范例进行实测,假如我们要在 body
里插入数个 element
:
// 这是原本的写法
for( var i=0; i<100; i++ ) {
var item = document.createElement('div');
$(item).text('Element-'+i);
$(item).css({
background: 'gold',
padding: 5,
margin: 5,
float: 'left'
});
$('body').append(item);
}
使用 document.createDocumentFragment()
的写法经过实测,速度确实快了很多,这是因为 DocumentFragment
是一个页面上「不存在」的 element
物件,所以不论我们对他做什麽样的操作,都不会影响使用者外观。
// 这是使用 document.createDocumentFragment() 的写法
var fragment = document.createDocumentFragment();
for( var i=0; i<100; i++ ) {
var item = document.createElement('div');
$(item).text('Element-'+i);
$(item).css({
background: 'gold',
padding: 5,
margin: 5,
float: 'left'
});
fragment.appendChild(item);
}
$('body').append(fragment);
第一段写法会要浏览器做100次更新页面的动作,而第二段只会让浏览器更新一次页面,因此速度会快很多。
document.write()
/ write()
方法可以向文档写入 HTML、表达式或 JavaScript 代码,当解析到 document.write()
的时候就会停下来并将内容输出。
document.write("<h1>Hi,I'm here</h1>");
另外,也可以新增一个 script 标签:
document.write("<script type=\"text\javascript\" src=\"file.js\">" + "<\/script>");
NODE.appendChild()
/ 这个方法可以向节点的子节点列表的末尾,添加新的子节点。这里一样使用上面的范例:
<ul id="textList">
<li>text 1</li>
<li>text 2</li>
<li>text 3</li>
</ul>
<script>
// 取得容器
var textList = document.getElementById('textList');
// 建立新的 li 元素
var newTextList = document.createElement('li');
// 建立 textNode 文字节点
var textNode = document.createTextNode("Hi,I'm here");
// 透过 appendChild 将 textNode 加入至 newTextList
newTextList.appendChild(textNode);
// 透过 appendChild 将 newTextList 加入至 textList
textList.appendChild(newTextList);
</script>
这个范例最後会在浏览器呈现这个状态:
.text 1
.text 2
.text 3
.Hi,I'm here
另外,我们可以回顾一下上面使用 document.createElement()
以及 document.createTextNode()
方法的时候,浏览器都没有呈现画面,因此这里可以验证,我们必须将元素加入正确的节点位置他才会在浏览器上显示。
NODE.insertBefore()
/ 在已有 ( 指定 ) 的子节点前插入一个新的子节点。
document.getElementById("myList").appendChild(newListItem);
举例来说 NODE.insertBefore()
添加前,这是一个一般的 list:
.text 1
.text A
.text 3
假如我们希望指定 text A 前面添加一段文字,则添加了以後:
.text 1
.我们在这里添加了一段文字
.text A
.text 3
一样拿上面的范例来实测:
<ul id="textList">
<li>text 1</li>
<li>text 2</li>
<li>text 3</li>
</ul>
<script>
// 取得容器
var textList = document.getElementById('textList');
// 取得 <li>text 2</li> 的元素
var newText2 = document.querySelectorAll('li')[1];
// 建立新的 li 元素
var newTextList = document.createElement('li');
// 建立 textNode 文字节点
var textNode = document.createTextNode("Hi,I'm here");
newTextList.appendChild(textNode);
// 将新节点 newTextList 插入 newText2 前方
textList.insertBefore(newTextList, newText2);
</script>
上面的范例最後呈现这样:
.text 1
.Hi,I'm here
.text 2
.text 3
NODE.replaceChild()
/ replaceChild()
方法可以将某个指定的子节点 ( newnode ) 替换为另一个 ( oldnode );节点可以是新创建的,也可以是已存在的。
document.getElementById("myList").replaceChild(newnode,oldnode);
再次使用楼上的范例,在这里我发现一篇文章只要能有一个范例,就能不断重复使用,真的好方便^_^
<ul id="textList">
<li>text 1</li>
<li>text 2</li>
<li>text 3</li>
</ul>
<script>
// 取得容器
var textList = document.getElementById('textList');
// 取得 <li>text 2</li> 的元素
var oldNode = document.querySelectorAll('li')[1];
// 建立新的 li 元素
var newTextList = document.createElement('li');
// 建立 textNode 文字节点
var textNode = document.createTextNode("Hi,I'm here");
newTextList.appendChild(textNode);
// 将新节点 newTextList 插入 newText2 前方
textList.replaceChild(newTextList, oldNode);
</script>
画面上则会是这个样子:
.text 1
.Hi,I'm here
.text 3
NODE.removeChild()
/ removeChild()
方法,以字面上来看也可以很明显的知道,他的用途就是删除指定的子节点,如果失败会回传 null
。
elementNode.removeChild(node)
<ul id="textList">
<li>text 1</li>
<li>text 2</li>
<li>text 3</li>
</ul>
<script>
// 取得容器
var textList = document.getElementById('textList');
// 取得 <li>text 2</li> 的元素
var remove = document.querySelectorAll('li')[1];
// 将 textList 下的 remove 节点移除
textList.removeChild(remove);
</script>
画面:
.text 1
.text 3
参考资料:
重新认识 JavaScript: Day 13 DOM Node 的建立、删除与修改
runoob
>>: 【Day 20】 实作 - 於 AWS Quicksight 建立 Sankey diagram 以及设定 Action
前言 前一天大致上了解一下,TypeScript 有支援哪些型别,从今天开始,将一一来每一个型别的定...
本系列文之後也会置於个人网站 光要完成这个范例就花了几乎整整一天 做完後决定...来拆篇 这第二部...
缘由: 每年到了这时期,iOS开发者一定会遇到要升级的问题,想要使用更新的功能、更新OS版本的模拟器...
当我们在 Mac 上打开和使用应用程序(如Google Chrome 浏览器等)或其他文件时,系统会...
前言 有一说一,表情辨识到底还是个分类任务。 如果我说有一种演算法可以在不需要标签的情况下自动帮我们...