html()和innerHTML

在控制台用jQuery想获取节点的html,不管是用 .html() 还是 innerHTML,总是报错:

发现直接$()出来的是原生的元素对象,是DOM结构,而不是jquery对象:

 

输出$,发现这不是jquery的$对象:

 

发生了什么?

答案在这里:Chrome控制台选择器简介

原来是浏览器提供了一个自己的 $ 和 $$ 对象,$ 就相当于是 document.querySelector(),$$ 相当于 document.querySelectorAll()

 

如果要用 jQuery 的 $ 就需要自己手动引入文件:

此时,就是我们常用的 jQuery 对象了:

 

 

 

$的问题解决了,说回正题, html() 和 innerHTML 该什么时候用?其实很简单,只要我们明确 html() 是 jQuery 的方法,而 innerHTML 是 DOM 的属性 就可以了。

用这个html结构做演示。

jquery对象可以使用html()

innerHTML 则不能用于 jQuery 对象,只能用于原生的DOM对象,因为它不是 jQuery 的属性

 

可以看到 document.getElementById("intro") 和 $("#intro")[0] 是一样的,都是 DOM,但是和 $("#intro") 不同,所以它们对应的方法也就不一样了

 

那 html() 和 innerHTML 有什么关系吗?来源码中看一看。

来看 access 的第一和第二个参数,第一个是 this 对象,第二个是方法,方法中传入 value,也就是我们要修改的内容。

第3行,把 this 对象通过索引的方式取出第一个 DOM 元素赋值给 elem,elem 是一个 DOM 对象

第7行,如果 value 为空,即我们调用了$().html()想获取内容,因此直接返回元素内容 elem.innerHTML

第18行,如果 value 不为空,循环所有的 DOM 并给它们赋值,elem.innerHTML = value

其实就是 jQuery 使用了 innerHTML 来实现 html() 的功能,他们唯一的不同就是在适用对象上。

 1 html: function( value ) {
 2     return access( this, function( value ) {
 3         var elem = this[ 0 ] || {},
 4             i = 0,
 5             l = this.length;
 6 
 7         if ( value === undefined && elem.nodeType === 1 ) {
 8             return elem.innerHTML;
 9         }
10 
11         // See if we can take a shortcut and just use innerHTML
12         if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
13             !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
14 
15             value = jQuery.htmlPrefilter( value );
16 
17             try {
18                 for ( ; i < l; i++ ) {
19                     elem = this[ i ] || {};
20 
21                     // Remove element nodes and prevent memory leaks
22                     if ( elem.nodeType === 1 ) {
23                         jQuery.cleanData( getAll( elem, false ) );
24                         elem.innerHTML = value;
25                     }
26                 }
27 
28                 elem = 0;
29 
30             // If using innerHTML throws an exception, use the fallback method
31             } catch ( e ) {}
32         }
33 
34         if ( elem ) {
35             this.empty().append( value );
36         }
37     }, null, value, arguments.length );
38 }

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/cyhan/p/11670083.html
今日推荐