DOM——獲取頁面元素


獲取頁面元素

為什么要獲取頁面元素

例如:我們想要操作頁面上的某部分(顯示/隱藏,動畫),需要先獲取到該部分對應的元素,才進行后續操作

1 根據id獲取元素

 如果沒有找到那個元素,返回null

 var div = document.getElementById('main');
 console.log(div);
 ​
 // 獲取到的數據類型 HTMLDivElement,對象都是有類型的

注意:由於id名具有唯一性,部分瀏覽器支持直接使用id名訪問元素,但不是標准方式,不推薦使用。

Bug:

document.getElementById()在IE瀏覽器(版本8之前)的一個bug

在IE8以前的版本中,document.getElementById()獲取的元素不僅限於ID,當存在相同的name屬性時,一樣會返回該元素 。所以這里會彈出a元素。

標准瀏覽器中會正確找到id為target元素,IE低版本瀏覽器中, 返回的是第一個id或name為target的元素。

當有兩個相同的id的元素時,返回的是第一個id為target的元素,IE低版本瀏覽器中, 返回的是第一個id或name為target的元素。

解決Bug:

 

 理解:

1、document.all方法的作用主要是返回對文檔中所有 HTML 元素的引用。例如:直接輸出這個語句:

http://img1.sycdn.imooc.com/climg/5def039709391fde11350563.jpg

http://img1.sycdn.imooc.com/climg/5def03980937c93109870300.jpg

2、document.all(0)和document.all[0]都是可以的,都可以選擇到第一個元素:

http://img1.sycdn.imooc.com/climg/5def03df09c6e9ec05670179.jpg

http://img1.sycdn.imooc.com/climg/5def03f30913cd5209740240.jpg

因為document.all方法得到的是一個類數組集合,並不是一個真正的數組,所以既可以使用數組的方法,也可以使用()來獲取。記住即可。另外這個屬性基本上已經用不到了,了解一下即可。

 必須是document.getElementByid("id")。不能用  其他元素.getElementByid("id")。

2 根據name獲取元素*

 var inputs = document.getElementsByName('hobby');
 for (var i = 0; i < inputs.length; i++) {
   var input = inputs[i];
   console.log(input);
 }

iE6和opera7.5瀏覽器上有Bug:首先它們會返回id=給定指定元素,其次它們僅返回input元素與image元素。

3 根據標簽名獲取元素

 

 獲取id為list1的元素內的所有li元素。

 var divs = document.getElementsByTagName('div');
 for (var i = 0; i < divs.length; i++) {
   var div = divs[i];
   console.log(div);
 } 

獲取注釋節點

獲取頁面中所有元素節點從html開始

4 根據類名獲取元素*

 var mains = document.getElementsByClassName('main');
 for (var i = 0; i < mains.length; i++) {
   var main = mains[i];
   console.log(main);
 }

支持:Firefox3、IE9、chrome和safari4 以上。

不支持:IE8及以下。

 傳入多個類名時用空格隔開,不區分先后順序。

解決getElementsByClassName兼容性問題

 1 var getElementsByClassName = function(opts) {
 2 var searchClass = opts.searchClass; // 存儲要查找的類名
 3 var node = opts.node || document; // 存儲要出查找的范圍
 4 var tag = opts.tag || '*'; // 存儲一定范圍內要查找的標簽
 5 var result = [];
 6 // 判斷瀏覽器支不支持getElementsByClassName方法
 7 if (document.getElementsByClassName) { // 如果瀏覽器支持
 8 // 通過getElementsByClassName獲取所有的元素
 9 var nodes = node.getElementsByClassName(searchClass);
10 // 判斷是否傳入了指定范圍, 如果傳入的li, 那么就只返回對應類名為searchClass的li標簽
11 if (tag !== "*") {
12 // 這里的node = nodes[i++]表示直到nodes集合中的最后一個元素。停止循環。這個就是循環條件哦。
13 /**
14   *  可以這樣理解for循環中間的代碼是用來判斷是否滿足循環條件的
15   *  當i = nodes.length;時候, nodes[nodes.length]值為undefined。 所以node的也被賦值為undefined, 
16   *  此時通過隱士類型轉換, undefined會被轉成false,不滿足循環條件了,也就退出循環了
17   */
18 for (var i = 0; node = nodes[i++];) {
19 // 判斷獲取元素的標簽名和指定的標簽名是否相等
20 if (node.tagName === tag.toUpperCase()) {
21 // 相等的話,就將獲取的元素存在到一開始定義的數組中
22 result.push(node);
23 }
24 }
25 } else { // 直接將獲取的所有元素賦值給result
26 result = nodes;
27 }
28 // 最后返回獲取的元素
29 return result;
30 } else { // 使用IE8以下的瀏覽器能夠支持該屬性
31 // 所有瀏覽器都會支持getElementsByTagName這個方法, 所以用給這個方法來兼用不支持getElementsByClassName的方法
32 var els = node.getElementsByTagName(tag);
33 // 獲取所有元素
34 var elsLen = els.length;
35 var i, j;
36 // 這里是定義一個正則表達式, 用來匹配傳入的類名
37 /**
38   * 正則表達式的定義及相關用法,后面會有對應的章節詳細講解, 同學目前只需要簡單了解即可哦
39   */
40 var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
41 /**
42   * 通過for循環, 將標簽中擁有類名元素找到, 賦值給result
43   */
44   for (i = 0, j = 0; i < elsLen; i++) {
45 // 檢測正則表達式,
46     if (pattern.test(els[i].className)) {
47       result[j] = els[i];
48       j++;
49      }
50   }
51   return result;
52  }
53 }
 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <meta charset="utf-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1">
 6     <title>getElementsByClassName() 兼容瀏覽器方案</title>
 7     <script src="domReady.js"></script>
 8     <script src="getElementsByClassName.js"></script>
 9     <script>
10       myReady(function(){
11         var myUl2 = document.getElementById("myUl2");
12         var r = getElementsByClassName({
13           searchClass: "light dark",
14           node: myUl2
15         });
16         console.log(r[0].innerHTML);
17       });
18     </script>
19   </head>
20   <body>
21     <ul id="myUl">
22       <li class="light">1</li>
23       <li class="light dark">2</li>
24       <li class="light">3</li>
25     </ul>
26     <ul id="myUl2">
27       <li class="light">1</li>
28       <li class="light dark">second</li>
29       <li class="light">3</li>
30     </ul>
31   </body>
32 </html>

5 根據選擇器獲取元素*

 var text = document.querySelector('#text');
 console.log(text);
 ​
 var boxes = document.querySelectorAll('.box');
 for (var i = 0; i < boxes.length; i++) {
   var box = boxes[i];
   console.log(box);
 }

 

IE7不支持。

querSelector()找不到對應的元素返回null。

querSelectorAll()找不到對應的元素返回空數組。

 類名中的冒號,需要進行轉義,否則會報錯。

返回的是StaticNodeList對象,類似NodeList但不是純正的NodeList,不具有類數組對象的動態性,下述代碼不會陷入死循環。

 

掌握
  getElementById()
  getElementsByTagName()
 了解
  getElementsByName()
  getElementsByClassName()
  querySelector()
  querySelectorAll()

給元素設置樣式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM