javascriptDOM编程艺术_学习笔记_知识点 动态创建标记

传统技术:document.write 和 innerHTML

深入剖析DOM方法:createElement、createTextNode、appendChild 和 insertBefore

7.1.1 document.write

document对象的write()方法可以方便快捷地把字符串插入到文档里。

document.write的最大缺点是它违背了“行为应该与表现分离”的原则。

1 document.write("<p>This is inserted.</p>");

7.1.2 innerHTML属性

innerHTML 属性可以用来读、写某给定元素里的HTML内容。

1 window.onload = function(){
2  var testdiv = document.getElementById("testdiv");
3  alert(testdiv.innerHTML);
4 }

利用这个技术无法区分“插入一段HTML内容”和“替换一段HTML内容”。testdiv元素里有没有HTML内容无关紧要:一旦你使用了innerHTML属性,它的全部内容都将被替换。

1 window.onload = function(){
2  var testdiv = document.getElementById("testdiv");
3  testdiv.innerHTML = "<p>I inserted <em>this</em> content.</p>";
4 }

innerHTML属性要比document.writer()方法更值得推荐。使用innerHTML属性,你就可以把JavaScript代码从标记中分离出来。用不着再在标记的<body>部分插入<script>标签。

7.2 DOM方法

DOM是文档的表示。DOM所包含的信息与文档里的信息一一对应。你只要学会问正确的问题(使用正确的方法),就可以获取DOM节点树上任何一个节点的细节。

DOM是一条双车道。不仅可以获取文档的内容。还可以更新文档的内容。如果你改编了DOM节点树,文档在浏览器里呈现效果就会发生变化。你已经见识过setAttribute方法的神奇之处了。用这个方法可以改变DOM节点树上的某个属性节点,相关文档在浏览器里的呈现就会发生相应的变化。不过,setAttribute方法并未改变文档的物理内容,如果用文本编辑器而不是浏览器去打开这个文档,我们将看不到任何变化。只有在用浏览器打开那份文档时才能看到文档呈现效果的变化。这是因为浏览器实际显示的是那颗DOM节点树。在浏览器看来,DOM节点树才是文档。

一旦明白了这个道理,以动态方式实现创建标记就不那么难以理解了。你并不是在创建标记,而是在改变DOM节点树。做到这一点的关键是一定要从DOM的角度思考问题。

在DOM看来,一个文档就是一颗节点树。如果你想在节点树上添加内容,就必须插入新的节点。如果你想添加一些标记到文档,就必须插入元素节点。

7.2.1 createElement 方法

创建一个新的元素,要用DOM方法createElement来完成。

1 document.createElement(nodename);

下面这条语句将创建一个p元素:

1 document.createElement("p");

这个方法本身并不能影响页面表现,还需要把这个新创建出来的元素插入到文档中去。为此,你需要有个东西来引用这个新创建出来的节点。

1 var para = document.creatElement("p");

变量para现在包含了一个指向刚创建的那个p元素的引用。现在,虽然这个新创建出来的p元素已经存在了,但它还不是任何一颗DOM节点树的组成部分,它只是游荡在JavaScript世界里的一个孤儿。它这种情况称为文档碎片(document fragment),还无法显示在浏览器的窗口画面里。不过,它已经像任何其他的节点那样有了自己的DOM属性。

7.2.2 appendChild 方法

把新创建的节点插入某个文档的节点树的最简单的方法是,让它称为这个文档某个现有节点的子节点。

1 parent.appendChild(child)
2 var para = document.createElement("p");
3 var testdiv = document.getElementById("testdiv");
4 testdiv.appendChild(para);

7.2.3 createTextNode 方法

创建文本节点,可以使用createTextNode方法来实现它,createElement方法创建元素节点。

1 document.createTextNode(text)
2 document.createTextNode("Hello world");
3 var txt = document.createTextNode("Hello world");

变量txt现在包含指向新创建的那些文本节点的引用。可以用appendChild方法把这个文本节点插入为某个现有元素的子节点。我将把这个文本节点插入到我在上一小节创建的p元素。

