前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

  DOM 操作必须等待 HTML 加载完毕之后,才可以获取节点;有两种方法:

  1. 把 script 标签放到代码的最后;
  2. 使用 window.onload 事件或者 JQuery 的 ready 事件;

  一般情况一个页面响应加载的顺序是,域名解析---加载html---加载js和css---加载图片等其他信息。

  window.onload 和 JQuery 的 ready事件的区别:

  1. window.onload 必须等到页面内包括图片的所有元素加载完毕后才能执行;   
  2. $(document).ready() 是 DOM 结构绘制完毕后(加载图片等信息之前)就执行,不必等到加载完毕;
  3. window.onload 不能同时编写多个,如果有多个 window.onload 方法,只会执行一个;
  4. $(document).ready() 可以同时编写多个,并且都可以得到执行;
  5. $(document).ready(function(){...}) 可以简写成 $(function(){...});

  有时候我们需要加载完图片之后在执行JS代码,那么 $(window).load(function(){...}) 可以代替 window.onload;

getElementById()

  obj.getElementById(id) 该方法接收一个参数(该元素的id),若找到则返回该元素对象,若不存在则返回 null;

  任何HTML元素可以有一个 id 属性,在文档中该值必须唯一;

getElementsByTagName()

  obj.getElementsByTagName(tagName) 方法接收一个参数,即要取得元素的标签名,而返回的是包含0或多个元素的类数组对象 HTMLCollection。可以使用方括号语法或 item() 方法来访问类数组对象中的项,length 属性表示对象中元素的数量;

  1. <script type="text/javascript">
  2. //获取body
  3. var oBodyA = document.getElementsByTagName('body')[0];
  4. var oBodyB = document.getElementsByTagName('body').item(0);
  5. console.log(oBodyA === oBodyB);//true
  6.  
  7. //获取所有元素
  8. var all = document.getElementsByTagName('*');
  9. //chrome和firefox都弹出6
  10. //IE弹出 7
  11. //因为 IE 把<! DOCTYPE html> 文档声明也当成标签
  12. console.log(all.length);
  13. </script>

getElementsByName()

  obj.getElementsByName(name) 方法会返回带有给定 name 特性的所有元素;一般我们用在表单元素上比较多;

  IE9及以下浏览器只支持在表单元素上使用 getElementsByName() 方法;

  IE9及以下浏览器中使用 getElementsByName() 方法也会返回id属性匹配的元素。因此,不要将 name 和 id 属性设置为相同的值;

  1. <input type="checkbox" name="test" value="测试" checked="checked"/>
  2.  
  3. <script type="text/javascript">
  4. var oTest = document.getElementsByName('test')[0];
  5. console.log(oTest.value);//测试
  6. console.log(oTest.checked);//true
  7. </script>

getElementsByClassName()

  HTML5 新增了 getElementsByClassName() 方法;

  在 javascript 中 class 是保留字,所以使用 className 属性来保存 HTML 的 class 属性值;

  • obj.getElementsByClassName(classaName) 方法接收一个参数,是包含一个或多个类名的字符串,返回带有指定类的所有元素的类数组对象 HTMLCollection。传入多个类名时,类名的先后顺序不重要。与 getElementsByTagName() 类似,该方法既可以用于 HTML 文档对象 document,也可以用于 element 元素对象;
  • IE8及以下浏览器不支持 getElementsByClassName();
  • 在操作 class 类名时,需要通过 className 属性添加、删除和替换类名。因为 className 是一个字符串,所以即使只修改字符串一部分,也必须每次都设置整个字符串的值。要从 className 字符串中删除一个类名,需要把类名拆开,删除不想要的那个,再重新拼成一个新字符串;

