Skip to content

Element 类型

element 类型节点是 DOM 树的主要节点,提供了对元素标签名、子节点及特性的访问

Node 类型特性(nodeType,nodeName,nodeVlaue,parentNode,子节点)

  1. el.nodeType === 1
  2. el.nodeName === 元素的标签名
  3. el.nodeValue === null
  4. el.parentNode 可能是 Element 或者 Document
  5. el 的子节点类型很多
interface Element: Node {
    readonly attribute DOMString tagName;
    DOMString getAttribute( in DOMString name);
    void setAttribute( in DOMString name, in DOMString value)
    raises(DOMException);
    void removeAttribute( in DOMString name)
    raises(DOMException);
    Attr getAttributeNode( in DOMString name);
    Attr setAttributeNode( in Attr newAttr)
    raises(DOMException);
    Attr removeAttributeNode( in Attr oldAttr)
    raises(DOMException);
    NodeList getElementsByTagName( in DOMString name);
    // Introduced in DOM Level 2:
    DOMString getAttributeNS( in DOMString namespaceURI, in DOMString localName)
    raises(DOMException);
    // Introduced in DOM Level 2:
    void setAttributeNS( in DOMString namespaceURI, in DOMString qualifiedName, in DOMString value)
    raises(DOMException);
    // Introduced in DOM Level 2:
    void removeAttributeNS( in DOMString namespaceURI, in DOMString localName)
    raises(DOMException);
    // Introduced in DOM Level 2:
    Attr getAttributeNodeNS( in DOMString namespaceURI, in DOMString localName)
    raises(DOMException);
    // Introduced in DOM Level 2:
    Attr setAttributeNodeNS( in Attr newAttr)
    raises(DOMException);
    // Introduced in DOM Level 2:
    NodeList getElementsByTagNameNS( in DOMString namespaceURI, in DOMString localName)
    raises(DOMException);
    // Introduced in DOM Level 2:
    boolean hasAttribute( in DOMString name);
    // Introduced in DOM Level 2:
    boolean hasAttributeNS( in DOMString namespaceURI, in DOMString localName)
    raises(DOMException);
    // Introduced in DOM Level 3:
    readonly attribute TypeInfo schemaTypeInfo;
    // Introduced in DOM Level 3:
    void setIdAttribute( in DOMString name, in boolean isId)
    raises(DOMException);
    // Introduced in DOM Level 3:
    void setIdAttributeNS( in DOMString namespaceURI, in DOMString localName, in boolean isId)
    raises(DOMException);
    // Introduced in DOM Level 3:
    void setIdAttributeNode( in Attr idAttr, in boolean isId)
    raises(DOMException);
};

1、属性操作

Element 元素是 Element 基类,其继承于 Node 类型。

继承于 Node 的属性

1.1. el.nodeName === el.tagName

返回元素的类型 一般为大写

js
console.log(div1.nodeName); //'DIV'

1.2. el.nodeType

返回元素 Node 类型 元素类型为 1

js
console.log(div1.nodeType); // 1

1.3. el.nodeValue

返回当前节点的值 元素类型的为 null

js
console.log(div1.nodeValue); // null

元素类型的属性

1.4. el.tagName

返回当前元素的标签名 跟 el.nodeName 一样

js
console.log(div1.tagName); // 'DIV'

注:

  1. 判断元素的类型 不要直接用标签名比较,因为 有些时候不一定返回转换后的大写类型名称。
js
console.log(div1.tagName.toLowerCase() === 'div');

1.5. el.id

返回元素在文档中的唯一标示 id,没有设置 id 为 ''

js
console.log(div1.id); // 'div1'

1.6. el.title

返回元素的 title 属性

js
console.log(div1.title); // 'title'

1.7 el.lang、el.dir

返回元素的 lang、dir 属性

2. 元素的 class 属性

  • el.className
  • el.classList

2.1 el.className