1 window.onload = function(){
2     var para = document.createElement("p");
3     var testdiv = document.getElementById("testdiv");
4     testdiv.appendChild(para);
5     var txt = document.createTextNode("Hello world");
6     para.appendChild(txt);
7 }

这个例子是按照以下顺序来创建和插入节点的:

(1)创建一个p元素节点。

(2)把这个p元素节点追加到test.html文档中的一个元素节点上。

(3)创建一个文本节点。

(4)把这个文本节点追加到刚才创建的那个p元素节点上。

appendChild方法还可以用来连接那些尚未成为文档树一部分的节点。也就是说,以下步骤顺序同样可以达到目的。

(1)创建一个p元素节点。

(2)创建一个文本节点。

(3)把这个文本节点追加到第1步创建的p元素节点上。

(4)把这个p元素节点追加到test.html文档中的一个元素节点上。

下面是按照新步骤编写出来的函数:

1 window.onload = function(){
2     var para = document.createElement("p");
3     var txt = document.createTextNode("Hello world");
4     para.appendChild(txt);
5     var testdiv = document.getElementById("testdiv");
6     testdiv.appendChild(para);
7 }

7.2.4一个更复杂的组合

<p>This is <em>my</em> content.</p>

这些HTML内容对应着一个p元素节点,它本身又包含着以下子节点。

一个文本节点,其内容是“This is”

一个元素节点“em”,这个元素节点本身还包含着一个文本节点,其内容是“my”

一个文本节点,其内容是“content.”

把需要创建哪些节点的问题弄清楚后,需要做的步骤。

  1. 创建一个p元素节点并把它赋给变量para。
  2. 创建一个文本节点并把它赋给变量txt1。
  3. 把txt1追加到para上。
  4. 创建一个em元素节点并把它赋给变量emphasis。
  5. 创建一个文本节点并把它赋值给变量txt2。
  6. 把txt2追加到emphasis上。
  7. 把emphasis追加到para上。
  8. 创建一个文本节点并把它赋值给变量txt3。
  9. 把txt3追加到para上。
  10. 把para追加到test.html文档中的testdiv元素上。
 1 window.onload = function(){
 2     var para = document.createElement("p");
 3     var txt1 = document.createTextNode("This is ");
 4     para.appendChild(txt1);
 5     var emphasis = document.createElement("em");
 6     var txt2 = document.createTextNode("my");
 7     emphasis.appendChild(txt2);
 8     para.appendChild(emphasis);
 9     var txt3 = document.createTextNode(" content.");
10     para.appendChild(txt3);
11     var testdiv = document.getElementById("testdiv");
12     testdiv.appendChild(para);
13 }

另一种思路:可以先把所有节点都创建出来,然后再把它们连接在一起。

  1. 创建一个p元素节点并把它赋值给变量para。
  2. 创建一个文本节点并把它赋值给变量txt1。
  3. 创建一个em元素节点并把它赋值给变量emphasis。
  4. 创建一个文本节点并把它赋值给变量txt2。
  5. 创建一个文本节点并把它赋值给变量txt3。
  6. 把txt1追加到para上。
  7. 把txt2追加到emphasis上。
  8. 把emphasis追加到para上。
  9. 把txt3追加到para上。
  10. 把para追加到test.html文档中的testdiv元素上。
 1 window.onload = function (){
 2     var para = document.createElement("p");
 3     var txt1 = document.createTextNode("This is ");
 4     var emphasis = document.createElement("em");
 5     var txt2 = document.createTextNode("my");
 6     var txt3 = document.createTextNode(" content. ");
 7     para.appendChild(txt1);
 8     emphasis.appendChild(txt2);
 9     para.appendChild(emphasis);
10     para.appendChild(txt3);
11     var testdiv = document.getElementById("testdiv");
12     testdiv.appendChild(para);
13 }
时间: 2024-10-26 00:20:46

javascriptDOM编程艺术_学习笔记_知识点 动态创建标记的相关文章