classList

  • HTML5 为所有元素添加了 classList 属性,这个 classList 属性是新集合类型 DOMTokenList 的实例,它有一个表示自己包含多少元素的 length 属性,而要取得每个元素可以使用 item() 方法,也可以使用方括号法;
  • IE9及以下浏览器不支持 classList 属性;

  classList 还有以下4个方法,我们主要用这些方法操作类名,有了 classList 属性,className 属性基本没有什么用武之地了:

  1. obj.classList.add(value); 将给定的字符串值添加到列表中,没有返回值,如果值已存在,则不添加;
  2. obj.classList.contains(value); 表示列表中是否存在给定的值,如果存在则返回true,否则返回false;
  3. obj.classList.remove(value); 从列表中删除给定的字符串,没有返回值;
  4. obj.classList.toggle(value); 如果列表中已经存在给定的值,删除它并返回false;如果列表中没有给定的值,添加它并且返回true;
  1. <div class="test abc"></div>
  2. <script>
  3. var oTest = document.getElementsByClassName('test')[0];
  4. var oTestAbc = document.getElementsByClassName('test abc')[0];
  5. var oAbc = document.getElementsByClassName('abc')[0];
  6. console.log(oTest === oTestAbc);//true
  7. console.log(oAbc === oTestAbc);//true
  8. console.log(oAbc === oTest);//true
  9.  
  10. console.log(oTest.classList);//["test", "abc", value: "test abc"]
  11. console.log(oTest.classList[0]);//"test"
  12. console.log(typeof oTest.classList[0]);//"string"
  13. console.log(oTest.classList.item(0));//"test"
  14.  
  15. //add()将给定的字符串值添加到列表中,没有返回值,如果值已存在,则不添加;
  16. oTest.classList.add('def');
  17. console.log(oTest.classList);//["test", "abc", "def", value: "test abc def"]
  18.  
  19. //contains()表示列表中是否存在给定的值,如果存在则返回true,否则返回false;
  20. console.log(oTest.classList.contains('def'));//true
  21. console.log(oTest.classList.contains('abcde'));//false
  22.  
  23. //remove()从列表中删除给定的字符串,没有返回值;
  24. oTest.classList.remove('abc');
  25. console.log(oTest.classList);//["test", "def", value: "test def"]
  26.  
  27. //toggle()如果列表中已经存在给定的值,删除它并返回false;如果列表中没有给定的值,添加它并且返回true;
  28. console.log(oTest.classList.toggle('hello'));//true
  29. console.log(oTest.classList);//["test", "def", "hello", value: "test def hello"]
  30. console.log(oTest.classList.toggle('test'));//false
  31. console.log(oTest.classList);//["def", "hello", value: "def hello"]
  32. </script>