返回元素的 class 属性,其中 className 所有的浏览器都支持,可读写;

html
<div id="div1" class="className pad10"></div>
js
console.log(div1.className); // "className pad10"
//当然我们可以修改class
div1.className = 'className pad20';
//元素的属性修改了,但是我们发现其是全部覆盖修改;这时候我们就需要classList了
console.log(div1.className); // "className pad20"

console.log(div1.classList);

2.2 classList

返回元素类属性的实时 DOMTokenList 集合,是一个只读属性

IE10+, Edge , Chrome , Opera11.5 , Safari5.1 , FF3.6

image

js
console.log(div1.classList);
var classList = div1.classList;
// 添加一个class类
classList.add('addClass');
console.log(classList); // ['className','pad20','addClass']
// 删除指定的class类型
console.log(classList.remove('addClass')); //undefined
console.log(classList); // ['className','pad20']
// 检查是否包含指定的class类
console.log(classList.contains('pad20')); //true

// 删除或者添加类    IE不支持 所以不要使用
console.log(classList.toggle('addClass')); //true
console.log(classList); // ['className','pad20','addClass']
注:
1、其是一个实时的 DOMTokenList 集合,所以我们修改类属性的时候可以实时调用,如同 attributes childNodes。
2、toggle IE 不支持所以 不要使用。
js
var hasClass = function(el, className) {
	if (!el || !className) return false;
	if (className.indexOf(' ') !== -1) throw new Error("className can't contains space!");

	if (el.classList) {
		return el.classList.contains(className);
	} else {
		// 错误的  这样可能 classes  查找class时也包含
		// return el.className.indexOf(className) !== -1;
		return (' ' + el.className + ' ').indexOf(' ' + className + ' ') !== -1;
	}
};

var addClass = function(el, className) {
	if (!el || !className) return false;
	// 如果添加多个class  使用空格区分
	var classes = className.split(' ');
	// 缓存原来的className
	var curClass = el.className;

	for (var i = classes.length - 1; i >= 0; i--) {
		var adClass = classes[i];
		// 如果 中间连续存在空格  此时adClass就是 '' 所以过滤
		if (!adClass) continue;
		// 如果已存在则不添加
		// if(hasClass(el,adClass)) continue;

		if (el.classList) {
			// DOMTokenList 的add方法  如果 class已存在则不会添加
			el.classList.add(className);
		} else if (!hasClass(el, adClass)) {
			curClass += ' ' + adClass;
		}
	}
	// 不支持classList的 通过className设置
	if (!el.classList) {
		el.className = curClass;
	}
};
var removeClass = function(el, className) {
	if (!el || !className) return false;
	// 如果添加多个class  使用空格区分
	var classes = className.split(' ');
	// 缓存原来的className
	var curClass = el.className;

	for (var i = classes.length - 1; i >= 0; i--) {
		var adClass = classes[i];
		// 如果 中间连续存在空格  此时adClass就是 '' 所以过滤
		if (!adClass) continue;
		// 如果已存在则不添加
		// if(hasClass(el,adClass)) continue;

		if (el.classList) {
			// DOMTokenList 的remove方法
			el.classList.remove(className);
		} else if (hasClass(el, adClass)) {
			// replace 替换掉 class
			curClass.replace(' ' + adClass + ' ', ' ');
		}
	}
	// 不支持classList的 通过className设置
	if (!el.classList) {
		el.className = curClass;
	}
};

3. style

  • style
  • getComputedStyle()
  • currentStyle

3.1 style

style 获得的是一个 CSSStyleDeclaration 对象 返回的是 HTML 上 style 指定的所有样式,不包含外部样式、嵌入样式表现出的样式,对于使用短划线的 css 属性,必须转换成驼峰大小写形式 特别注意 float (关键字) IE 为 styleFloat 其他为 cssFloat。

js
var style1 = document.getElementById('style1');
console.log(style1.style); // CSSStyleDeclaration对象

