学习前端的第二十九天——DOM文档对象模型

昨天学习了BOM,今天学习DOM和事件,不过在讲之前得先说说js选择器



一、js选择器

  • document.getElementById() 通过id名称获取元素 具有唯一性
  • document.getElementsByTagName() 通过标记名称获取元素,获取的是一个伪数组
  • document.getElementsByClassName() 通过class类名获取元素,获取的是一个伪数组
  • document.getElementsByName()通过标记的name属性的属性值获取元素,获取的是一个伪数组
  • document.querySelector()通过css选择器获取元素,获取的是一个伪数组
    document.querySelectorAll();通过css选择器获取所有元素


二、DOM

介绍:

  1. DOM Document Object Model ,文档对象模型。我们可以把网页中的所有“东西”看成是“对象”。
  2. DOM是W3C制定的网页标准或规则,而这个标准,在浏览器中,以“对象”的形式得以实现。
  3. DOM的官方定义:DOM可以使脚本,动态的访问或操作,网页的内容、网页外观、网页结构。

分类:

  1. 核心DOM:提供了同时操作HTML文档和XML文档的公共的属性和方法。
  2. HTML DOM:针对HTML文档提供的专用的属性方法。
  3. XML DOM:针对XML文档提供的专用的属性和方法。(了解)
  4. CSS DOM:提供了操作CSS的属性和方法。
  5. Event DOM:事件对象模型。如:onclick、 onload等。
  6. DOM树(tree):JS里面把标记以树型的结构描述的

核心DOM的操作:

1、认识DOM中元素节点类型:

  • document文档节点,代表整个网页,不代表任何HTML标记。但它是html节点的父节点
  • element元素节点,指任何HTML标记。每一个HTML标记就称一个“元素节点”。它可以有文本节点和属性节点
  • attribute属性节点。指HTML标记的属性
  • comment注释节点。
  • text节点。是节点树的最底节点
  • 名称问题:
    a、在html里面叫做标记、标签
    b、在css里面叫做元素、父元素、子元素
    c、在js里面叫做节点

2、DOM中访问节点:

  • js里面不需要通过选择器获取直接可以拿到的标记
    document对象 — 网页
    document.documentElement — html
    document.body — body
    document.head — head
    document.title — title
  • 以下的方法获取到所有类型的节点,包含空白文本节点
  • firstChild:第1个子节点
  • lastChild:最后1个子节点
  • childNodes:子节点列表,是一个数组 childNodes[0]
  • parentNode:父节点
  • nodeName:节点名称 返回标签名
  • nodeValue: 属性节点的的属性值
  • nodeType: 节点类型,返回值是数字
    注意:如果节点是元素节点,则 nodeType 属性将返回 1,noneName返回名称以大写形式表示。属性节点将返回 2。返回3是文本节点。返回8是注释节点
  • 以下的方法不会返回空表文本节点
  • firstElementChild: 获取当前元素节点的第一个元素子节点
  • lastElementChild: 获取当前元素节点的最后一个元素子节
  • previousElementSibling: 查找当前元素的上一个元素
  • nextElementSibling: 查找当前元素的下一个元素 都是兄弟关系
  • parentNode: 获取当前节点的父元素
  • children: 获取所有的子节点 不返回其他节点

3、对节点的属性操作:

  • setAttribute(name,value):给某个节点添加一个属性
  • getAttribute(name):获取某个节点属性的值
  • getAttributeNode(name):获取某个节点属性和属性值
  • removeAttribute(name):删除某个节点的属性

4、创建节点

  • 创建节点(元素) 参数直接是创建节点的名称,不需要设置尖括号
  • document.createElement(tagName):创建节点
  • appendChild(被追加节点):将节点追加到其他节点下
  • insertBefore(前面节点,后面节点) :可在已有的子节点前插入一个新的子节

5、删除节点

  • removeChild(name):删除子元素
  • remove():删除当前元素
  • parentNode.remove():通过子元素删除父元素