选择器API

  HTML5 拓展了 querySelector()、querySelectorAll() 和 matchesSelector() 这3种方法,通过 CSS选择器查询DOM文档取得元素的引用的功能变成了原生的API,解析和树查询操作在浏览器内部通过编译后的代码来完成,极大地改善了性能。

  • obj.querySelector(selector) 方法接收一个CSS选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null。该方法既可用于文档 document 类型,也可用于元素 element 类型。IE7及以下不支持。
  • obj.querySelectorAll(selector) 接收一个CSS选择符,返回一个类数组对象,如果没有匹配元素,返回空的类数组对象,而不是null;IE7及以下不支持;
  • obj.matchesSelector(selector) 方法接收一个CSS选择符参数,如果调用元素与该选择符相匹配,返回true;否则返回false;
  • obj.matchesSelector(selector) 有兼容性问题,IE9+浏览器支持 msMatchesSelector() 方法,firefox 支持 mozMatchesSelector() 方法,safari 和 chrome 支持 webkitMatchesSelector() 方法。
  1. <div id="wrapper">
  2. <ul class="box">
  3. <li class="no1">第一行</li>
  4. <li class="no2">第二行</li>
  5. <li class="no3">第三行</li>
  6. <li class="no4">第四行</li>
  7. <li class="no5">第五行</li>
  8. </ul>
  9. </div>
  10. <script type="text/javascript">
  11. var oWrapper = document.querySelector('#wrapper');
  12. var oUl = oWrapper.querySelector('ul');
  13.  
  14. var oLiNo1 = oWrapper.querySelector('.no1');
  15. //obj.querySelector(selector) 方法接收一个CSS选择符,返回与该模式匹配的第一个元素,
  16. var oLiFirst = oWrapper.querySelector('li');
  17. var oFirstLi = oWrapper.querySelector('ul > li');
  18. console.log(oLiNo1 === oLiFirst);//true
  19. console.log(oLiNo1 === oFirstLi);//true
  20. console.log(oLiFirst === oFirstLi);//true
  21. console.log(oLiNo1.innerHTML , oLiFirst.innerHTML , oFirstLi.innerHTML);//第一行 第一行 第一行
  22.  
  23. //obj.querySelectorAll(selector) 接收一个CSS选择符,返回一个类数组对象
  24. var oWrapperAll = document.querySelectorAll('#wrapper');
  25. console.log(oWrapperAll);//[div#wrapper]
  26. console.log(oWrapperAll[0] === oWrapper);//true
  27.  
  28. var oWrapperArray = oWrapperAll[0];
  29. var oLiFirstAll = oWrapperArray.querySelectorAll('li');
  30. var oLiFirstArrayNo1 = oWrapperArray.querySelectorAll('li')[0];
  31. console.log(oLiFirstArrayNo1 === oLiNo1);//true
  32. console.log(oLiFirstAll[1].innerHTML);//第二行
  33.  
  34. // console.log(oWrapperArray.matchesSelector('#wrapper'));
  35. //TypeError: oWrapperArray.matchesSelector is not a function
  36.  
  37. console.log(oWrapperArray.webkitMatchesSelector('#wrapper'));//true
  38. //obj.matchesSelector(selector) 有兼容性问题,
  39. //IE9+浏览器支持 msMatchesSelector() 方法,
  40. //firefox 支持 mozMatchesSelector() 方法,
  41. //safari 和 chrome 支持webkitMatchesSelector() 方法。
  42. </script>

  选择器API使用时,需要注意的是:

  • querySelectorAll() 方法得到的类数组对象是非动态实时的,所以如果要计算长度等的实事值,最好重新获取;当然以前的 getElementById() 之类的就没这个毛病;
  • selector 类方法在元素上调用时,指定的选择器仍然在整个文档中进行匹配,然后过滤出结果集,以便它只包含指定元素的后代元素。这看起来是违反常规的,因为它意味着选择器字符串能包含元素的祖先而不仅仅是所匹配的元素;所以如果出现后代选择器,为了防止该问题,可以在参数中显式地添加当前元素的选择器;
  1. <div id="wrapper">
  2. <ul class="box">
  3. <li class="no1">第一行</li>
  4. <li class="no2">第二行</li>
  5. <li class="no3">第三行</li>
  6. <li class="no4">第四行</li>
  7. <li class="no5">第五行</li>
  8. </ul>
  9. </div>
  10. <script type="text/javascript">
  11. var oWrapper = document.querySelector('#wrapper');
  12. var oUl = oWrapper.querySelector('ul');
  13.  
  14. var oLiLast = oUl.querySelector('li:last-of-type');
  15. var oLiAll = oUl.querySelectorAll('ul > li');
  16. console.log(oLiLast.innerHTML);//第五行
  17. console.log(oLiAll.length);//5
  18.  
  19. var newLi = document.createElement('li');
  20. newLi.innerHTML = '新加的Li,放到最后面';
  21. oUl.appendChild(newLi);
  22. //querySelectorAll() 方法得到的类数组对象是非动态实时的;
  23. console.log(oLiLast.innerHTML);//第五行
  24. console.log(oLiAll.length);//5
  25. console.log(oUl.querySelector('li:last-of-type').innerHTML);//新加的Li,放到最后面
  26. console.log(oUl.querySelectorAll('ul > li').length);//6
  27. </script>
  28.  
  29. <div class="wrapper">
  30. <div class="test1"></div>
  31. <div class="test2"></div>
  32. </div>
  33. <script type="text/javascript">
  34. var oWrapper = document.querySelector('.wrapper');
  35. //selector 类方法在元素上调用时,指定的选择器仍然在整个文档中进行匹配,然后过滤出结果集,以便它只包含指定元素的后代元素。
  36. //这看起来是违反常规的,因为它意味着选择器字符串能包含元素的祖先而不仅仅是所匹配的元素
  37. console.log(oWrapper.querySelectorAll('div div'));//[div.test1, div.test2]
  38. //这句代码我的理解是获取oWrapper内部子孙元素中,div里嵌套的div,这里没有这种情况,所以应该弹出一个空数组
  39.  
  40. //如果出现后代选择器,为了防止该问题,可以在参数中显式地添加当前元素的选择器
  41. console.log(oWrapper.querySelectorAll('.wrapper div div'));//[]
  42. console.log(oWrapper.querySelectorAll('.wrapper div'));//[div.test1, div.test2]
  43. </script>