image

我们获取元素样式

js
console.log(style1.style.color); // red
console.log(style1.style.backgroundColor); // #ececec
console.log(style1.style.cssFloat || style1.style.styleFloat); // undefined

style1.style.backgroundColor = 'green'; // 设置元素的样式
style1.style.fontSize = '20px'; //变成20px;

CSSStyleDeclaration 对象

我们看 CSSStyleDeclaration 对象

表示一个 CSS 属性键值对的集合, el.style 返回,window.getComputedStyle() 返回的也是此对象 其有几个比较重要的属性或者方法 1.cssText、getPropertyValue()、removeProperty()

<font color=green>IE8- 只支持 cssText 其他方法都不支持 其他浏览器支持</font>

cssText 是其文本内容 也就是 style 的值,可读写;
js
var style1CssProperties = style1.style;
//其中最重要的是 cssText   读写
console.log(style1CssProperties.cssText); // 'color: red; font-size: 20px;'
//可写,所以我们设置元素的属性的时候不要  el.style.xx = '';...频繁的操作元素
//可以   el.style.cssText = '';  记得在前面加一个 ;
//  注意:  在写的模式下会重写整个style特性的值
style1CssProperties.cssText = style1CssProperties.cssText + ';font-weight : 700 !important;';
console.log(style1CssProperties.cssText); // 'font-weight: 700;''

// style1CssProperties.length    返回当前在HTML上设置的样式属性数量
console.log(style1CssProperties.length); // 3
//包含的 CssRule ????????
console.log(style1CssProperties.parentRule); // null
//返回属性值
console.log(style1CssProperties.getPropertyValue('font-size')); // 20px 或者 ''
//返回可选的优先级
console.log(style1CssProperties.getPropertyPriority('font-weight')); // 'important' 或者 ''
//返回被删除的属性。
console.log(style1CssProperties.removeProperty('font-weight')); // 属性值 或者 ''
// 设置属性
console.log(style1CssProperties.setProperty('font-weight', '700', 'important')); // 没有返回值

el.getComputedStyle() currentStyle 属性 (计算样式)

一般常用 window.getComputedStyle(元素,一个伪元素字符串':before'/null),对于 IE8- 没有实现 window.getComputedStyle()方法 需要使用 el.currentStyle

  • 相同的 : 都是获取元素的计算样式
  • 不同点 :
    1、getComputedStyle IE8-不支持 el.currentStyle 只有 IE 支持 2、 getComputedStyle(元素,':before') 可以获取伪元素的计算属性 currentStyle 不支持 获取元素的计算样式的方法