DOM尺寸:

  • box.style.width:内联中的宽
    box.style.height:内联中的高
    注意:只能获取内联的样式
  • box.clientWidth
    box.clientHeight
    注意:返回元素大小,但没有单位,默认为px,如果为其他单位,会自动转换成px。获取内联和其他的样式,获取的宽度和高度包含padding
  • box.clientLeft:获取左边框宽度
    box.clientTop :获取上边框宽度
  • box.scrollHeight:获取滚动的高度
    box.scrollWidth:获取滚动的宽度
  • box.offsetWidth
    box.offsetHeight
    注意:包含边框还有padding,最稳定,使用最频繁
  • offsetLeft : 元素距离自身左边的距离 需要定位做参照
    offsetTop:元素距离自身上边的距离
    offsetParent: 有定位元素的父级
    注意:如果父元素没有定位,参照的就是自己距离左边的位置,如果有定位参照的就是自己距离父元素左边的位置
获取元素

//参数1表示要获取样式的元素  参数2表示伪对象
console.log(getComputedStyle(obj, null).attr);

//只有IE浏览器支持,其他浏览器都不支持
console.log(obj.currentStyle.attr);

处理兼容问题:
function getStyle(obj, attr){
    
    
   //因为IE浏览器是不识别getComputeStyle方法的,设置了window后IE会识别window不会报错
   if(window.getComputedStyle){
    
    
       return getComputedStyle(obj, null)[attr];
   }else{
    
    
       return ele.currentStyle[attr];
   }
}

this对象:

  • 函数圆括号 调用时,函数的this是window对象
    注意: 在严格模式下,‘use strict’,函数名() 调用函数,this无法指向window
  • 函数作为一个对象的方法,对象点 调用,函数的this就是这个对象
  • 函数是事件处理函数时,函数的this就是触发这个this的对象 —— 事件调用者
  • 定时器调用函数时,this是window对象
  • 数组中存放的函数,被数组索引之后加圆括号调用,this就是这个数组


三、事件

1、事件触发:

  • 内联模型 : 这种模型是最传统简单的一种处理事件的方法。在内联模型中,事件处理函数是 HTML 标签的一个属性,用于处理指定事件。虽然内联在早期使用较多,但它是和 HTML 混写的, 并没有与 HTML 分离。违反了W3C制定的HTML 与 JavaScript 代码层次分离的原则
  • 脚本模型:为了解决内联模型的问题,使我们可以在 JavaScript 中处理事件。这种处理方式就是脚本模型。

2、鼠标事件:

  • onclick:当用户单击鼠标按钮或按下回车键时触发
  • ondblclick:当用户双击主鼠标按钮时触发 - 连续点击两次
  • onmousedown:当用户按下了鼠标还未弹起时触发 - 弹窗测试最明显
  • onmouseup:当用户释放鼠标按钮时触发 - 鼠标抬起
  • onmouseover:当鼠标移到某个元素上方时触发
  • onmouseout:当鼠标移出某个元素上方时触发
  • onmousemove:当鼠标指针在元素上移动时触发

3、键盘事件:

  • onkeydown:当用户按下键盘上任意键触发,如果按住不放,会重复触发
  • onkeyup:当用户释放键盘上的键触发 - 当按键抬起时触发
  • onkeypress:当用户按下键盘上的字符键触发,如果按住不放,会重复触发 不能触发 例如:ALT, CTRL, SHIFT, ESC — 不是字符键
  • 不属于键盘事件 — 属于事件对象
    keyCode 返回当前按键的ASCII码 ,得知按下的键盘上的哪个键, 要配合事件对象来使用。可以判断哪个键被按下
 var box = document.querySelector('div');
//使div根据不同的方向键向不同的位置移动
onkeydown = function(e){
    
    
    //左37 右39  上38  下40
    //console.log(e.keyCode);
    var speed = 10;
    //组合键:altKey、ctrlKey、shiftKey
    if(e.ctrlKey){
    
    
        speed = 100;
    }
    switch(e.keyCode){
    
    
        case 39 :
            box.style.left = box.offsetLeft + speed + 'px';
            break;
        case 37 :
            box.style.left = box.offsetLeft - speed + 'px';
            break;
        case 38 :
            box.style.top = box.offsetTop - speed + 'px';
            break;
        case 40 :
            box.style.top = box.offsetTop + speed + 'px';
            break;
    }
}

