热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Element类型【2】

3.设置特性与getAttribute()对应的方法是setAttribute(),这个方法接受两个参数:要设置的特性名和值。如果特性已经存在

3. 设置特性

与getAttribute()对应的方法是setAttribute(),这个方法接受两个参数:要设置的特性名和值。如果特性已经存在,setAttribute()会以指定的值替换现有的值;如果特性不存在,setAttribute()则创建该属性并设置相应的值。来看下面的例子:

div.setAttribute("id", "someOtherId");

div.setAttribute("class", "ft");

div.setAttribute("title", "Some other text");

div.setAttribute("lang","fr");

div.setAttribute("dir", "rtl");

ElementAttributesExample01.htm

通过setAttribute()方法既可以操作HTML特性也可以操作自定义特性。通过这个方法设置的特性名会被统一转换为小写形式,即"ID"最终会变成"id"。

因为所有特性都是属性,所以直接给属性赋值可以设置特性的值,如下所示。

div.id = "someOtherId";

div.align = "left";

不过,像下面这样为DOM元素添加一个自定义的属性,该属性不会自动成为元素的特性。

div.mycolor = "red";

alert(div.getAttribute("mycolor")); //null(IE除外)

这个例子添加了一个名为mycolor的属性并将它的值设置为"red"。在大多数浏览器中,这个属性都不会自动变成元素的特性,因此想通过getAttribute()取得同名特性的值,结果会返回null。可是,自定义属性在IE中会被当作元素的特性,反之亦然。

在IE7及以前版本中,setAttribute()存在一些异常行为。通过这个方法设置class和style特性,没有任何效果,而使用这个方法设置事件处理程序特性时也一样。尽管到了IE8才解决这些问题,但我们还是推荐通过属性来设置特性。

要介绍的最后一个方法是removeAttribute(),这个方法用于彻底删除元素的特性。调用这个方法不仅会清除特性的值,而且也会从元素中完全删除特性,如下所示:

div.removeAttribute("class");

这个方法并不常用,但在序列化DOM元素时,可以通过它来确切地指定要包含哪些特性。

IE6及以前版本不支持removeAttribute()。

4. attributes属性

Element类型是使用attributes属性的唯一一个DOM节点类型。attributes属性中包含一个NamedNodeMap,与NodeList类似,也是一个“动态”的集合。元素的每一个特性都由一个Attr节点表示,每个节点都保存在NamedNodeMap对象中。NamedNodeMap对象拥有下列方法。

getNamedItem_(name)_:返回nodeName属性等于name的节点;

removeNamedItem_(name)_:从列表中移除nodeName属性等于name的节点;

setNamedItem_(node)_:向列表中添加节点,以节点的nodeName属性为索引;

item_(pos)_:返回位于数字pos位置处的节点。

attributes属性中包含一系列节点,每个节点的nodeName就是特性的名称,而节点的nodeValue就是特性的值。要取得元素的id特性,可以使用以下代码。

var id = element.attributes.getNamedItem("id").nodeValue;

以下是使用方括号语法通过特性名称访问节点的简写方式。

var id = element.attributes["id"].nodeValue;

也可以使用这种语法来设置特性的值,即先取得特性节点,然后再将其nodeValue设置为新值,如下所示。

element.attributes["id"].nodeValue = "someOtherId";

调用removeNamedItem()方法与在元素上调用removeAttribute()方法的效果相同——直接删除具有给定名称的特性。下面的例子展示了两个方法间唯一的区别,即removeNamedItem()返回表示被删除特性的Attr节点。

var oldAttr = element.attributes.removeNamedItem("id");

最后,setNamedItem()是一个很不常用的方法,通过这个方法可以为元素添加一个新特性,为此需要为它传入一个特性节点,如下所示。

element.attributes.setNamedItem(newAttr);

一般来说,由于前面介绍的attributes的方法不够方便,因此开发人员更多的会使用getAttribute()、removeAttribute()和setAttribute()方法。

不过,如果想要遍历元素的特性,attributes属性倒是可以派上用场。在需要将DOM结构序列化为XML或HTML字符串时,多数都会涉及遍历元素特性。以下代码展示了如何迭代元素的每一个特性,然后将它们构造成name="value" name="value"这样的字符串格式。

function outputAttributes(element){

var pairs = new Array(),

attrName,

attrValue,

i,

len;

for (i=0, len=element.attributes.length; i

attrName = element.attributes[i].nodeName;

attrValue = element.attributes[i].nodeValue;

pairs.push(attrName + "=\"" + attrValue + "\"");

}

return pairs.join(" ");

}

ElementAttributesExample03.htm

这个函数使用了一个数组来保存名值对,最后再以空格为分隔符将它们拼接起来(这是序列化长字符串时的一种常用技巧)。通过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(),

attrName,

attrValue,

i,

len;

for (i=0, len=element.attributes.length; i

attrName = element.attributes[i].nodeName;

attrValue = element.attributes[i].nodeValue;

if (element.attributes[i].specified) {pairs.push(attrName + "=\"" + attrValue + "\"");}

}

return pairs.join(" ");

}

ElementAttributesExample04.htm

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

5. 创建元素

使用document.createElement()方法可以创建新元素。这个方法只接受一个参数,即要创建元素的标签名。这个标签名在HTML文档中不区分大小写,而在XML(包括XHTML)文档中,则是区分大小写的。例如,使用下面的代码可以创建一个