js
var getProperty = function(el) {
	// 返回的是一个CSSStyleDeclaration对象
	return window.getComputedStyle ? window.getComputedStyle(el, '') : el.currentStyle;
};
注意的是: 获取的所有样式都是只读的。修改样式使用 style 属性,
js
console.log(window.getComputedStyle(document.getElementById('style1'), ''));
var cSSStyleDeclaration = window.getComputedStyle(document.getElementById('style1'));
console.log(cSSStyleDeclaration.display); //可以获取到display的值 'inline-block';
//获取before
//
console.log(window.getComputedStyle(document.getElementById('getComputedStyle'), ':before').backgroundColor); // rgb(255,0,0)
var currentStyleCss = document.getElementById('style1').currentStyle;
console.log(currentStyleCss); //undefined
console.log(currentStyleCss.display); //undefined
<font class="j-font-red j-font-blod" >两个获取与设置样式的方法 </font>
js
// 获取元素的style属性  肯定不能只获取style元素上的属性 需要获取的是 计算属性
// 支持计算属性  getComputedStyle()   currentStyle
var getStyle = function(el, styleName) {
	if (window.getComputedStyle) {
		if (!el || !styleName) return false;
		// 需要变成驼峰命名的方式
		styleName = camelCase(styleName);
		// float 需要单独处理
		if (styleName === 'float') {
			styleName = 'cssFloat';
		}
		try {
			var computedStyle = document.defaultView.getComputedStyle(el, null);
			return computedStyle ? computedStyle[styleName] : el.style[styleName] || null;
		} catch (e) {
			return el.style[styleName] || null;
		}
	} else {
		if (!el || !styleName) return false;
		// 需要变成驼峰命名的方式
		styleName = camelCase(styleName);
		// float 需要单独处理
		if (styleName === 'float') {
			styleName = 'styleFloat';
		}
		// IE 9 以下不支持getComputedStyle,支持 currentStyle
		try {
			// 当时此时opacity获取不到
			switch (styleName) {
				case 'opacity':
					try {
						return el.filters.item('alpha').opacity / 100;
					} catch (e) {
						return 1.0;
					}
				default:
					var computedStyle = el.currentStyle;
					return computedStyle ? computedStyle[styleName] : el.style[styleName] || null;
			}
		} catch (e) {
			return el.style[styleName] || null;
		}
	}
};
/**
 * 设置元素 的样式
 * @param {[type]} el         [元素]
 * @param {[type]} styleName  [如果是String  则是样式名称,多个样式请用对象的形式 ]
 * @param {[type]} styleValue [样式的值]
 */
var setStyle = function(el, styleName, styleValue) {
	if (!el || !styleName) return false;
	// 如果是对象
	if (typeof styleName === 'object') {
		for (var key in styleName) {
			if (styleName.hasOwnProperty(key)) {
				// 遍历 从而单个设置
				setStyle(el, key, styleName[key]);
			}
		}
	} else {
		// 样式跟class一样 需要驼峰命名
		styleName = camelCase(styleName);
		// 透明度样式 需要单独处理
		if (styleName === 'opacity') {
			el.style.filter = isNaN(styleValue) ? '' : 'alpha(opacity=' + styleValue * 100 + ')';
		} else {
			el.style[styleName] = styleValue;
		}
	}
};

4. 元素子父兄弟节点获取

  • el.parentNode 父节点
  • el.childNodes、el.children、el.childElementCount 子节点
  • el.firstChild、el.firstElementChild 第一个子节点
  • el.lastChild 、el.lastElementChild 最后一个子节点
  • el.previousSibling 、 el.previousElementSibling 前一个兄弟节点
  • el.nextSibling 、 el.nextElementSibling 后一个兄弟节点

image

4.1 el.parentNode

获取元素的父节点,其跟 el.offsetParent 有很大的区别

这就看出 DOM 树的结构 document -> html -> body -> 元素 -> 元素

js
console.log(child2.parentNode); //div#div1
console.log('------'); //div#div1
console.log(document.body.parentNode); // body的父节点 html
console.log(document.documentElement.parentNode); // html的父节点   #document
console.log(document.documentElement.parentNode.parentNode); // #document的父节点  null

4.2. el.childNodes、el.children、el.childElementCount (子节点)

前两个是获取元素的子节点,最后一个 el.childElementCount 获取元素子节点的数量。

区别:
  • el.childNodes 存在跟 childNode 一样的在标准模式下 计算 空白文本节点,在 IE8--不计算空白节点
  • el.children 直接获取第一个元素节点(nodeType === 1), 但是 IE9+才支持
html
<ul id="ul">
	空白文本1 空白文本2
	<li>li1</li>
	<li>li1</li>
	<li>li2</li>
	<li>li3</li>
	<!-- 这是注释 -->
	<div>li4</div>
</ul>
js
var ul = document.getElementById('ul');
var ulChildNodes = ul.childNodes;
var ulChildren = ul.children;
var ulChildElementCount = ul.childElementCount;

