关于前端Dom的总结

  • 简介

  DOM (Document Object Model) 文档对象模型

  DOM思想使用节点树(node tree)的概念来描述一个HTML页面,页面中的每一个元素、属性、文本都被认为是节点。此外,DOM还定义了一系列编程接口(DOM   API),用来操作页面的任意一部分内容

  在 js + DOM编程中,一般的编程思路是这样的:由js基本语法控制程序的执行逻辑,由DOM API进行元素的查找获取,进而再对元素进行增删改等操作

  • 节点树
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title></title>
</head>
<body>
    <a href="http://www.baidu.com">百度一下</a>
</body>
</html>

 

  • 节点类型

  HTML页面中的主要节点有四种:文档节点、元素节点、属性节点、文本节点

  DOM  API提供了一个Node父接口表示任意类型的节点,同时提供了两个子接口:Document、Element分别表示整个文档和元素节点(当然,还提供了其他类型的子接口,如DocumentType、Attr、Text等)

  • document对象

  document对象是window对象的一个属性

  document对象表示整个HTML页面,是DOM的核心对象

  document对象是连接JavaScript和DOM的桥梁,使得我们可以在JavaScript环境中操作页面内容

  document对象提供了查找获取元素节点的方法,所以document是DOM的编程入口,此外还提供了创建新节点的方法

  •  document获取元素

  document对象提供了3个方法来查找获取想要的元素对象:

方法名

返回值

描述

getElementById(string) 

Element

根据元素的id属性值获取元素

getElementsByTagName(string)

NodeList

根据元素的标签名获取元素

getElementsByName(string)

NodeList

根据元素的name属性值获取元素

  NodeList操作

  获取NodeList中包含的元素个数    nodeList.length

  获取指定索引位置的元素nodeList.item(index)

  注意:NodeList是动态更新的,即如果删除的元素也在NodeList里面,那么也同时从NodeList里面删除

  • document操作元素

  创建元素、添加元素

  document.createElement(tagName)      根据元素标签名称创建元素节点

  appendChild(node)   添加子节点

  注:如果一个元素原本就在页面中,appendChild会先把元素从原来的父元素删除,再追加到新的父元素中(因为要添加的那个节点不一定是新创建的,可能是获取到页面中的一个节点)

  • Element操作元素属性

  直接使用element.attrName的方式操作属性值

  以下方式只能操作HTML标准规定的属性,不能操作自定义属性

  var  attrValue = element.attrName;//获取属性值

  element.attrName =  attrValue;//给属性赋值

  element.className;//获取和设置元素的class属性的值。因为class是关键字,所以操作class属性时使用className代替

  在js中,操作checkbox、radio的checked属性,select的selected属性值时,使用true或false , 表单元素的disabled属性也是如此

  通过方法操作属性

  Element提供了3个方法来操作属性,而且可操作自定义属性

  String  getAttribute(String  attrName) 获得属性值

  void  removeAttribute(String  attrName) 删除指定属性

  void  setAttribute(String  attrName, String  attrValue)   修改/添加属性

  • Element操作元素的子节点

  子节点包括子元素和元素文本内容

  element.getElementsByTagName()     根据子元素的标签名获取子元素

  element.innerHTML         以字符串形式操作子节点

  element.insertBefore(newNode,  node)    在指定子节点前插入新子节点

  element.appendChild(newNode)    在最后追加子节点

  element.parentNode  获取元素的父元素

  也可以使用element.innerText (IE、chrome)或者element.textContent(火狐)操作元素的文本内容(文本内容可以写成html代码字符串),但有浏览器兼容问题。

  • Element操作元素样式

  使用 element.style.propName 的方式可以直接操作某个样式属性。如:element.style.backgroundColor="gray";

  使用DOM和CSS操作元素样式的名称使用对比如下图

  • 删除元素内容

  element.removeChild(node);   删除子节点

  element.attrName  = null;    删除属性

  element.innerHTML = null;  删除文本内容和子元素

  • DOM事件机制

  通常的,当浏览器状态改变、用户操作时都会触发一些事件。如用户点击了一个按钮,就触发了按钮的点击事件,按钮称为事件源。

  当一个事件被触发时,浏览器就会创建一个event事件对象,这个事件对象包含和此事件相关的各种信息,如点击事件的事件对象包含点击位置的信息,可供编程人员使用。

  如果希望当一个事件发生时针对这个事件做一些处理,就需要给该事件注册一个事件处理函数,当该事件真的发生时,该处理函数就会被浏览器自动调用

  常见的事件有以下几类:窗体事件、鼠标事件、键盘事件、焦点事件等

  页面加载完成事件

  操作页面元素的js代码一定要写到页面加载完成里面,否则可能会因为没有加载完成导致元素取不到。如下是事件的基本用法:

