zoukankan      html  css  js  c++  java
  • JS选择器querySelector和~All,三个原生选择器

    定义:

    querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素。
    注意: querySelector() 方法仅仅返回匹配指定选择器的第一个元素。如果你需要返回所有的元素,请使用 querySelectorAll() 方法替代。
    语法
    document.querySelector(CSS selectors)
    参数值
    <body>
    <p>这是一个 p 与元素。</p>
    <p>这也是一个 p 与元素。</p>
    <p>点击按钮修改文档中第一个 p 元素的背景颜色。</p>
    <button onclick="myFunction()">点我</button>
    <script>
    function myFunction() {
        document.querySelector("p").style.backgroundColor = "red";
    }
    </script>
    </body>

    多选择器时:

    其他选择器:
    常见的其他获取元素的方法有3种,分别是通过元素ID、通过标签名字和通过类名字获取。

    1.DOM提供了一个名为getElementById的方法,这个方法将返回一个与之对应id属性的节点对象,它是document对象特有的函数,只能通过其来调用该方法,使用方法如下:document.getElementById('idName');
    2.getElementsByTagName方法返回一个对象数组(准确的说是HTMLCollection集合),返回元素的顺序是它们在文档中的顺序,传递给 getElementsByTagName() 方法的字符串可以不区分大小写,使用方法如下:document.getElementsByTagName(tagName);
    3.DOM还提供了getElementsByClassName方法来获取指定class名的元素,该方法返回文档中所有指定类名的元素集合,作为 NodeList 对象。NodeList 对象代表一个有顺序的节点列表。NodeList 对象 我们可通过节点列表中的节点索引号来访问列表中的节点(索引号由0开始), 所以有时使用时要指定下标,使用方法如下:document.getElementsByClassName('className');
    1 比较:
    2 获取页面I属性D为test的元素:
    3 document.getElementById("test");
    4 //or
    5 document.querySelector("#test");
    6 document.querySelectorAll("#test")[0];
    1 获取页面class属性为”red”的元素:
    2 document.getElementsByClassName('red')
    3 //or
    4 document.querySelector('.red')
    5 //or
    6 document.querySelectorAll('.red')
    由于querySelector是按css规范来实现的,所以它传入的字符串中第一个字符不能是数字.
    querySelector() 方法返回匹配指定 CSS 选择器元素的第一个子元素 。 该方法只返回匹配指定选择器的第一个元素。如果要返回所有匹配元素,需要使用 querySelectorAll() 方法替代.

    query选择符选出来的元素及元素数组是静态的,而getElement这种方法选出的元素是动态的。静态的就是说选出的所有元素的数组,不会随着文档操作而改变. 

    所以 在使用的时候getElement这种方法性能比较好,query选择符则比较方便.

    <div id="test1">
        <a href="http://www.bilibili.com/">哔哩哔哩</a>
        <a href="http://www.acfun.com/">ACfun</a>
        <a href="http://www.niconico.com/">泥扣泥扣</a>
    </div>
    <pid="bar">111</p>
        <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
        </script>
        <script>
            var d1 = document.getElementById('test1'),
                obj1 = d1.querySelector('div a'),
                obj2 = d1.querySelectorAll('div a');
            obj3 = $(d1).find('div a');
            console.log(d1) //DOM结构
            console.log(obj1) //<a href="http://www.bilibili.com/">哔哩哔哩</a>
            console.log(obj2.length) //3
            console.log(obj2)
            console.log(obj2[2])
            console.log(obj3) //null
        </script>

    getElementById获得一个DOM结构,注意querySelectorAll返回的是一个NodeList,不是一个数组,不是一个可观的DOM结构,可以试下打印obj2,只有加上下标可返回对应元素。

    记住不能通过下面这样的forEach遍历:
    document.querySelectorAll('div a').forEach(function() {
    });
     要想循环遍历querySelectorAll返回的结果,对于一个NodeList,我们可以用下面的技巧来循环遍历它:
    (利用回调函数转换this,原因在下一篇博客专门来解释)
    var divs = document.querySelectorAll('div');
    [].forEach.call(divs, function(div) {
      // do whatever
      div.style.color = "red";
    });
    当然,我们也可以用最传统的方法遍历它:
    var divs = document.querySelectorAll('div'), i;
    for (i = 0; i < divs.length; ++i) {
      divs[i].style.color = "green";
    }
     
    还有一种更好的方法,就是自己写一个:
    // forEach method, could be shipped as part of an Object Literal/Module
    var forEach = function (array, callback, scope) {
      for (var i = 0; i < array.length; i++) {
        callback.call(scope, i, array[i]); // passes back stuff we need
      }
    };
    // 用法:
    // optionally change the scope as final parameter too, like ECMA5
    var myNodeList = document.querySelectorAll('li');
    forEach(myNodeList, function (index, value) {
      console.log(index, value); // passes index + value back!
    });
     
    还有一种语法:for..of 循环,但似乎只有Firefox支持:
    /* Be warned, this only works in Firefox */
    var divs = document.querySelectorAll('div );
    for (var div of divs) {
      div.style.color = "blue";
    }
     
     
    ---------------------
    作者:Lawliet_ZMZ
    来源:CSDN
    原文:https://blog.csdn.net/major_zhang/article/details/78118823
  • 相关阅读:
    sqlilabs 5
    sqlilabs 1-4
    ipset
    kill命令的使用
    docker 札记
    批量删除数据库表中数据行
    正则表达式调试
    TimescaleDB安装学习
    记一次 Centos7 postgresql v11 安装时序数据库 TimescaleDB
    "知识库"
  • 原文地址:https://www.cnblogs.com/yuer20180726/p/11199965.html
Copyright © 2011-2022 走看看