1、什么是DOM:Document Object Model - 文档对象模型 将每一个标签/元素/属性/文本/注释,看作了是一个DOM节点/元素/对象(提供了一些属性和方法)
面试题:HTML/XHTML/DHTML/XML分别是什么?
HTML - 网页
XHTML - 更严格的网页
DHTML - 动态的网页:D:Dynamic,其实并不是新技术、新概念。将现有技术整合的一个统称,是我们的网页在离线状态依然具有动态效果
DHTML=HTML+CSS+JS(DOM)
XML - 数据格式
DOM:原本是可以操作一切结构化文档的 HTML 和 XML,后来为了方便各类开发者分为了3部分:
1、核心DOM:【无敌】,既可以操作HTML 又可以操作XML
缺点:API比较繁琐
2、HTML DOM:只能操作 HTML,API简单,缺点:比如属性部分,只能访问/设置标准属性,不能操作自定义属性
3、XML DOM:只能操作 XML,被淘汰了,现在市场上最流行的数据格式是:JSON
开发建议:优先使用HTML DOM,HTML DOM满足不了再用核心DOM进行补充
2、DOM树:树根:document对象 - 不需要我们创建,一个页面只有一个document对象,由浏览器的js解释器自动生成 可以通过数据跟找到每一个DOM节点/元素/对象,提供了很多API
3、每个DOM元素都有三大属性: 1、xx.nodeType:描述节点的类型 document节点:9 element节点:1 attribute节点:2 text节点:3
以前有用:判断xx是不是一个页面元素 - 因为以前我们找元素的方式和大家现在的不一样
2、xx.nodeValue:属性节点的值,说白了就是获取属性值
以前有用
3、***xx.nodeName:节点的名称 - 判断xx是什么标签
注意:返回的是一个全大写的标签名
今日唯一的目标:找元素 1、*通过 关系 获取元素: 父:elem.parentNode; 子:elem.children; - 集合:只能找到儿子,不能找到后代 第一个儿子:elem.firstElementChild; 最后一个儿子:elem.lastElementChild; 前一个兄弟:elem.previousElementSibling; 后一个兄弟:elem.nextElementSibling;
2、*****递归:简单来说就是函数中又一次调用了函数自己,迟早有一天会停下来 何时使用:专门用于遍历层级不明确的情况:既可以遍历层级不明确的DOM,也可以遍历层级不明确的数据 如何使用:2步 function 函数名(root){ 1、第一层你要做什么操作直接做
2、判断它有没有下一级,如果有下一级再次调用此函数,只不过传入的实参是他的下一级
}
函数名(根节点)
算法:深度优先!优先遍历当前节点的子节点,子节点遍历完才会跳到兄弟节点
缺点:同时开启大量的函数调用,浪费的内存,只有一个情况才用:【遍历层级不明确】
递归 vs 纯循环
递归:优点:直观、易用
缺点:性能较低
纯循环:优点:性能高,几乎不占用内存
缺点:难度极大
3、遍历层级不明的API:TreeWalker - 一个再DOM树上行走的人 缺陷:1、自动跳过根节点 2、只能遍历层级不明确的DOM树 如何使用: 固定公式: 1、创建tw: var tw=document.createTreeWalker(根元素,NodeFilter.SHOW_ELEMENT);
2、反复调用nextNode方法找到每一个元素
while((node=tw.nextNode())!=null){
node要干什么;
}
4、*API直接查找元素: 1、通过HTML的一些特点找元素 TagName/ClassName/Name:var elems=document.getElementsByTagName/ClassName/Name("标签名/class名/name名"); 建议:表单控件元素input可以不写class,因为必写name
2、通过css选择器去获取元素:
1、单个元素:var elem=document.querySelector("任意css选择器");
强调:万一选择器匹配到多个,只会返回第一个,没找到返回null
2、多个元素:var elems=document.querySelectorAll("任意css选择器");
强调:找打了返回集合,没找到返回空集合
更适合做复杂查找
面试题:getXXX 和 queryXXX 有什么区别?
返回结果不同:
1、getXXX -> HTMLCollection 动态集合
2、queryXXX -> NodeList 静态集合
动态集合 vs 静态集合
动态集合:根据DOM树的改变,动态集合也会一起跟着变化,悄悄再次查找页面元素
缺点:每次都会悄悄重新查找,效率较低了,而且不能使用forEach
静态集合:不会根据DOM树的改变,变化我们的静态集合
优点:每次都不会悄悄重新查找,效率较高了,而且能使用forEach
总结:我们目前找元素的方式: 1、直接查找元素:getXXX、queryXXX 2、通过关系找元素 3、层级不明确才用递归
作业: 1、上午的练习 2、遍历层级不明确的数据,将就用我的数据也可以,拿到每个人的名字 3、作业1.html 和 作业2.html(两种做法:1、只能打开一个,且再次点击不能关闭 2、可以打开多个,再次点击就关闭) 4、安排:明天讲完02和03,明天的作业难得很,星期五不讲任何新内容,评讲作业