4、html事件:

  • onload:当页面完全加载后在 window 上面触发,或当框架集加载完毕后在框架集上触发
  • onselect:当用户选中文本框(input 或 textarea)中的一个或多个字符触发
  • onselectstart:主要是用于禁止用户选中网页中的文字的默认行为
  • onchange:当用户改变文本框(input 或 textarea)内容时且失去焦点后触发
  • onfocus:当页面或者元素获得焦点时触发
  • onblur:当页面或元素失去焦点时触发
  • onsubmit:当用户点击提交按钮在元素上触发
  • onresize:当窗口或框架的大小变化时在 window 或框架上触发
  • scroll:当用户滚动带滚动条的元素时触发
  • oncontextmenu 事件在元素中用户右击鼠标时触发并打开上下文菜单。

5、事件对象

  • 事件对象(event):当事件发生的时候,事件会提供一个对象,让你使用。这个对象里保存了很多有用的属性和方法
  • 特征:
    1.只有当事件发生的时候才会产生,只能在处理函数内部访问
    2.处理函数运行结束后自动销毁
键盘按下事件的兼容写法

onkeydown = function(e){
    
    
	e = e || window.event;
	console.log(e.keyCode)
}

6、鼠标坐标:

  • clientX: 鼠标的横坐标
  • clientY: 鼠标的纵坐标
  • pageX: 鼠标的横坐标,包含网页横向卷去的距离
  • pageY: 鼠标的纵坐标,包含网页向上卷去的距离
实现js的简单拖拽效果

<style>
    *{
     
     
        margin: 0;
        padding: 0;
    }
    html, body{
     
     
        height: 100%;
    }
    div{
     
     
        width: 200px;
        height: 200px;
        background-color: yellow;
        position: absolute;
    }
</style>
<div></div>
<script>
     //获取元素
     var box = document.querySelector('div');
     
     /*
         拖拽的思路:
         + 当鼠标按下时,让div标记进行移动
         + 事件:onmousedown、onmousemove
         + 获取鼠标的坐标,然后把值赋值给div的left和top
         + 当鼠标抬起时清除移动事件
         
         问题:
         + 问题描述当鼠标按下时进行移动时,鼠标坐标在赋值的时候,会把每次把盒子移动到原点0 0(左上)
         + 解决方案:当鼠标按下的时候就确定鼠标的坐标位置
     */
     
     //给div绑定移动事件
     box.onmousedown = function(e){
     
     
     
         //事件对象兼容
         e = e || window.event;
         
         //求出需要从鼠标坐标上减去的距离
         var l = e.clientX - box.offsetLeft;
         var t = e.clientY - box.offsetTop;
         console.log(l, t)
         
         //鼠标移动事件
         document.onmousemove = function(e){
     
     
         
             //事件对象兼容
             e = e || window.event;
             var x = e.clientX - l;
             var y = e.clientY - t;
          
             //边界值判断
             if(x<0){
     
     
                 x = 0;
             }else if(x>=document.documentElement.offsetWidth - box.offsetWidth){
     
     
                 x = document.documentElement.offsetWidth - box.offsetWidth;
             }
             if(y<0){
     
     
                 y = 0;
             }else if(y>=document.documentElement.offsetHeight - box.offsetHeight){
     
     
                 y = document.documentElement.offsetHeight - box.offsetHeight;
             }
             
             //把获取的鼠标坐标赋值给div标记
             box.style.left = x + 'px';
             box.style.top = y + 'px';
         }
         
         //鼠标抬起时清除鼠标移动事件
         document.onmouseup = function(){
     
     
             document.onmousemove = null;
         }
     }
</script>



这几天学得东西突然多起来,整理笔记还不一定能消化,还是得多加练习才行

猜你喜欢

转载自blog.csdn.net/Robergean/article/details/118330841