console.dir(ulChildNodes);
//NodeList 对象
// chrome/ff/ie9+   [ #text(" 空白文本1 空白文本2 "),<li>, #text(" "),<li>, #text(" "),<li>,<li>, #text(" "),<!-- 这是注释 -->, #text(" "),<div>,#text(""),<li>]
// ie8        [#text(" 空白文本1 空白文本2 ") ,<li>,<li>,<li>,<li>,<!-- 这是注释 -->,div ]
// ie7-       [#text(" 空白文本1 空白文本2 ") ,<li>,<li>,<li>,<li>,<!-- 这是注释 --> ]
console.log(ulChildNodes.length); // chrome : 12   ff: 12   ie9+ : 12  ie8: 7           ie7- : 5
console.dir(ulChildren);
//HTMLCollection 对象
//chrome/ff/ie9+  [<li>,<li>,<li>,<li>,<div>,<li>]
//ie8  [ <li>,<li>,<li>,<li>,<!-- 这是注释 -->,div ]
//ie7-  [ <li>,<li>,<li>,<li>,<!-- 这是注释 --> ]
console.log(ulChildren.length); // chrome : 5   ff: 5     ie9+ : 5   ie8: 6           ie7- : 4
console.log(ulChildElementCount); // chrome : 5   ff: 5     ie9+ : 5   ie8: undefined   ie7- : undefined

ul.appendChild(document.createElement('li'));

console.log(ulChildNodes);
console.log(ulChildNodes.length); // chrome : 13   ff: 13   ie9+ : 13  ie8: 8           ie7- : 6
console.log(ulChildren);
console.log(ulChildren.length); // chrome : 6   ff: 6   ie9+ : 6     ie8: 7           ie7- : 5
console.log(ulChildElementCount); // chrome : 5   ff: 5   ie9+ : 5     ie8: undefined   ie7- : undefined
  • 在 IE9+|其他浏览器上 childNodes 会包含 子元素间的空白节点(连续文本节点合成一个文本节点,中间以空格隔开)、注释节点、非法嵌套节点 children 只包含元素节点 和非法嵌套节点
  • 在 IE8 上 childNodes 包含 子元素的文本节点(连续文本节点合成一个文本节点,中间以空格隔开)、注释节点、非法嵌套节点 children 包含注释节点、非法嵌套节点
  • 在 IE7-下 childNodes 包含 子元素的文本节点(连续文本节点合成一个文本节点,中间以空格隔开)、注释节点 children 包含注释节点

4.3. el.firstChild、el.firstElementChild

都是获取元素第一个子节点,但是有很大的区别

区别:
  • el.firstChild 存在跟 childNode 一样的在标准模式下计算空白文本节点,在 IE8 不计算空白节点 IE7-不计算非法嵌套节点
  • el.firstElementChild 直接获取第一个元素节点(nodeType === 1), 但是 IE9+才支持
js
console.log(div1.firstChild); //#text 获取的不是我们相信的第一个div#child1 而是一个空白的text节点  因为在
console.log(div1.firstElementChild); // div#child1

// 这里出现一个问题,我们如何获取元素的第一个元素节点
var getFirstChildEle = function(el) {
	return (
		el.firstElementChild ||
		(function() {
			var first = el.firstChild;
			while (first && first.nodeType === 3) {
				first = first.nextSibling;
			}
			return first;
		})()
	);
};

4.4. el.lastChild、el.lastElementChild

都是获取元素最后一个子节点,但是有很大的区别

区别:
  • el.lastChild 存在跟 childNode 一样的在标准模式下计算空白文本节点,在 IE8 不计算空白节点 IE7-不计算非法嵌套节点
  • el.lastElementChild 直接获取素最后一个元素节点(nodeType === 1), 但是 IE9+才支持
js
console.log(div1.lastChild); //#text 获取的不是我们相信的最后一个div#child1 而是一个空白的text节点  因为在
console.log(div1.lastElementChild); // div#child1

