日期:2014-05-16 浏览次数:20468 次
去空格方法,FF把空白的处当作文本节点,nodeValue等于3,IE会忽略。
下面这个方法,如果出入的对象子节点很多的时候,效率不高。
function cleanWhitespace( element ) {
// 如果没有提供参数,遍历整个HTML文档
element = element || document;
// 使用第一个child作为遍历的开始
var cur = element.firstChild;
// 知道不存在节点为止
while ( cur != null )
//如果这个节点是文本节点,只包含空格
if ( cur.nodeType == 3 && ! /\S/.test(cur.nodeValue) ) {
// 删除文本节点
element.removeChild( cur );
// 如果是元素节点
} else if ( cur.nodeType == 1 ) {
// 递归这个节点
cleanWhitespace( cur );
}
cur = cur.nextSibling; // 移到下一个节点
}
}
? 由于上面这个方法,存在效率低下问题,所以下面可以重写获取元素节点 的各个方法。
? 获取elem的上一个元素节点:
function prev( elem ) {
do {
elem = elem.previousSibling;
} while ( elem && elem.nodeType != 1 );
return elem;
}
? 获取elem的下一个元素节点:
function next( elem ) {
do {
elem = elem.nextSibling;
} while ( elem && elem.nodeType != 1 );
return elem;
}
?获取第一个子元素节点:如果不存在获取下一个元素节点
function first( elem ) {
elem = elem.firstChild;
return elem && elem.nodeType != 1 ?
next( elem ) : elem;
}
? 获取最后一个子元素节点:如果不存在获取上一个元素节点
function last( elem ) {
elem = elem.lastChild;
return elem && elem.nodeType != 1 ?
prev( elem ) : elem;
}
?获取父节点:(根据参数num,可以获取父节点的父节点)
function parent( elem, num ) {
num = num || 1;
for ( var i = 0; i < num; i++ )
if ( elem != null ) elem = elem.parentNode;
return elem;
}
?HTMLElement在IE中隐藏不可以用,FF中可以。
如下设置,表示Html中的元素(标签)都可以用next方法:
HTMLElement.prototype.next = function() {
var elem = this;
do {
elem = elem.nextSibling;
} while ( elem && elem.nodeType != 1 );
return elem;
};
? 重写getElementById方法:
function id(name) {
return document.getElementById(name);
}
? 重写getElementByTagName方法:
function tag(elem,name) {
// 如果没有提供elem,就是整个文档
return (elem || document).getElementsByTagName(name);
}
?重写createElement方法:
function create( elem ) {
return document.createElementNS ?
document.createElementNS( 'http://www.w3.org/1999/xhtml', elem ) :
document.createElement( elem );
}
? 重写insertBefore方法:
function before( parent, before, elem ) {
// Check to see if no parent node was provided
if ( elem == null ) {
elem = before;
before = parent;
parent = before.parentNode;
}
parent.insertBefore( checkElem( elem ), before );
}
?
function checkElem( elem ) {
// If only a string was provided, convert it into a Text Node
return elem && elem.constructor == String ?
document.createTextNode( elem ) : elem;
}
?重写append方法:
function append( parent, elem ) {
parent.appendChild( checkElem( elem ) );
}
?重写removeChild方法:
function remove( elem ) {
if ( elem ) elem.parentNode.removeChild( elem );
}
?删除全部子元素:
// Remove all of an Element’s children from the DOM
function empty( elem ) {
while ( elem.firstChild )
remove( elem.firstChild );
}