使用DOM创建节点
createElement函数可以用来创建新元素,它以标记名称为参数,并返回该元素的实际DOM引用,没有默认的属性和样式。同时创建的元素必须使用正确的XML命名空间。例如:
function create( elem ) { return document.createElementNS ? document.createElementNS( 'http://www.w3.org/1999/xhtml', elem ) : document.createElement( elem ); }
例如,使用这个函数创建一个简单的<div>元素,并添加一些属性:
var div = create("div"); div.className = "items"; div.id = "all";
插入元素
第一个函数是 insertBefore,可以在一个子元素前插入一个元素,函数的用法类似于:
parentOfBeforeNode.insertBefore( nodeToInsert, beforeNode);
即:insert第一个元素,before第二个。
第二个函数是 appendChild,用来在父节点中追加子节点,用法:
parentElement.appendChild(nodeToInsert);
在一个元素之前插入元素的函数
function before( parent, before, elem ) { // 检查是否传入 parent 参数 if ( elem == null ) { elem = before; before = parent; parent = before.parentNode; } parent.insertBefore( checkElem( elem ), before ); }
为一个元素追加一个子元素的函数
function append( parent, elem ) { parent.appendChild( checkElem( elem ) ); }
before 和 append 的辅助函数
function checkElem( elem ) { // 如果参数是字符串,则把它转化成文本节点 return elem && elem.constructor == String ? document.createTextNode( elem ) : elem; }
使用 before 和 append 函数
// 创建一个新的 <li> 元素 var li = create("li"); attr( li, "class", "new" ); // 创建文本内容,并添加到 <li> 中 append( li, "Thanks for visiting!" ); // 把 <li> 元素插入到有序列表的顶端 before( first( tag("ol")[0] ), li );
一旦把元素插入到DOM中,就会渲染它。
注入HTML到DOM
直接向文档注入HTML最简便的方法就是innerHTML,假设有个一个空的<ol>元素并需要往里加入<li>,那么代码大致如下:
tag("ol")[0].innerHTML = "<li>Cats.</li><li>Dogs.</li><li>Mice.</li>";
这种方法虽然简单,但也有一些问题:
1. XML DOM 中并不存在 innerHTML 方法
2. 使用客户端 XSLT 创建的 XHTML 文档也不存在 innerHTML 方法
3. innerHTML 完全删除了元素内的任何节点,意味着没有像 DOM 方法一样追加或者插入的简便方法
为了弥补第3个问题,需要重写之前的before和append函数,在重写之前,需要建立一个checkElem函数,它可以处理HTML字符串,DOM元素以及DOM元素数组。
function checkElem(a) { var r = []; // 如果参数不是数组,则转换为数组 if ( a.constructor != Array ) a = [ a ]; for ( var i = 0; i < a.length; i++ ) { // 如果是字符串 if ( a[i].constructor == String ) { // 用一个临时元素来存放HTML var div = document.createElement("div"); // 注入HTML,转换成DOM结构 div.innerHTML = a[i]; // 提取DOM结构到临时的 div 中 for ( var j = 0; j < div.childNodes.length; j++ ) r[r.length] = div.childNodes[j]; } else if ( a[i].length ) { // 如果是数组 // 假定是DOM节点数组 for ( var j = 0; j < a[i].length; j++ ) r[r.length] = a[i][j]; } else { // 否则,假定它是DOM节点 r[r.length] = a[i]; } } return r; } [/code] 重写的 before 和 append 函数 [code lang="js"] function before( parent, before, elem ) { // 检查是否提供 parent 参数 if ( elem == null ) { elem = before; before = parent; parent = before.parentNode; } // 获取元素数组 var elems = checkElem( elem ); // 从后遍历数组 for ( var i = elems.length - 1; i >= 0; i-- ) { parent.insertBefore( elems[i], before ); } } function append( parent, elem ) { // 获取元素数组 var elems = checkElem( elem ); // 把它们都追加到元素中 for ( var i = 0; i <= elems.length; i++ ) { parent.appendChild( elems[i] ); } } [/code] 这时向<ol>元素添加<li>的例子: [code lang="js"] append( tag("ol")[0], "<li>Mouse trap.</li>" ); // 原始的HTML结构: <ol> <li>Cats.</li> <li>Dogs.</li> <li>Mice.</li> </ol> // 运行后的状态: <ol> <li>Cats.</li> <li>Dogs.</li> <li>Mice.</li> <li>Mouse trap.</li> </ol> before( last( tag("ol")[0] ), "<li>Zebra.</li>" ); <ol> <li>Cats.</li> <li>Dogs.</li> <li>Zebra.</li> <li>Mice.</li> </ol>
删除DOM节点
使用 removeChild 函数来删除节点,用法如下:
NodeParent.removeChild( NodeToRemove );
自定义的删除DOM节点的函数
// 删除一个独立的DOM节点 function remove( elem ) { if ( elem ) elem.parentNode.removeChild( elem ); }
从一个元素中删除所有子节点的函数
// 在DOM中,删除元素的所有子节点 function empty( elem ) { while ( elem.firstChild ) remove( elem.firstChild ); }
例如:
remove( last( tag("ol")[0] ) ) 将会把 <ol> <li>Learn Javascript.</li> <li>???</li> <li>Profit!</li> </ol> 转换成: <ol> <li>Learn Javascript.</li> <li>???</li> </ol> 如果执行: empty( last( tag("ol")[0] ) ) 则结果为: <ol></ol>
转载请注明:陈童的博客 » DOM — 修改DOM