jacascript DOM节点——节点获取与选择器API的更多相关文章

  1. webAPI(DOM) 2.1 获取页面元素 | 事件1 | 属性操作 | 节点 | 创建元素 | 事件2

    js分三个部分: ECMAScript标准:js的基本语法 DOM:Ducument Object Model--->文档对象模型--->操作页面的元素 BOM:Browser Objec ...

  2. jacascript DOM节点——元素节点、属性节点、文本节点

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! DOM节点的三个种类:元素节点.文本节点.属性节点: 元素节点 元素节点就是 HTML 标签元素,元素节点 ...

  3. 自定义属性,innerHTML,outerHTML,dom节点的获取,className,tagName,更改或者是获取css属性

    01.自定义属性 1.自定义属性: 作用:保存数据 通用的自定义属性的前缀 data-属性="属性值" 注:自定义的属性不能通过 元素.属性 取属性值 ,需使用getAttribu ...

  4. jacascript DOM节点——节点关系与操作

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 节点关系 DOM可以将任何HTML描绘成一个由多层节点构成的结构.每个节点都拥有各自的特点.数据和方法,也 ...

  5. javascript总结34 :DOM之节点元素获取

    常用节点元素获取: 1. 获取 html -- > document.documentElement 2. 获取 body -- > document.body 3. 获取指定的元素 -- ...

  6. 简述HTML DOM及其节点分类

    在JavaScript中,document这个对象大家一定很熟悉,哪怕是刚刚开始学习的新人,也会很快接触到这个对象.而document对象不仅仅是一个普通的JavaScript内置对象,它还是一个巨大 ...

  7. dom操作节点之常用方法

    DOM:获取节点:{1. document.getElementById (元素id):通过元素id找到节点2. document.getElementsByClassName (元素类名classN ...

  8. DOM之节点操作

    DOM提供了很多实用的API,这些API让我们可以轻松的访问HTML文档.所谓API(应用程序接口),简单来说,就是让我们可以直接使用它访问程序的一些属性或方法,而不用了解程序内部的运作过程和原理. ...

  9. DOM操作节点对象集合

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

随机推荐

  1. python为运维人员打造一个监控脚本

    0x00前言: 一直想写一个监控方面的脚本,然后想到了运维这方面的 后来就写了个脚本. 0x001准备: psutil模块 0x02正文: import os import time import r ...

  2. 笔记:MyBatis Mapper XML文件详解 - 映射和参数

    MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...

  3. MyBatis动态SQL小结

    6:用于实现动态sql的元素及其用法 if+set--完成更新操作 if+where --完成多条件查询 if+完成多条件查询(替代where)或完成更新操作(替代set) choose(when,o ...

  4. VC++开发AutoCAD 2018/objectARX 用向导新建项目无法新建的问题

    话说笔者最近想用新机子上装的AutoCAD ObjectARX 2018来进行二次开发,兴致勃勃安装了ARX API和向导, 然后打开VS2015,新建项目,无法新建. 折腾了一下,还是没有解决,后面 ...

  5. RTMP规范协议

    本文参照rtmp协议英文版,进行简单的协议分析 1.什么是RTMP 关于 Adobe 的实时消息协议(Real Time Messaging Protocol,RTMP),是一种多媒体的复用和分组的应 ...

  6. C语言博客作业--函数 陈张鑫

    一.PTA实验作业 题目1:6-3 使用函数判断完全平方数 1. 本题PTA提交列表 2. 设计思路 1.定义int IsSquare( int n )函数 2.判断(sqrt(n)是否为整数 3., ...

  7. 解决flask的端口占用

    问题:socket.error: [Errno 48] Address already in use 在编辑flask代码时,如果没有关闭flask的程序,默认的5000端口一直被占用. 再次运行fl ...

  8. Ubuntu登陆密码忘记

    在VMware中安装了Ubuntu 10.04,经过了一段时间,再次登录的时候居然进不去了, 一开始不知道怎样在虚拟机中进入到Grub启动界面,网上搜索了一番,按照以下步骤重新为用户设定了新密码. 重 ...

  9. 201621123043 《Java程序设计》第2周学习总结

    1.本周学习总结 使用jdk文档查阅函数功能及代码 用switch语句是在每个case中可能在第一行是sc.nextLine;来给回车赋值: 在使用循环的时候要注意循环返回的条件,否则陷入死循环可能会 ...

  10. vue mint-ui 三级地址联动

    我也是第一次写这种地址联动的 刚开始的时候 我还以为直接用select来写 后来公司的ios告知并不是这样的 他说应该时这样的 于是第一想法 赶紧找插件吧 但是找了一会未果  就问了公司大神 他刚开始 ...