zoukankan      html  css  js  c++  java
  • 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()

    给元素设置样式

     

  • 相关阅读:
    vim 打开了没有权限写入的文件,怎么才能不必重新编辑
    Linux 关闭终端响铃的特性
    Python 的 print 函数
    C 语言标准库中的qsort函数使用
    java知识学习14-面向对象
    java知识学习13-方法
    java知识学习12-数组
    mac格式化重装系统
    java知识学习11- IDEA
    java知识学习10-跳转控制语句(break/continue)、循环嵌套、Random
  • 原文地址:https://www.cnblogs.com/superjishere/p/11740805.html
Copyright © 2011-2022 走看看