国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

原生的html元素選擇器類似jquery選擇器

2024-05-06 16:09:40
字體:
供稿:網(wǎng)友
做前端,需要選擇元素,下面是實(shí)現(xiàn)代碼,一個(gè)原生的html元素選擇器類似jquery選擇器,很棒,很實(shí)用
 
 

做前端,需要選擇元素,雖說有jquery和各大js庫已經(jīng)幫我造好了輪子,但我想試試自己實(shí)現(xiàn)一個(gè),正好項(xiàng)目也不忙,正好加入自己的js文件中,下面是實(shí)現(xiàn)代碼。用$g(“#content .op”)這種格式就可以調(diào)用,和jquery $()的參數(shù)一樣:

 

  1. function $findChilds(parentNode, text)  
  2. {  
  3. //如果不傳入父節(jié)點(diǎn)的話,默認(rèn)為body  
  4. if(parentNode == undefined)  
  5. parentNode = document.body;  
  6. var childNodes = parentNode.childNodes;  
  7. var results = [];  
  8. //子節(jié)點(diǎn)大于零才循環(huán)  
  9. if(childNodes.length > 0)  
  10. {  
  11. var length = childNodes.length;  
  12. //循環(huán)查找符合text的節(jié)點(diǎn)  
  13. for(var i=0;i<length;++i)  
  14. {  
  15. //三種情況,className,id, tagName  
  16. switch(text.substr(0, 1))  
  17. {  
  18. case '.':  
  19. //這兩種:parentNode.getElementsByClassName,parentNode.all  
  20. //都是后來加上的,如果瀏覽器這兩種方法都不支持,那就只能暴力遞歸了  
  21. if(parentNode.getElementsByClassName)  
  22. return parentNode.getElementsByClassName(text.substr(1));  
  23. else if(parentNode.all)  
  24. {  
  25. var finded = [];  
  26. var jlength = parentNode.all.length;  
  27. for(var j=0;j<jlength;++j)  
  28. if(parentNode.all[j].className == text.substr(1))  
  29. finded.push(parentNode.all[j]);  
  30. return finded;  
  31. }  
  32. //以上兩種方法都不支持,直接判斷  
  33. if(childNodes[i].className == text.substr(1))  
  34. results.push(childNodes[i]);  
  35. break;  
  36. case '#':  
  37. return [document.getElementById(text.substr(1))];  
  38. default:  
  39. return parentNode.getElementsByTagName(text);  
  40. }  
  41. //判斷完后,把當(dāng)前子元素的子元素傳入$findChilds進(jìn)行遞歸查找,返回的結(jié)果直接和現(xiàn)在的結(jié)果合并  
  42. results = results.concat($findChilds(childNodes[i], text));  
  43. }  
  44. }  
  45. return results;  
  46. }  
  47.  
  48. String.prototype.vtrim = function() {  
  49. return this.replace(/^/s+|/s+$/g, '');  
  50. }  
  51.  
  52. function $g(text)  
  53. {  
  54. //按照空格分割參數(shù)  
  55. var values = text.vtrim().split(" ");  
  56. var length = values.length;  
  57. //如果只有一個(gè)選擇參數(shù)的話,就直接調(diào)用dom方法返回結(jié)果。  
  58. if(length == 1)  
  59. switch(values[0].substr(0, 1))  
  60. {  
  61. case "#":  
  62. return document.getElementById(values[0].substr(1));  
  63. case ".":  
  64. if(document.getElementsByClassName)  
  65. return document.getElementsByClassName(values[0].substr(1));  
  66. default:  
  67. return document.getElementsByTagName(values[0]);  
  68. }  
  69. //每次迭代都會(huì)產(chǎn)生許多符合參數(shù)的結(jié)果節(jié)點(diǎn),這里結(jié)果節(jié)點(diǎn)的名稱為parentNodes,第一次循環(huán)默認(rèn)為body  
  70. var parentNodes = [document.body];  
  71. //外層循環(huán)為迭代每個(gè)傳入的參數(shù)  
  72. for(var i = 0; i < length; ++i)  
  73. {  
  74. var jlength = parentNodes.length;  
  75. var results = [];  
  76. //這里如果values的長度為零的話,  
  77. //就說明是多出來的空格,  
  78. //例如:$g(" .content");這種情況不執(zhí)行代碼直接跳入下一循環(huán)  
  79. var tmpValue = values[i].vtrim();  
  80. if(tmpValue.length <= 0)  
  81. continue;  
  82. //內(nèi)層循環(huán)為迭代每個(gè)結(jié)果節(jié)點(diǎn),  
  83. //在結(jié)果節(jié)點(diǎn)中查找符合選擇條件的結(jié)果。當(dāng)然第一次為body  
  84. for(var j=0;j<jlength;++j)  
  85. {  
  86. //$findChilds就是上邊的那個(gè)函數(shù),就是選擇某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的  
  87. var result = $findChilds(parentNodes[j], values[i].vtrim());  
  88. var rlength = result.length;  
  89. //因?yàn)榉祷氐挠袝r(shí)候是html容器,無法直接和數(shù)組concat所以倒入數(shù)組,這里有優(yōu)化空間,但暫不考慮性能先這么做  
  90. for (var k = 0; k < rlength; ++k)  
  91. results.push(result[k]);  
  92. }  
  93. //沒有結(jié)果,立即返回undefined  
  94. if(results == undefined || results.length <= 0)  
  95. return undefined;  
  96. //最后一次循環(huán)就直接返回結(jié)果數(shù)組,但是如果最后一個(gè)選擇條件是選擇id的話,那就不返回?cái)?shù)組直接返回dom對(duì)象了  
  97. if (i == length - 1)  
  98. {  
  99. if (values[i].substr(0, 1) == "#")  
  100. return results[0];  
  101. return results;  
  102. }  
  103. parentNodes = results;  
  104. }  
?
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 达孜县| 大兴区| 洞头县| 汉中市| 扶绥县| 海安县| 呼图壁县| 阿图什市| 麻江县| 屯留县| 牡丹江市| 陇西县| 大石桥市| 安陆市| 通许县| 乐平市| 旌德县| 宽城| 马尔康县| 丹棱县| 惠安县| 大宁县| 牟定县| 万全县| 乌鲁木齐县| 张家港市| 正蓝旗| 威信县| 兴和县| 扶绥县| 剑阁县| 鄯善县| 麻阳| 定兴县| 阜城县| 海阳市| 曲靖市| 宜城市| 剑阁县| 会宁县| 荥经县|