<script type="text/javascript">
        window.onload=function(){
            //只有页面加载完成,才可确保id为div01的元素被获取到
            var element = document.getElementById("div01");
            alert(element);
        }
</script>

  注意:load是事件的名称,onload是元素的属性,用来给元素注册事件处理函数

  鼠标事件

  click、dblclick                      鼠标单击、双击时触发

  mouseover、mouseout       鼠标指针进入、离开元素时触发

  mousemove                        鼠标指针移动时触发(进入元素后)

  mousedown、mouseup      鼠标按键按下、弹起时触发(进入元素后)

  鼠标事件的event对象包含如下信息:

  button                                      点击的哪个鼠标按键(0、1、2)

  altKey、ctrlKey、shiftKey       点击时是否同时按下键盘的alt、ctrl、shift 键

  clientX、clientY                       鼠标指针的窗口坐标

  screenX 、screenY                 鼠标指针的屏幕坐标

  处理事件的两种方式

  1、通过DOM方式把事件处理函数赋值给事件属性(称为注册事件处理函数)

<script type="text/javascript">
        window.onload=function(){
               var element = document.getElementById("div01");
               element.onclick = function(){
                      alert("点我了");
               }
        }
</script>

  2、直接在HTML元素标签的事件属性上写要执行的代码

<div onclick="alert('点我了');" ></div>

  3、注意:如果有个自定义函数fun1,第一种方式的写法为element.onclick=fun1;而第二种方式的写法为onclick="fun1();"

  • this的使用
function fun1(){
       alert(this);
}

onload = function(){
       var obj = {"fun1":fun1 };//obj.fun1 = fun1;
       var btn = document.getElementById("btn");
       btn.onclick = fun1;
       window.fun1();   //Window
       obj.fun1();      //Object
       btn.onclick();   //HTMLInputElement
}

  说明:如果this在函数fun1内,函数fun1以哪个对象的属性值的身份去执行,this就表示哪个对象。this的这个特性,很多时候非常有用,特别是在DOM的事件处理函数中

  • 给一个事件注册多个事件处理函数

  注册事件处理函数的方式会覆盖直接编写处理代码的方式,而且同时注册的多个处理函数也会发生覆盖,这就导致一个事件发生时我们只能做"一件事情"

  为了可以给一个事件注册多个事件处理函数,DOM提供了另外一种注册方式:

  addEventListener(事件名称,  处理函数);

  同时提供了一个删除处理函数的方法:

  removeEventListener(事件名称, 处理函数);

  也可以使用代码模拟触发一个事件,如btn.onclick();,其实这只是直接调用了事件处理函数

  注意:多次注册同一个函数效果只有一次。如果希望将来可以删除某个注册的处理函数,就应该拿到该处理函数的引用

<script type="text/javascript">
        window.onload=function(){
            document.getElementById("div01").addEventListener("click",function(){
                alert(2);
            })
        }
</script>
  • 事件冒泡

  由于HTML元素可嵌套,就不可避免的出现当用户执行一个动作如点击时,会有多个元素触发点击事件。为了方便管理不至于混乱,DOM提供了事件冒泡机制。

  事件冒泡:当若干嵌套的元素"同时"被触发某个事件时,最内层元素的事件最先被触发,事件依次往外传递。

  如果某刻希望取消该事件的冒泡,可以使用event.stopPropagation()

  • 键盘事件

  keydown       键盘按键被按下

  keyup            键盘按键被弹起

  event事件对象的属性:

  event.keyCode        被按下的按键的整数编码

<script type="text/javascript">
        window.onload=function() {
            document.onkeydown = function () {
                alert(event.keyCode);//获取按下键的整数编码
            }
        }
</script>
  • 取消浏览器的默认动作

  对于某些元素的特点事件,浏览器会有一个默认的动作,如超链接触发点击事件时页面会跳转、表单提交事件被触发时表单数据会被提交到服务器、键盘按下在输入框中输入字符等

  DOM提供了两种方式来取消浏览器的默认动作:在我们自己注册的处理函数中执行 event.preventDefault(); 或者return  false;  

  注意:取消事件的浏览器默认动作和取消事件冒泡是不同的概念

posted on 2019-02-18 18:14  朱*力  阅读(176)  评论(0编辑  收藏  举报

导航