// 这里出现一个问题,我们如何获取元素的最后一个元素节点
var getLastChildEle = function(el) {
	return (
		el.lastElementChild ||
		(function() {
			var last = el.lastChild;
			while (last && last.nodeType === 3) {
				last = last.previousSibling;
			}
			return last;
		})()
	);
};

4.5. el.nextSibling、el.nextElementSibling

都是获取元素下一个兄弟节点,但是有很大的区别

区别:跟 childNodes 与 children 一样 一个是节点一个是元素
js
console.log(child1.nextSibling); //#text
console.log(child1.nextElementSibling); //div#child2

4.6. el.previousSibling、el.previousElementSibling

都是获取元素上一个兄弟节点,但是有很大的区别

区别:跟 childNodes 与 children 一样 一个是节点一个是元素
console.log(child2.previousSibling);   //#text
console.log(child2.previousElementSibling);     //div#child1

5. 元素节点查找

  • querySelector()
  • querySelectorAll()
  • matchesSelector()

5.1. el.querySelector()

返回与指定的选择器组匹配的元素的后代的第一个元素。

js
var queryEl = el.querySelector(selectors);
  • el : 查找的根元素 , 如果全局查找 可以用 document
  • selectors : CSS 选择器字符串
  • queryEl : 子元素中满足指定选择器组的第一个元素 没有返回 null
js
console.log(document.querySelector('#child1')); //div#child1
console.log(document.querySelector('div')); //div#div1  匹配的第一个
console.log(document.querySelector('#div')); //null 不存在
console.log(document.getElementById('div1').querySelector('.children2')); //null  div1子元素不包含此元素

5.2. el.querySelectorAll()

返回与指定的选择器组匹配的元素的后代的所有元素。

js
var queryEl = el.querySelectorAll(selectors);
  • el : 查找的根元素 , 如果全局查找 可以用 document
  • selectors : CSS 选择器字符串
  • queryEl : 子元素中满足指定选择器组的所有元素 NodeList 如果包含伪元素则返回 Element
js
console.log(document.querySelectorAll('#child1')); //[div#child1]
console.log(document.querySelectorAll('div')); //[div....]
console.log(document.querySelectorAll('#div')); //[]
console.log(document.getElementById('div1').querySelectorAll('.children2')); //[]

5.3. el.matchesSelector()

返回元素是否与指定的 css 选择器匹配

js
var boolean = el.matchesSelector(selectors);
  • el : 匹配的元素
  • selectors : CSS 选择器字符串
  • boolean : 是否匹配
注:
1、 其只支持 IE9+ 且各浏览器实现方法都不相同
js
var matchesSelector = function(el, selector) {
	if (el.matchesSelector) {
		return el.matchesSelector(selector);
	} else if (el.msMatchesSelector) {
		return el.msMatchesSelector(selector);
	} else if (el.mozMatchesSelector) {
		return el.mozMatchesSelector(selector);
	} else if (el.webkitMatchesSelector) {
		return el.webkitMatchesSelector(selector);
	} else {
		throw new Error('matchesSelector is support!');
	}
};

console.log(matchesSelector(document.getElementById('div1'), '#div1')); //true

6. 元素节点的插入标记

  • innerHTML
  • outerHTML
  • insertAdjacentHTML
  • innerText
  • outerText
  • textContent

6.1. el.innerHTML

读写 返回节点所有的子节点(包含文本节点、注释节点、元素)对应的 HTML 标记 写 : 会根据值创建 DOM 树,然后完全替换掉元素所有的子节点。

