JS中迭代元素特性

  在需要将DOM结构序列化为XML或者HTML字符串时,多数都会涉及遍历元素的特性,这个时候attributes属性就可以派上用场。

  以下代码展示了如何迭代元素的每一个特性,然后将他们构造成 name = "value"  name = "value" 这样的字符串格式。

function outputAttributes(element)
{
var pairs = new Array();
for(var i=0, len=element.attributes.length; i < len; i++)
{
var attrName = element.attributes[i].nodeName;
var attrValue = element.attributes[i].nodeValue;
pairs.push(attrName + "=\"" + attrValue + "\"");
}
return pairs.join(" ");
}

  通过attributes.length属性,for循环会遍历每个特性,将特性的名称和值输出为字符串。这个函数使用了一个数组保存名值对,最后再以空格为分隔符将它们拼接起来(这是序列化长字符串一种常用的技巧)。

  关于上面代码运行结果,有两点声明:

  • 针对attributes对象中的特性,不同浏览器返回的顺序不同,这些特性在XML中或HTML代码中出现的先后顺序,不一定与它们出现在attributes对象中的顺序一致。
  • IE7及更早的版本中会返回HTML元素中所有可能的特性,包括没有指定的特性,也可以说返回100多个特性的情况也是可以有的。

  针对IE7及更早的版本中存在的问题,可以对上面函数加以改进,让它只返回特定的特性。每个特性节点都有一个specified的属性,这个属性如果为true,意味着要么在HTML中指定了相应的特性,要么通过setAttribute() 方法设置了该特性,在IE中,所有未设置的特性的该属性都为false,而在其他浏览器中根本不会为这类特性生成对应的特性节点,因此,在这些浏览器中,任何特性节点的specified的值始终为true。

  改进后的代码如下:

function outputAttributes(element)
{
var pairs = new Array();
for(var i=0, len=element.attributes.length; i < len; i++)
{
var attrName = element.attributes[i].nodeName;
var attrValue = element.attributes[i].nodeValue;
if (element.attributes[i].specified)
{
pairs.push(attrName + "=\"" + attrValue + "\"");
} }
return pairs.join(" ");
}

  这样改进后的函数可以确保即使在IE7及更早的版本中,也会返回指定的特性。

DOM中的DocumentFragment类型

  先来看一个HTML例子:

<ul id="mylist"></ul>

  当我们想为这个<ul>元素添加3个列表项,如果逐个地添加列表项,将会导致浏览器反复渲染(呈现)新的信息,为了避免这个问题,可以使用一个文档片段(document fragment)来保存创建的列表项,然后再一次性的将三个列表项添加到文档中。

  DOM规定文档片段是一种“轻量级”的文档,可以包含和控制节点,但不会像完整文档那样占用额外的资源,也就是不能把文档片段直接添加到文档中,不过可以把它作为一个“仓库”使用,在里面保存将来可能添加到文档中的节点,比如上例中的三个列表项。

  文档片段继承了Node的所有方法,通常用于执行那些针对文档的DOM操作。如果将文档中的节点添加到文档片段中,就会从文档树中移除该节点,也不会从浏览器中再看到该节点。添加到文档片段中的新节点也不再属于文档树。可以通过 appendChild() 或者 insetBefore() 将文档片段中内容添加到文档中。在将文档片段作为参数传递给这两个方法时,实际上只会将文档片段内部的节点添加到文档树中的相应位置,而文档片段本身是不可能成为文档树的一部分。

  要想创建一个 文档片段,可以使用document.createDocumentFragment()方法。如下:

var fragment = document.createDocumentFragment();

 

  利用文档片段来解决上述的例子:

var fragment = document.createDocumentFragment();  //创建文档片段
var ul = document.getElementById("myLisst");
var li = null; for(var i=0; i < 3; i++){
li = document.createElement("li"); //创建文本节点
li.appendChild(document.createTextNode("Item "+(i+1))); //把文本节点添加到<li>元素
fragment.appendChild(li) //使用appendChild()将li添加到文本片段中
}
ul.appendChild(fragment); //最后一次性把文档片段中的所有子节点转移到<ul>中

以上内容参考自:javascript高级程序设计