元素。

var div = document.createElement("div");

在使用createElement()方法创建新元素的同时,也为新元素设置了ownerDocuemnt属性。此时,还可以操作元素的特性,为它添加更多子节点,以及执行其他操作。来看下面的例子。

div.id = "myNewDiv";

div.className = "box";

在新元素上设置这些特性只是给它们赋予了相应的信息。由于新元素尚未被添加到文档树中,因此设置这些特性不会影响浏览器的显示。要把新元素添加到文档树,可以使用appendChild()、insertBefore()或replaceChild()方法。下面的代码会把新创建的元素添加到文档的元素中。

document.body.appendChild(div);

CreateElementExample01.htm

一旦将元素添加到文档树中,浏览器就会立即呈现该元素。此后,对这个元素所作的任何修改都会实时反映在浏览器中。

在IE中可以以另一种方式使用createElement(),即为这个方法传入完整的元素标签,也可以包含属性,如下面的例子所示。

var div = document.createElement("

");

这种方式有助于避开在IE7及更早版本中动态创建元素的某些问题。下面是已知的一些这类问题。

不能设置动态创建的元素的name特性。

不能通过表单的reset()方法重设动态创建的元素(第13章将讨论reset()方法)。

动态创建的type特性值为"reset"的元素重设不了表单。

动态创建的一批name相同的单选按钮彼此毫无关系。name值相同的一组单选按钮本来应该用于表示同一选项的不同值,但动态创建的一批这种单选按钮之间却没有这种关系。

上述所有问题都可以通过在createElement()中指定完整的HTML标签来解决,如下面的例子所示。

if (client.browser.ie && client.browser.ie <&#61;7){

//创建一个带name特性的iframe元素

var iframe &#61; document.createElement("");

//创建input元素

var input &#61; document.createElement("");

//创建button元素

var button &#61; document.createElement("");

//创建单选按钮

var radio1 &#61; document.createElement("

"value&#61;\"1\">");

var radio2 &#61; document.createElement("

"value&#61;\"2\">");

}

与使用createElement()的惯常方式一样&#xff0c;这样的用法也会返回一个DOM元素的引用。可以将这个引用添加到文档中&#xff0c;也可以对其加以增强。但是&#xff0c;由于这样的用法要求使用浏览器检测&#xff0c;因此我们建议只在需要避开IE及更早版本中上述某个问题的情况下使用。其他浏览器都不支持这种用法。

6. 元素的子节点

元素可以有任意数目的子节点和后代节点&#xff0c;因为元素可以是其他元素的子节点。元素的childNodes属性中包含了它的所有子节点&#xff0c;这些子节点有可能是元素、文本节点、注释或处理指令。不同浏览器在看待这些节点方面存在显著的不同&#xff0c;以下面的代码为例。

Item 1

Item 2

Item 3

如果是IE来解析这些代码&#xff0c;那么

元素会有3个子节点&#xff0c;分别是3个

元素。但如果是在其他浏览器中&#xff0c;


  • 元素都会有7个元素&#xff0c;包括3个
  • 元素和4个文本节点&#xff08;表示
  • 元素之间的空白符&#xff09;。如果像下面这样将元素间的空白符删除&#xff0c;那么所有浏览器都会返回相同数目的子节点。

Item 1

Item 2

Item 3

对于这段代码&#xff0c;

元素在任何浏览器中都会包含3个子节点。如果需要通过childNodes属性遍历子节点&#xff0c;那么一定不要忘记浏览器间的这一差别。这意味着在执行某项操作以前&#xff0c;通常都要先检查一下nodeTpye属性&#xff0c;如下面的例子所示。

for (var i&#61;0, len&#61;element.childNodes.length; i

if (element.childNodes[i].nodeType &#61;&#61; 1){

//执行某些操作

}

}

这个例子会循环遍历特定元素的每一个子节点&#xff0c;然后只在子节点的nodeType等于1&#xff08;表示是元素节点&#xff09;的情况下&#xff0c;才会执行某些操作。

如果想通过某个特定的标签名取得子节点或后代节点该怎么办呢&#xff1f;实际上&#xff0c;元素也支持getElementsByTagName()方法。在通过元素调用这个方法时&#xff0c;除了搜索起点是当前元素之外&#xff0c;其他方面都跟通过document调用这个方法相同&#xff0c;因此结果只会返回当前元素的后代。例如&#xff0c;要想取得前面

元素中包含的所有

元素&#xff0c;可以使用下列代码。

var ul &#61; document.getElementById("myList");

var items &#61; ul.getElementsByTagName("li");

要注意的是&#xff0c;这里

的后代中只包含直接子元素。不过&#xff0c;如果它包含更多层次的后代元素&#xff0c;那么各个层次中包含的

元素也都会返回。


 想要了解更多Java基础知识&#xff0c;可以点击评论区链接和小编一起学习java吧&#xff0c;此视频教程为初学者而著&#xff0c;零基础入门篇&#xff01;给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java&#xff0c;让学习成为一种享受_哔哩哔哩_bilibili



推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 总结一下C中string的操作,来自〈CPrimer〉第四版。1.string对象的定义和初始化:strings1;空串strings2(s1);将s2初始 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
author-avatar
手机用户2502914287
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有