亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery中實現text()的方法

2019-11-19 11:52:37
字體:
來源:轉載
供稿:網友

一、有這樣一段 html

<div class="divOne"> <p>嘿嘿嘿</p></div><div class="divOne"> <p>哈哈哈</p></div>

二、jQuery 的 text() 方法

(1)當直接調用 $().text()時,.text()的作用是(循環)讀?。ǘ鄠€)目標元素的textContent/nodeValue

簡單實現:

 function readText(elem) { let node,  ret = "",  i = 0,  nodeType = elem.nodeType console.log(nodeType,'nodeType22') //如果selector是類的話,會有多個目標元素,此時需要分別單個循環 //比如document.querySelectorAll('.divOne').nodeType ->undefined if (!nodeType) {  while ((node = elem[i++])) {  //單個獲取  ret += readText(node)  } } //元素節點,文檔節點,文檔碎片 else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {  //如果目標元素的內容是文本,則直接返回  if (typeof elem.textContent === "string") {  /*jQuery沒有用innerText獲取文本的值,http://bugs.jquery.com/ticket/11153,  大概就是在IE8中新節點插入會保留所有回車。  所以jQuery采用了textContent獲取文本值,  textContent本身是dom3規范的,可以兼容火狐下的innerText問題。*/  return elem.textContent  }  //如果節點內容不是文本,則循環子節點,并依次獲取它們的文本節點  else {  for (elem = elem.firstChild; elem; elem = elem.nextSibling) {   ret += readText(elem)  }  } } //文本節點、一個文檔的CDATA部分(沒遇到過這個) else if (nodeType === 3 || nodeType === 4) {  //返回節點值  return elem.nodeValue; } //nodeType:注釋節點 8,處理指令 7 //text()方法不處理這兩個類型節點 return ret }

(2)當調用$().text(value)時,.text(value)的作用是為每一個符合條件的目標元素的textContent設置為 value

簡單實現:

writeText():

 function writeText(value) { let elem,  i = 0; //先清空目標元素的內容 customEmpty.call(this) //循環 for (; (elem = this[i]) != null; i++) {  //元素節點,文檔碎片,文檔節點  if (elem.nodeType === 1 || elem.nodeType === 11 || elem.nodeType === 9) {  // text()方法不會解析標簽  elem.textContent = value;  } } //return this 方便鏈式調用 return this }

customEmpty():

 function customEmpty() { let elem,  i = 0; //注意for循環的寫法 for (; (elem = this[i]) != null; i++) {  //如果是元素節點的話,清空該節點的所有內容  if (elem.nodeType === 1) {  elem.textContent = "";  } } return this; }

(3)源碼實現

源碼:

jQuery.text()總體:

//源碼6152行 text: function( value ) {  return access( this, function( value ) {  return value === undefined ?   //讀   //如果直接調用text()的話,就調用Sizzle.getText   jQuery.text( this ) :   //寫   //循環   this.empty().each( function() {   //先清空目標元素的內容,然后再賦值   if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {    console.log(value,'value6159')    //如果包含標簽的話,需要用html()方法,text()方法不會解析標簽    /*jQuery沒有用innerText獲取文本的值,http://bugs.jquery.com/ticket/11153,    大概就是在IE8中新節點插入會保留所有回車。    所以jQuery采用了textContent獲取文本值,    textContent本身是dom3規范的,可以兼容火狐下的innerText問題。*/    this.textContent = value;   }   } )  }, null, value, arguments.length ); },

源碼解析:

① 調用text(),實際上是調用access()

也就是說:調用jQuery.access()相當于調用了fn.call( elems, value ),即自定義的方法jQuery.access(this, function(value) {xxx})

② .text()的情況調用這部分源碼:

jQuery.text()調用的其實是Sizzle.getText()

 //源碼2833行 jQuery.text = Sizzle.getText;Sizzle.getText()://源碼1642行getText = Sizzle.getText = function( elem ) {  var node,   ret = "",   i = 0,   nodeType = elem.nodeType;  if ( !nodeType ) {   while ( (node = elem[i++]) ) {   // Do not traverse comment nodes   ret += getText( node );   }  }  //元素節點、文檔節點、文檔碎片  else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {   // Use textContent for elements   // innerText usage removed for consistency of new lines (jQuery #11153)   //如果目標元素的子節點是文本節點,則直接返回它的textContent   if ( typeof elem.textContent === "string" ) {   /*jQuery沒有用innerText獲取文本的值,http://bugs.jquery.com/ticket/11153,   大概就是在IE8中新節點插入會保留所有回車。   所以jQuery采用了textContent獲取文本值,   textContent本身是dom3規范的,可以兼容火狐下的innerText問題。*/   return elem.textContent;   }   //如果子節點不是文本節點,則循環子節點,并依次獲取它們的文本節點   else {   // Traverse its children   for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {    ret += getText( elem );   }   }  }  //文本節點、一個文檔的CDATA部分(沒遇到過這個)  else if ( nodeType === 3 || nodeType === 4 ) {   return elem.nodeValue;  }  // Do not include comment or processing instruction nodes  return ret;  };

③ .text(value)的情況調用這部分源碼:

jQuery.text(value):

  //寫   //循環   this.empty().each( function() {   //先清空目標元素的內容,然后再賦值   if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {    console.log(value,'value6159')    //如果包含標簽的話,需要用html()方法,text()方法不會解析標簽    /*jQuery沒有用innerText獲取文本的值,http://bugs.jquery.com/ticket/11153,    大概就是在IE8中新節點插入會保留所有回車。    所以jQuery采用了textContent獲取文本值,    textContent本身是dom3規范的,可以兼容火狐下的innerText問題。*/    this.textContent = value;   }   } )

empty():

 //源碼6231行 empty: function() {  var elem,  i = 0;  for ( ; ( elem = this[ i ] ) != null; i++ ) {  //如果是元素節點的話  if ( elem.nodeType === 1 ) {   // Prevent memory leaks   //清空內容和事件,防止內存泄漏   jQuery.cleanData( getAll( elem, false ) );   // Remove any remaining nodes   //清空節點所有內容   elem.textContent = "";  }  }  return this; },

④ 總結

$(".divOne").text()的本質:

(1)節點內容是文本,返回$(".divOne")[i].textContent

(2)節點內容不是文本,循環返回$(".divOne")[i].element[j].textContent

(3)節點內容是文本節點或一個文檔的CDATA部分,則返回$(".divOne")[i]. nodeValue

$(".divOne").text("Hello <b>world</b>!")的本質:

(1)jQuery.cleanData()

(2)$(".divOne")[i].textContent = ""

(3)$(".divOne")[i].textContent="Hello world!"

注意:text() 不會去解析 html 標簽!

參考:http://api.jquery.com/text/

完整代碼:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>jQuery之text()</title></head><body><script src="jQuery.js"></script><div class="divOne"> <!--<p id="divTwo">嘿嘿嘿</p>--> <p>嘿嘿嘿</p></div><div class="divOne"> <p>哈哈哈</p></div><input type="text" id="inputOne"><script> function readText(elem) { let node,  ret = "",  i = 0,  nodeType = elem.nodeType console.log(nodeType,'nodeType22') //如果selector是類的話,會有多個目標元素,此時需要分別單個循環 //比如document.querySelectorAll('.divOne').nodeType ->undefined if (!nodeType) {  while ((node = elem[i++])) {  //單個獲取  ret += readText(node)  } } //元素節點,文檔節點,文檔碎片 else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {  //如果目標元素的內容是文本,則直接返回  if (typeof elem.textContent === "string") {  /*jQuery沒有用innerText獲取文本的值,http://bugs.jquery.com/ticket/11153,  大概就是在IE8中新節點插入會保留所有回車。  所以jQuery采用了textContent獲取文本值,  textContent本身是dom3規范的,可以兼容火狐下的innerText問題。*/  return elem.textContent  }  //如果節點的內容不是文本,則循環子節點,并依次獲取它們的文本節點  else {  for (elem = elem.firstChild; elem; elem = elem.nextSibling) {   ret += readText(elem)  }  } } //文本節點、一個文檔的CDATA部分(沒遇到過這個) else if (nodeType === 3 || nodeType === 4) {  //返回節點值  return elem.nodeValue; } //nodeType:注釋節點 8,處理指令 7 //text()方法不處理這兩個類型節點 return ret } function customEmpty() { let elem,  i = 0; //注意for循環的寫法 for (; (elem = this[i]) != null; i++) {  //如果是元素節點的話,清空該節點的所有內容  if (elem.nodeType === 1) {  elem.textContent = "";  } } return this; } function writeText(value) { let elem,  i = 0; //先清空目標元素的內容 customEmpty.call(this) //循環 for (; (elem = this[i]) != null; i++) {  //元素節點,文檔碎片,文檔節點  if (elem.nodeType === 1 || elem.nodeType === 11 || elem.nodeType === 9) {  // text()方法不會解析標簽  elem.textContent = value;  } } //return this 方便鏈式調用 return this } function customText(value) { return value === undefined ?  //讀  readText(this) :  //寫  writeText.call(this, value) } customText.call(document.querySelectorAll('.divOne')) customText.call(document.querySelectorAll('.divOne'),"Hello <b>world</b>!") // let p=document.createElement('p') // p.innerText='哈哈哈' console.log($(".divOne").text()) // customText.call(document.querySelectorAll('.divOne')) // console.log(document.querySelectorAll('.divOne').nodeType,'childnode81') // console.log(document.querySelectorAll('.divOne')[0].textContent,'childnode81') // $("#divOne").text('<p>aaaa</p>') // console.log(document.querySelector("#divTwo"))</script></body></html>

總結

以上所述是小編給大家介紹的jQuery中實現text()的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩欧美在线视频| 欧美肥婆姓交大片| 91久久精品国产91久久性色| 日韩av在线网站| 亚洲国语精品自产拍在线观看| 日韩久久免费视频| 91视频国产精品| 91免费综合在线| 一区二区亚洲欧洲国产日韩| 色偷偷亚洲男人天堂| 国产在线精品播放| 日本精品va在线观看| 国产精品欧美一区二区三区奶水| 国产精品∨欧美精品v日韩精品| 亚洲一区二区福利| 国产欧美在线观看| 久久福利视频导航| 成人国产精品免费视频| 国产精品久久久久久久久久| 欧美最猛性xxxxx亚洲精品| 国产精品一区二区三| 久久久99久久精品女同性| 欧美激情手机在线视频| 91精品久久久久久久久久另类| 欧美午夜女人视频在线| 国产免费一区视频观看免费| 蜜臀久久99精品久久久无需会员| 国产日产亚洲精品| 亚洲国产精品久久久| 国产免费一区视频观看免费| 久久久欧美精品| 欧美在线影院在线视频| 中文字幕日韩在线视频| 日本成人在线视频网址| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产天堂久久国产91| 国产精品视频免费在线观看| 久久视频精品在线| 欧美日韩综合视频| 国产精品女视频| 久久久久久久一区二区| 久久亚洲欧美日韩精品专区| 美日韩精品免费观看视频| 成人综合国产精品| 日韩中文字幕不卡视频| 成人羞羞国产免费| 欧美日韩第一页| 国产精品久久久久久中文字| 精品国产一区二区三区四区在线观看| 亚洲伊人一本大道中文字幕| 在线观看91久久久久久| 91亚洲人电影| 亚洲国产欧美一区二区三区久久| 麻豆国产va免费精品高清在线| 国产经典一区二区| 久久精品91久久香蕉加勒比| 成人黄色免费看| 精品毛片三在线观看| 成人久久18免费网站图片| 欧美区二区三区| 色偷偷噜噜噜亚洲男人的天堂| 国产69精品久久久久9999| 国产精品色悠悠| 狠狠躁天天躁日日躁欧美| 精品高清美女精品国产区| 亚洲精品v欧美精品v日韩精品| 亚洲视频在线免费观看| 日韩av手机在线观看| 91精品国产91久久久久久吃药| 亚洲美女又黄又爽在线观看| www.日韩av.com| 久久久久九九九九| 欧美裸体男粗大视频在线观看| 亚洲天天在线日亚洲洲精| 96国产粉嫩美女| 97精品伊人久久久大香线蕉| 欧美激情在线一区| 88国产精品欧美一区二区三区| 综合欧美国产视频二区| 日本成人免费在线| 亚洲国产日韩欧美综合久久| 视频在线观看一区二区| 亚洲欧美日本伦理| 国产一级揄自揄精品视频| 懂色aⅴ精品一区二区三区蜜月| 亚洲视频999| 日韩在线免费视频观看| 国产精品啪视频| 一本一本久久a久久精品牛牛影视| 性金发美女69hd大尺寸| 久久伊人精品天天| 国产精品高清网站| 91精品久久久久久久久中文字幕| 97色伦亚洲国产| 深夜福利国产精品| 激情成人中文字幕| 欧美乱大交xxxxx另类电影| 欧美最猛性xxxxx免费| 亚洲人成网在线播放| 成人免费在线网址| 国产欧美一区二区白浆黑人| 亚洲欧洲xxxx| 久久久女人电视剧免费播放下载| 亚洲欧美一区二区精品久久久| 欧美xxxx做受欧美.88| 日日噜噜噜夜夜爽亚洲精品| 81精品国产乱码久久久久久| 日韩视频在线免费| 成人黄色大片在线免费观看| 日韩av影院在线观看| 午夜精品www| 成人美女av在线直播| 欧美高跟鞋交xxxxhd| 国产精品亚洲аv天堂网| 色偷偷噜噜噜亚洲男人的天堂| 国产精品高潮呻吟视频| 91久久久久久国产精品| 国产精品十八以下禁看| 欧美大片在线看| 日韩精品一区二区视频| 性夜试看影院91社区| 国产精品福利无圣光在线一区| 一区二区三区亚洲| 亚洲女人初尝黑人巨大| 中日韩美女免费视频网址在线观看| 国产精品美女午夜av| 亚洲精品成人免费| 色综合视频网站| 国产日韩在线精品av| 国产99久久精品一区二区| 亚洲黄色片网站| 成人久久久久久久| 中文国产成人精品| 久久国产精品网站| 欧美高清性猛交| 国产成人在线一区二区| 久久大大胆人体| 国产亚洲激情视频在线| 国产精品视频内| 亚洲肉体裸体xxxx137| 久久亚洲综合国产精品99麻豆精品福利| 日本19禁啪啪免费观看www| 精品少妇一区二区30p| 欧美精品激情视频| 亚洲精品综合精品自拍| 亚洲深夜福利网站| 亚洲色在线视频| 亚洲国产精品系列| 欧美精品在线网站| 91精品国产高清自在线| 国产精品专区第二| 亚洲第一黄色网| 亚洲一区免费网站| 91精品国产高清| 亚洲美女视频网| 成人a级免费视频| 日本成人黄色片| 91国偷自产一区二区三区的观看方式| 欧美午夜www高清视频| 亚洲色图五月天| 成人午夜一级二级三级| 久久精品国产视频| 欧美成人精品在线播放| www日韩中文字幕在线看|