在控制台用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 }