<div id="myDiv"></div>可以像下面这样取得这个元素及其标签名:
var div = document.getElementById("myDiv"); alert(div.tagName); //"DIV" alert(div.tagName == div.nodeName); //true这里的元素标签名是div,它拥有一个值为"myDiv"的ID。可是,div.tagName 实际上输出的是
执行,最好是在比较之前将标签名转换为相同的大小写形式,如下面的例子所示:
if (element.tagName == "div"){ //不能这样比较,很容易出错! //在此执行某些操作 } if (element.tagName.toLowerCase() == "div"){ //这样最好(适用于任何文档) //在此执行某些操作 }这个例子展示了围绕tagName 属性的两次比较操作。第一次比较非常容易出错,因为其代码在
<div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr"></div>元素中指定的所有信息,都可以通过下列JavaScript 代码取得:
var div = document.getElementById("myDiv"); alert(div.id); //"myDiv"" alert(div.className); //"bd" alert(div.title); //"Body text" alert(div.lang); //"en" alert(div.dir); //"ltr"当然,像下面这样通过为每个属性赋予新的值,也可以修改对应的每个特性:
div.id = "someOtherId"; div.className = "ft"; div.title = "Some other text"; div.lang = "fr"; div.dir ="rtl";
表中的每一种类型都有与之相关的特性和方法。本书将会讨论其中很多类型。
2.
取得特性
每个元素都有一或多个特性,这些特性的用途是给出相应元素或其内容的附加信息。操作特性的
DOM 方法主要有三个,分别是getAttribute()、setAttribute()和removeAttribute()。这三
个方法可以针对任何特性使用,包括那些以HTMLElement 类型属性的形式定义的特性。来看下面的例子:
var div = document.getElementById("myDiv"); alert(div.getAttribute("id")); //"myDiv" alert(div.getAttribute("class")); //"bd" alert(div.getAttribute("title")); //"Body text" alert(div.getAttribute("lang")); //"en" alert(div.getAttribute("dir")); //"ltr"注意,传递给getAttribute()的特性名与实际的特性名相同。因此要想得到class 特性值,应
<div id="myDiv" my_special_attribute="hello!"></div>这个元素包含一个名为my_special_attribute 的自定义特性,它的值是"hello!"。可以像取
var value = div.getAttribute("my_special_attribute");过,特性的名称是不区分大小写的,即"ID"和"id"代表的都是同一个特性。另外也要注意,根
任何元素的所有特性,也都可以通过DOM 元素本身的属性来访问。当然,HTMLElement 也会有5
个属性与相应的特性一一对应。不过,只有公认的(非自定义的)特性才会以属性的形式添加到DOM
对象中。以下面的元素为例:
<div id="myDiv" align="left" my_special_attribute="hello!"></div>因为id 和align 在HTML 中是<div>的公认特性,因此该元素的DOM 对象中也将存在对应的属
alert(div.id); //"myDiv" alert(div.my_special_attribute); //undefined(IE 除外) alert(div.align); //"left"有两类特殊的特性,它们虽然有对应的属性名,但属性的值与通过getAttribute()返回的值并不
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");通过setAttribute()方法既可以操作HTML 特性也可以操作自定义特性。通过这个方法设置的
div.id = "someOtherId"; div.align = "left";不过,像下面这样为DOM 元素添加一个自定义的属性,该属性不会自动成为元素的特性。
div.mycolor = "red"; alert(div.getAttribute("mycolor")); //null(IE 除外)
在IE7 及以前版本中,setAttribute()存在一些异常行为。通过这个方法设置
class 和style 特性,没有任何效果,而使用这个方法设置事件处理程序特性时也
一样。尽管到了IE8 才解决这些问题,但我们还是推荐通过属性来设置特性。
要介绍的最后一个方法是removeAttribute(),这个方法用于彻底删除元素的特性。调用这个方
法不仅会清除特性的值,而且也会从元素中完全删除特性,如下所示:
div.removeAttribute("class");这个方法并不常用,但在序列化DOM 元素时,可以通过它来确切地指定要包含哪些特性。
var id = element.attributes.getNamedItem("id").nodeValue;以下是使用方括号语法通过特性名称访问节点的简写方式。
var id = element.attributes["id"].nodeValue;也可以使用这种语法来设置特性的值,即先取得特性节点,然后再将其nodeValue 设置为新值,
element.attributes["id"].nodeValue = "someOtherId";调用removeNamedItem()方法与在元素上调用removeAttribute()方法的效果相同——直接删
var oldAttr = element.attributes.removeNamedItem("id");最后,setNamedItem()是一个很不常用的方法,通过这个方法可以为元素添加一个新特性,为此
element.attributes.setNamedItem(newAttr);一般来说,由于前面介绍的attributes 的方法不够方便,因此开发人员更多的会使用
function outputAttributes(element){ var pairs = new Array(), attrName, attrValue, i, len; for (i=0, len=element.attributes.length; i < len; i++){ attrName = element.attributes[i].nodeName; attrValue = element.attributes[i].nodeValue; pairs.push(attrName + "=\"" + attrValue + "\""); } return pairs.join(" "); }这个函数使用了一个数组来保存名值对,最后再以空格为分隔符将它们拼接起来(这是序列化长字
function outputAttributes(element){ var pairs = new Array(), attrName, attrValue, i, len; for (i=0, len=element.attributes.length; i < len; i++){ attrName = element.attributes[i].nodeName; attrValue = element.attributes[i].nodeValue; if (element.attributes[i].specified) { pairs.push(attrName + "=\"" + attrValue + "\""); } } return pairs.join(" "); }
var div = document.createElement("div");
div.id = "myNewDiv"; div.className = "box";在新元素上设置这些特性只是给它们赋予了相应的信息。由于新元素尚未被添加到文档树中,因此
document.body.appendChild(div);一旦将元素添加到文档树中,浏览器就会立即呈现该元素。此后,对这个元素所作的任何修改都会
var div = document.createElement("<div id=\"myNewDiv\" class=\"box\"></div >");这种方式有助于避开在IE7 及更早版本中动态创建元素的某些问题。下面是已知的一些这类问题。
动态创建的type 特性值为"reset"的<buttou>元素重设不了表单。
动态创建的一批name 相同的单选按钮彼此毫无关系。name 值相同的一组单选按钮本来应该用
于表示同一选项的不同值,但动态创建的一批这种单选按钮之间却没有这种关系。
上述所有问题都可以通过在createElement()中指定完整的HTML 标签来解决,如下面的例子所示。
if (client.browser.ie && client.browser.ie <=7){ //创建一个带name 特性的iframe 元素 var iframe = document.createElement("<iframe name=\"myframe\"></iframe>"); //创建input 元素 var input = document.createElement("<input type=\"checkbox\">"); //创建button 元素 var button = document.createElement("<button type=\"reset\"></button>"); //创建单选按钮 var radio1 = document.createElement("<input type=\"radio\" name=\"choice\" "+ "value=\"1\">"); var radio2 = document.createElement("<input type=\"radio\" name=\"choice\" "+ "value=\"2\">"); }与使用createElement()的惯常方式一样,这样的用法也会返回一个DOM 元素的引用。可以将
<ul id="myList"> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul>如果是IE 来解析这些代码,那么<ul>元素会有3 个子节点,分别是3 个<li>元素。但如果是在其
<ul id="myList"><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>对于这段代码,<ul>元素在任何浏览器中都会包含3 个子节点。如果需要通过childNodes 属性
for (var i=0, len=element.childNodes.length; i < len; i++){ if (element.childNodes[i].nodeType == 1){ //执行某些操作 } }这个例子会循环遍历特定元素的每一个子节点,然后只在子节点的nodeType 等于1(表示是元素
var ul = document.getElementById("myList"); var items = ul.getElementsByTagName("li");