注:
1、写的时候记住清除原来子节点绑定的事件。
2、 可以通过 innerHTML 插入样式数据 <style> </style>
js
console.log(innerHTML.innerHTML); //<DIV id=innerText>这是text</DIV>asdasd
console.log((innerHTML.innerHTML = '<div>这边</div>')); // <div>这边</div>
console.log((innerHTML.innerHTML = '<div class="inner">这边</div><style>.inner{color:red;}</style>')); // <div>这边</div>
console.log(innerHTML.innerHTML); //<div class="inner">这边</div><style>.inner{color:red;}</style>  字体颜色变红了
innerHTML.innerHTML = '<script> alert(1);</script>'; //在 chrome、firefox、opera、IE无效
//IE8-支持   但是script 需要添加 defer 属性  且需要在前面添加一个有作用域的节点(文本,元素)
innerHTML.innerHTML = '<!-- 注册 --><script defer> alert(1);</script>'; //在 IE8- 无效
innerHTML.innerHTML = '<text/><script defer> alert(1);</script>'; //在 IE8- 无效
innerHTML.innerHTML = '_<script defer> alert(1);</script>'; //在 IE8- 有效 弹出 1

6.2. el.outerHTML

读写 返回元素本身及其子节点(注释节点、文本节点、元素)所对应的 HTML 标记

js
console.log(innerHTML.outerHTML); //<div id="innerHTML"><div>这边</div></div>
console.log((innerHTML.outerHTML = '<div>这边</div>')); // <div id="innerHTML"><div>这边</div></div>  --->  <div>这边</div>

6.3. el.insertAdjacentHTML()

将指定的文本解析为 HTML 或 XML,并将结果节点插入到 DOM 树中的指定位置。它不会重新解析它正在使用的元素,因此它不会破坏元素内的现有元素。这避免了额外的序列化步骤,使其比直接 innerHTML 操作更快

js
var insertHTML = el.insertAdjacentHTML('beforebegin' | 'afterbegin' | 'beforeend' | 'afterend', insertHTML);

入参 : 'beforebegin'|'afterbegin'|'beforeend'|'afterend' 相对于 el 元素的位置 beforebegin : 元素自身的前面; el.parentNode.insertBefore(el,insertHTML) afterbegin : 元素内部 第一个子节点之前 == el.insertBefore(el.firstChild,insertHTML) beforeend : 元素内部最后一个子节点之后 == el.insertBefore(null,insertHTML) == el.appendChild(insertHTML) afterend : 元素自身之后 == el.parentNode.insertBefore(el.nextSiblingElement || null,insertHTML); insertHTML 插入的指定的文本 出参 : 插入的元素解析的 HTML/XML

浏览器支持 : IE4+ chrome1.0 Opera7.0 safari4.0 firefox8.0
js
var innerHTML = document.getElementById('innerHTML');
var insertText = '<div>这是插入的文本</div>';

innerHTML.insertAdjacentHTML('beforebegin', '<div>insert同级之前</div>'); // <div>这是插入的文本</div><div id="innerHTML"></div>
innerHTML.insertAdjacentHTML('afterend', '<div>insert同级之后</div>'); // <div id="innerHTML"></div><div>这是插入的文本</div>

innerHTML.insertAdjacentHTML('afterbegin', '<div>insert子节点第一个之前</div>'); // <div id="innerHTML"></div><div>这是插入的文本</div>
innerHTML.insertAdjacentHTML('beforeend', '<div>insert子节点最后一个之后</div>'); // <div id="innerHTML"></div><div>这是插入的文本</div>

6.4. el.innerText

读写 是一个表示一个节点及其后代的“渲染”文本内容的属性 读 : 会按照由浅入深的顺序 将所有子节点的文本拼接起来 写 : 会删除所有的子节点,插入相应的文本

浏览器支持 : IE4+ chrome1.0 Opera7.0 safari4.0 firefox8.0
js
var innerHTML = document.getElementById('innerHTML');

console.log(innerHTML.innerText); //这是text asdasd
innerHTML.innerText = '这是text文档'; //  <div id="innerHTML">这是text文档</div>
console.log(innerHTML.outerHTML); //  <div id="innerHTML">这是text文档</div>

6.5. el.textContent

读写 返回一个节点及其后代的文本内容

浏览器支持 : IE9+ chrome1.0 Opera safari firefox