《javascript DOM 编程艺术》学习笔记(一)

书籍已经看完了前六章的内容,有了一定的编程基础后觉得本书内容相对来说过于简单,应该是完全针对于初学者的(或者如作者所说是写个Web设计师的),作者在表述一个问题,一句代码都解释得非常啰嗦与重复,不过从书中学习到更多的,也是作者想让读者体会的是让大家理解DOM脚本编程技术背后的思路和原则,作者特别以早期Javascript的滥用来强调Web的规范与标准,这一点是非常值得学习的,也是一个程序员的基本素养. 截止到第六章,将所学到的知识点归纳如下: 1.基本语法:与php一样是弱类型语言,虽然功能强大

javascriptDOM编程艺术_学习笔记_知识点 DOM

第三章   getElementById    返回一个与那个有着给定id属性值的元素节点对应的对象. document.getElementById(id) 下面一个例子: 1 document.getElementById("purchases") getElementsByTagName  方法返回一个对象数组,每个对象分别对应着文档里有着给定标签的一个元素. element.getElementsByTagName(tag) 下面一个例子: 1 document.getElem

韩顺平_PHP程序员玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/ 课程说明:算法是程序的灵魂,为什么有些网站能够在高并发,和海量吞吐情况下依然坚如磐石,大家可能会说: 网站使用了服务器集群技术.数据库读写分离和缓存技术(比如memcahced和redis等),那如果我再深入的问一句,这些优化技术又是怎样被那些天才的技术高手设计出来的呢? 我在上大学的时候就在想,究竟是什么让不同的人写出的代码从功能看是一样的,但从运行效率上却有天壤之别, 就拿以前在软件公司工作的实际经历来说吧, 我是

.Net基础篇_学习笔记_第四天_关系运算符和逻辑运算符

1.关系运算符 包含:>   <   <=  >=   ==  != 以及bool类型中的true和false. 2.逻辑运算符 与 && 或 || 非 ! 注意: 逻辑运算符的两边放的一般都是关系表达式或者bool类型的值 3.复合运算符 +=  -= *= /= 另外:扩充延伸....... 判断是否为闰年? using System; using System.Collections.Generic; using System.Linq; using Syst

Net基础篇_学习笔记_第九天_数组_三个练习

练习一: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace _数组练习01 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string str = null; 14 string[

.Net基础篇_学习笔记_第七天_随机数的产生

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 第六天_流程语句 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Random r = new Random(); //1.创建一个

Net基础篇_学习笔记_第九天_数组_冒泡排序(面试常见题目)

冒泡排序: 将一个数组中的元素按照从大到小或从小到大的顺序进行排列. for循环的嵌套---专项课题 int[] nums={9,8,7,6,5,4,3,2,1,0}; 0 1 2 3 4 5 6 7 8 9第一趟比较:8 7 6 5 4 3 2 1 0 9 交换了9次 i=0 j=nums.Length-1-i第二趟比较:7 6 5 4 3 2 1 0 8 9 交换了8次 i=1 j=nums.Length-1-i第三趟比较:6 5 4 3 2 1 0 7 8 9 交换了7次 i=2 j=nu

韩顺平_PHP程序员玩转算法公开课(第一季)02_单链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/链表——最灵活的数据结构链表用来解决复杂的问题和算法是很方便的. 内容介绍1.什么是链表2.单向链表3.双向链表4.环形链表5.使用环形链表解决约瑟夫问题 链表——什么是链表链表是有序的列表,但是它在内存中是分散存储的. 链表无处不在,比如在操作系统中,文件和文件之间,文件块和文件块之间,是靠链表链接起来的.使用链表可以解决类似约瑟夫问题,排序,索引,二叉树,广义表... 链表——单链表的快速入门使用head头的单向链表

Net基础篇_学习笔记_第十一天_面向对象(练习)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace juhnko 8 { 9 class Ticket 10 { 11 private double _distance; 12 public double Distance 13 { 14 get { return _di