1. 作为HTML的元素内容
innerHTML:
读取Element的innerHTML属性作为字符串标记返回那个元素的内容,在元素上设置该属性调用了Web浏览器的解析器,用新字符串内容的解析展现形式替换元素当前内容。通常设置innerHTML效率非常高,甚至在指定 的值需要解析时效率也相当不错,但注意,对innerHTML属性用‘+=’操作符重复追加一小段文本通常效率低下,因为它既要序列化又要解析
outerHTML:
当查询outerHTML时,返回的HTML或XML标记的字符串包含被查询元素的开头和结尾标签,当设置元素的outHTML时,元素本身被新的内容所替换。只有Element节点定义了outHTML属性。Document节点则无。
PS:低版本的FF不支持outerHTML,扩展方法如下:
扩展outerHTML (function(){
//如果outerHTML存在,则直接返回
if(document.createElement('div').outerHTML) return;
//返回this所引用的外部HTML
function outerHTMLGetter(){
var container = document.createElement('div');
container.appendChild(this.cloneNode(true));
return container.innerHTML;
};
//用指定的值设置元素的外部HTML
function outerHTMLSetter(value){
var container = document.createElement('div');
container.innerHTML = value;
//将虚拟元素中的节点全部移动到文档中,直到没有子节点为止
while(container.firstChild){
this.parentNode.insertBefore(container.firstChild, this);
}
//删除所被取代的节点
this.parentNode.removeChild(this)
}
/*使用这两个函数作为所有Element对象的outerHTML属性的getter和setter,如果它存在则使用es5的Object.definedProperty()方法,否则,使用__definedGetter__()和__defineSetter__()
*/
if (Object.defineProperty){
Object.defineProperty(Element.prototype, 'outerHTML',{
get: outerHTMLGetter,
set: outerHTMLSetter,
enumerable: false,
configurable: true
})
}
else{
Element.prototype.__defineGetter__('outerHTML',outerHTMLGetter);
Element.prototype.__defineSetter__('outerHTML',outerHTMLSetter);
}
}())
insertAdjacentHTML(sWhere,position):
将任意的HTML标记字符串插入到指定的元素“相邻”的位置, sWhere的值是“beforeBegin”,“afterBegin”,”beforeEnd”,”afterEnd”,position是被插入的HTML字符串
注:低版本的FF不支持此方法,扩展方法如下:
扩展insertAdjacentHTML/*本模块为不支持insertAdjacentHTML的浏览器扩展方法,还定义一些可移植的HTML插入函数Insert.before() | after() | atStart() | atEnd*/
var Insert(function(){
if(document.createElement('div').insertAdjacentHTML){
return {
before: function (e, h){e.insertAdjacentHTML('beforebegin', h);},
after: function(e, h){e.insertAdjacentHTML('afterend', h);},
atStart: function(e, h){e.insertAdjacentHTML('afterbegin', h);},
atEnd: function(e, h){e.insertAdjacentHTML('beforeEnd', h)}
};
}
//如果没原生的,定义一个工具函数,传入HTML字符串,返回一个DocumentFragment
function fragment (html){
var elt = document.createElement('div');
var frag = document.createDocumentFragment();
elt.innerHTML = html;
while (elt.firstChild){
frag.appendChild(elt.firstChild);
}
return frag;
}
var Insert = {
before: function (elt, html){
elt.parentNode.insertBefore(fragment(html), elt);
},
after: function (elt, html){
elt.parentNode.insertBefore(fragment(html), elt.nextSibling);
},
atStart: function(elt, html){
elt.insertBefore(fragment(html), elt.firstChild);
},
atEnd : function(elt, html){
elt.appendChild(fragment(html));
}
};
Element.prototype.insertAdjacentHTML = function (pos, html){
switch(pos.toLowerCase()){
case 'beforebegin': return Insert.before(this, html);
case 'afterend': return Insert.after(this, html);
case 'afterbegin': return Insert.atStart(this, html);
case 'beforeend': return Insert(this, html);
};
return Insert;
}
}());
2.作为纯文本的元素内容
textContent || innerText
textContent 是标准方法,除了IE8及以下的浏览器都支持,innerText 是IE4引入的,它除了早期的ff外都支持
两者的区别:
innerText是需要对innerHTML的值进行
1)HTML转义(等同于XML转义,对< 、&等转义字符进行处理
2)经过HTML解释和CSS样式解释
3)剔除格式信息 (多个空格合并成一个,换行,制表
经过上述3步后留下的纯文本;innerText不返回<script>元素的内容;同时,它对某些表格元素(table,tbody,tr)是只读属性
textContent只是经过上述的第一步,没有进行2 3步,只将后代的text节点简单的串联在一起
====》来自javascript textContent与innerText的异同分析 ====》
查找元素的后代中节点中的所有的Text节点
返回纯文本function textContent (element,value) {
var content = element.textContent;
if (value === undefined) { //获取
if(content !== undefined ) return content;
else return element.innerText;
}
else{ //设置
if (content !== undefined) element.textContent = value;
else element.innerText = value;
}
}
function textContent1 (e) {
var child, type, s = "";
for(child = e.firstChild; child != null; child = child.nextSibling){
type = child.nodeType;
if (type === 3 || type === 4){
s += child.nodeValue;
}
else if (type ===1 ) {
s += textContent1(child)
}
return s;
}
}
/* nodeValue 属性可以读/写,设置它可以改变Text/CDATASection节点内容所显示的内容;Text/CDATASction都
** 是CharacterData的子类型,CharacterData定义了data属性,它和nodeValue 文本相同,可以应用很多方法
*/
function upcase (n) {
if (n.nodeType == 3 || n.nodeType == 4)
n.data = n.data.toUpperCase()
else {
for ( var i = 0; i < n.childNodes.length; i ++){
upcase (n.childNodes[i];
}
}
=====================================================================
创建节点
createElement() /createTextNode() / createComment() /createDocumentFragment() /createElementNS()
cloneNode(boolean) true 表示深复制,它及其后代元素都会被复制,false 表示只复制它本身,其余元素不会被复制
importNode(element, boolean) 第一个参数是一个文档的节点,第二个参数是一个布尔值,与cloneNode()中的参数一样;返回一个适合本文档插入的节点的副本(IE不支持)
插入节点
appendChild() / insertBefore ()
如果调用appendChild()或insertBefore() 将已存在文档中的一个节点再次插入,那个节点将自动从它当前的位置删除并在新的位置重新插入,没有必要显示删除该节点。
应用:
表单行排序function sortrows (table, n, comparator) { // 如果comparator函数存在,则使用它进行比较
var tbody = table.tBodies[0]; //第一个tbody,可能是隐式创建的
var rows = tbody.getElementsByTagName('tr');
rows = Array.prototype.slice.call(row,0) //生成数组的快照
rows.sort(
function (row1, row2){
var cell1 = row1.getElementsByTagName('td')[n];
var cell2 = row2.getElementsByTagName('td')[n];
var val1 = cell1.textContent || cell1.innerText;
var val2 = cell2.textContent || cell2.innerText;
if (comparator) return comparator( val1, val2);
if (val1 < val2) return -1;
else if (val1 > val2) return 1;
else return 0
});
//在tbody中按它们的顺序把行添加到最后,若tbody中包含除了tr任何其他元素,这些节点自动到顶部
for ( var i = 0; i < rows.length; i ++) tbody.appendChild(rows[i])
}
//查找表格的th元素,让它们可以单击;以便单击列标题,按该列对行排序
function makeSorttable (table) {
var headers = table.getElementsByTagName('th');
for ( var i = 0; i< headers.length; i++){
(function(n){
headers[i].onclick = function(){sortrows(table,n)};
})(i);
}
};