js中迭代元素特性与DOM中的DocumentFragment类型 笔记的更多相关文章

  1. js判断一个元素是否在数组中

    js判断一个元素是否在数组中 var arr = ['a','s','d','f']; console.info(isInArray(arr,'a'));//循环的方式 function isInAr ...

  2. JQ中的clone()方法与DOM中的cloneNode()方法

    JQ中的clone()方法与DOM中的cloneNode()方法 cloneNode()定义和用法 cloneNode()方法创建节点的拷贝,并返回该副本. 语法: node.cloneNode(de ...

  3. 关于js全局变量数组push数据时dom中无数据的问题

    今天着实悲催,这问题整了好几个小时才解决.废话不多说,上问题. 一开始我定义了许多全局变量放在me下. var me = { dgOrderDetails: null, dgVisitNumbers: ...

  4. Python:将数组中的元素导出到变量中 (unpacking)

    问题 你需要将数组(list)或元组(tuple)中的元素导出到N个变量中. 解决方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要和序列中的结构 ...

  5. 了解数组中的队列方法,DOM中节点的一些操作

    队列的概念 栈是一种后进先出的结构,而队列是一种先进先出的结构.如银行排队,排在前面的人先办业务然后离开,后来的人站在最后.可以用队列的push()方法插入元素到队列的末尾,可以用shift()方法删 ...

  6. React-将元素渲染到 DOM 中

    首先我们在一个 HTML 页面中添加一个 id="root" 的 <div>,在此 div 中的所有内容都将由 React DOM 来管理,所以我们将其称之为 “根” ...

  7. js获取iframe中的元素以及在iframe中获取父级的元素(包括iframe中不存在name和id的情况)

      第一种情况:iframe中不存在name和id的方法:(通过contentWindow获取) var iframe = document.getElementsByTagName('iframe' ...

  8. O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素(转)

    题目要求:定义栈的数据结构,添加min().max()函数(动态获取当前状态栈中的最小元素.最大元素),要求push().pop().min().max()的时间复杂度都是O(1). 思路解析:根据栈 ...

  9. 删除列表中重复元素以及求list中元素个数

    Python 去除列表中重复的元素 来自比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还 ...

随机推荐

  1. 【SHOI2015】脑洞治疗仪(恶心的线段树,区间最大子段和)

    题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位 ...

  2. 路由器基础配置之广播多路访问链路上的ospf

    我们将以上面的拓扑图进行实验,因为是要以不断广播的形式进行ospf,所有中间加了一个集线器,这种ospf和前一种不同,路由器之间会在配置好ospf之后选举出一个老大,DR,一个备份,BDR,而其他路由 ...

  3. 汇编:汇编语言实现冒泡排序(loop指令实现)

    ;=============================== ;循环程序设计 ;loop指令实现 ;冒泡排序 ;for(int i=0;i<N;i++){ ; for(int h=0;j&l ...

  4. 阿里云SSL证书到期(续期)图文教程

    今天公司项目突然报错 后来查询是SSL证书过期了.友情提示: 证书产品仅支持新签发.不支持续费.证书到期前需在阿里云SSL证书控制台重新购买和申请证书. 登录阿里云控制台,点击产品与服务,在搜索框搜索 ...

  5. mysql在cmd里中文乱码解决办法

    右边画红线部分中文已经乱码,左边红线里中文则完美显示出来了. 解决办法   用set  names   utf-8: 效果如图

  6. 消费滚动滴log日志文件(flume监听,kafka消费,zookeeper协同)

    第一步:数据源 手写程序实现自动生成如下格式的日志文件: 15837312345,13737312345,2017-01-09 08:09:10,0360 打包放到服务器,使用如下命令执行,模拟持续不 ...

  7. mysql日志管理#二进制日志详解

    查看MySQL二进制文件中的内容有两种方式 mysqlbinlog SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row ...

  8. Java基础——内部类

    一.什么是内部类 将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类 内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$In ...

  9. Oozie Coordinator job 之定时任务

    使用 Coordinator job 可以执行定时任务和时间触发执行 需要注意的是 Oozie 默认使用的时区与中国时区不是一致的,需要进行一点修改 1.关于时区 a.修改 core-site.xml ...

  10. 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库

    我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...