js
console.log(innerHTML.textContent); //这是text asdasd
innerHTML.textContent = '这是text文档'; //  <div id="innerHTML">这是text文档</div>
console.log(innerHTML.textContent); //  <div id="innerHTML">这是text文档</div>
重点 : innerText 与 textContent 的区别
  1. textContent 会获取所有元素的内容,包括<script><style> 但是 innerText 不会;

  2. innerText 受 css 的影响 隐藏 display:none;等隐藏元素的内容,但是 textContent 不会;

  3. 由于 innerText 受 css 的影响,所以写的时候会触发浏览器的重排

  4. innerHTML 在 IE11-的浏览器下 对元素的写,不仅会删除元素的所有子节点,并且会永久破坏所有的文本节点,导致不能再次使用

js
// 1、textContent会获取所有元素的内容,包括<script><style>  但是innerText不会;
innerHTML.innerHTML = '<div class="inner">这边</div><style>.inner{color:red;}</style>';
console.log(innerHTML.innerText); //这边
console.log(innerHTML.textContent); //这边.inner{color:red;}

// 2、innerText 受css的影响 隐藏display:none;等隐藏元素的内容,但是textContent不会;
innerHTML.innerHTML = '<div class="inner">这边</div><div class="hidden">隐藏的文本</div><style>.inner{color:red;} .hidden{display:none;}</style>';
console.log(innerHTML.innerText); //这边
console.log(innerHTML.textContent); //这边隐藏的文本.inner{color:red;} .hidden{display:none;}

innerHTML.innerHTML = '<div class="inner">这边</div><div class="hidden">隐藏的文本</div><style>.inner{color:red;} .hidden{visibility:hidden;}</style>';
console.log(innerHTML.innerText); //这边
console.log(innerHTML.textContent); //这边隐藏的文本.inner{color:red;} .hidden{visibility:hidden;}

4、innerHTML 在IE11-的浏览器下 对元素的写,不仅会删除元素的所有子节点,并且会永久破坏所有的文本节点,导致不能再次使用
var el = document.getElementById("innerText");
innerHTML.innerText = '这边';
//在IE 11- 的时候 我们发现页面不是我们想的 这边 + 这是text  只有 这边
//chrome 等没有问题
innerHTML.appendChild(el);   //<DIV id=innerHTML>这边<DIV id=innerText></DIV></DIV>

6.6 el.outerText()

读写 返回一个节点及其后代的文本内容,写的时候会覆盖本身

浏览器支持 : IE4+ chrome1.0 Opera safari firefox
js
console.log(innerHTML.outerText); //这是text asdasd
innerHTML.outerText = '这是text文档'; //  这是text文档
console.log(innerHTML.outerText); //  这是text文档

7. 元素的属性

  • el.attributes

7.1 el.attributes()

读写 返回该元素所有属性节点的一个实时集合,是一个类数组的 NamedNodeMap 集合对象。如果它内部包含的对象发生改变的话,该对象会自动更新到最新的状态。

image

浏览器支持 : IE4+ chrome1.0 Opera safari firefox
js
var attrs = div1.attributes;

console.log(attrs[0]); // 'id="div1"'
console.log(attrs['id']); // 'id="div1"'
console.log(attrs.length); // 2

console.log(attrs.getNamedItem('id')); // 'id="div1"'
如何设置一个对象的属性
js
// 属性节点 创建属性对象
var newAttr = document.createAttribute('title');
newAttr.nodeValue = '这是title';
console.log(attrs.setNamedItem(newAttr)); // 'id="div1"'

// 一些常用的属性可以直接设置
el.id = 'div1';
NamedNodeMap 对象常用方法
js
el.hasAttribute('id'); //true-false
el.getAttribute('id');
el.setAttribute('id', 'div1');
el.removeAttribute('id');

8. 元素的大小、位置

请看 Element 元素的视窗大小、位置文档