当前位置: 首页 > news >正文

JavaScript篇.day08-DOM,节点,事件,定时器,位置及坐标

目录

1.DOM

2.DOM相关操作

(1)获取元素

(2)操作元素

(3)操作元素属性

(4)操作元素类名

(5)操作元素样式

3.节点操作

4.事件

5.事件传播

6.定时器

7.位置及坐标


1.DOM

  • Document Object Model 文档对象模型
  • 一整套操作文档流相关内容的属性和方法
  • 可以做的操作: 修改样式  修改属性  改变位置 添加事件

2.DOM相关操作

(1)获取元素

  • 通过id获取 document.getElementById('id名')
  • 通过类名获取: document.getElementsByClassName('类名') 获取到是一个数组
  • 通过标签类型获取: document.getElementsByTagName('标签名)
  • 通过选择器获取:  一个: document.querySelector('选择器')   多个:querySelectorAll (获取到是一个数组)

(2)操作元素

  • 文本内容(标签中的内容): innerText
  • 超文本内容(包含标签): innerHTML

(3)操作元素属性

  • 获取原生属性:    e.g:可直接获取 id, 但name和class不可(保留字)
  • 获取自定义属性:   getAttribute('属性名')
  • 设置自定义属性: setAttribute('属性名', '属性值')
  • 移除自定义属性: removeAttribute('属性名')
  • H5自定义属性(data-属性名)获取: dataset.属性名/ dataset['属性名']  多个-连接使用小驼峰式命名规则取

(4)操作元素类名

  • 修改:  ele.className = '修改后类名'
  • 移除: ele.className = ""

(5)操作元素样式

  • 获取行内样式: ele.style.样式名 (小驼峰)
  • 修改行内样式: ele.style.样式名 (小驼峰) = '修改后的值'   (行内样式优先级最高)
  • 获取非行内样式: window.getComputedStyle(ele).样式名(小驼峰)
<ul>
    <li id="apple" class="qqqq">apple</li>
    <li class="orange">orange1</li>
    <li class="orange">orange2</li>
    <li>pear</li>
    <li id="peach" class="peach">peach</li>
  </ul>
  <ol >
    <li class="oli">ollll</li>
  </ol>
  <div class="div1" style="background-color: antiquewhite;">div1</div>
  <div id="divId2" class="divCls2" style="background-color: antiquewhite;">div2</div>
  <div id="divId3"  data-index="index3"  data-list-name="divList"  class="" style="background-color: antiquewhite;">div2</div>
  <script>
    /* DOM  Document Object Model 文档对象模型
        一整套操作文档流相关内容的属性和方法
        可以做的操作: 修改样式  修改属性  改变位置 添加事件
    */
    // DOM操作步骤
    // 1. 获取元素
    // (1)通过id获取, id唯一   document.getElementById('ID名')
    var eleApple = document.getElementById('apple')
    console.log(eleApple);  //<li id="apple">...</li>
    // (2)通过class类名获取, 可获取一类   document.getElementsByClassName('类名')  返回数组
    var elesOrange = document.getElementsByClassName('orange')   
    console.log(elesOrange);  //HTMLCollection(2) [li.orange, li.orange]zi
    // (3)通过标签名获取 document.getElementsByTagName('标签')  返回数组
    var elesLi = document.getElementsByTagName('li')
    console.log(elesLi);  //HTMLCollection(5) [li#apple, li.orange, li.orange, li, li, apple: li#apple]
    // (4)通过选择器获取  获取到第一个document.querySelector('选择器')    获取到所有该选择元素document.querySelectorAll('选择器')
    var elesSel = document.querySelector('li.orange')
    console.log(elesSel);
    var elesSelAll = document.querySelectorAll('ul li')
    console.log(elesSelAll);

    // 2. 操作元素
    // (1) 操作文本内容(标签中文本内容)  innerText
    eleApple.innerText = '苹果'
    // (2) 操作超文本内容(标签及文本内容)
    var div1 = document.getElementsByClassName('div1')
    div1[0].innerHTML = "<a href='#'>111div111</a>"   //类名获取元素, 返回数组, 故div1[0]

    // 3. 操作元素属性
    // (1) 获取原生属性  可直接获取 id     但name和class不可
    var div2 = document.getElementById('divId2')
    console.log(div2.id);   // divId2
    // (2) 获取自定义属性  getAttribute('属性名')
    console.log(div2.getAttribute('class'));  //divCls2
    // (3) 设置自定义属性 setAttribute('属性名', '属性值')
    div2.setAttribute('class','div2222');
    console.log(div2.className);  //div2222
    // (4) 移除自定义属性 removeAttribute('属性名')
    div2.removeAttribute('class')
    console.log(div2.className); // <empty string> 空字符串
    // (5) H5新增  自定义属性    data-开头的属性名    dataset.  / dataset[' ']   ie11才开始支持
    var div3 = document.getElementById('divId3')
    console.log(div3.dataset.index);  // index3
    console.log(div3.dataset['index']); // index3
    console.log(div3.dataset.listName); // divList     多个-连接的属性名, 获取时采用小驼峰式命名规则
    
    // 4. 操作元素类名 className
    var peach = document.getElementById('peach')
    // (1) 修改元素类名
    peach.className = 'peach_className'
    // (2) 移除元素类名
    peach.className = ""   //  标签显示 class=""

    // 5. 操作元素样式
    // (1) 操作行内样式
    //  获取样式
    console.log(div2.style.backgroundColor);  //antiquewhite
    //  修改样式
    console.log(div2.style.backgroundColor = 'blue');  //blue
    // (2) 获取非行内样式
    console.log(window.getComputedStyle(div2).fontSize);   //20px
  </script>

3.节点操作

  • 创建节点: createElement(' ')
  • 追加节点: appendChild(ele)
  • 添加至指定节点之前: 父.insertBefore('子')
  • 移除子节点: removeChild(ele)
  • 移除本节点: remove()
  • 克隆节点: cloneNode()  默认false(只克隆该节点), true包含所有子节点
<ul>
    <li>我是原生第1个li</li>
    <li class="pre">我是原生第2个li------className:pre  </li>
  </ul>
  <script>
    var ulEle = document.querySelector('ul')
    var preLi = document.getElementsByClassName('pre')[0]   

    // 操作节点
    // 1. 创建节点   createElement
    var li1 = document.createElement('li')
    // 设置属性
    li1.setAttribute('id','myLi')
    li1.innerText = '我是创建的节点------myLi1---追加的'

    // 2. 追加节点   appendChild()
    ulEle.appendChild(li1)

    // 3. 在某个节点的子节点前添加   insertBefore()  将一个节点添加到父节点的指定子节点前面
    var li2 = document.createElement('li')
    li2.innerText = '我是创建的节点------myLi2---添加到指定节点之前的'
    ulEle.insertBefore(li2,ulEle.children[0])

    // 5. 移除子节点   removeChild()      remove()移除节点本身
    ulEle.removeChild(li1)
    li2.remove()
    // 6. 克隆节点   cloneNode(true)  true:所有子节点都克隆, false只克隆该节点本身,不可隆子节点
    var ulEle2 = ulEle.cloneNode(true)
    console.log(ulEle2);
  </script>

4.事件

事件: 用户触发指定行为(代码与页面内容的一个约定)

事件绑定三要素:

  • 事件源(谁):  和谁绑定,
  • 事件类型:  约定一个行为
  • 事件处理函数:  触发行为时,执行的代码

语法:

  •  方式1: 事件源上添加事件类型   <button οnclick="事件处理函数"></button>
  • 方式2: 获取事件源后,再绑定事件    btn.on事件名 = function(){ }
  • 方式3: 获取事件源后,再事件监听  btn.addEventLister('事件名', function(){ }, )

事件对象(e/event): 浏览器记录 , 当事件触发时, 一个描述该事件信息的对象数据类型

    var btn = document.querySelector('button')
    btn.addEventListener('click',clickMe(e))
    function clickMe(e){
      console.log(e);
    }

5.事件传播

三个阶段:

  • 捕获阶段: 沿DOM树从上往下 e.g:window ->document-> html -> body -> div.father -> div.son -> btn
  • 目标阶段: 目标盒子
  • 冒泡阶段: 沿DOM树从下往上 e.g: btn -> div.son ->  div.father ->  body ->  html -> document-> window

阻止冒泡: e.stopPropagation()

事件委托: e.target对象, 自身不做事件处理,交给父级来做

  <div class="father">
    <div class="son">
      <button class="btn">点点点</button>
    </div>
  </div>
  <script>
    var father = document.querySelector('.father')
    var son = document.querySelector('.son')
    var btn = document.querySelector('.btn')
    // 事件委托   将btn的工作委托给父级son
    son.onclick = function(e){
      e.stopPropagation()  // 阻止冒泡, 否则点击btn会弹出father
      if(e.target.className === 'btn'){ 
        alert('btn1')
      }
    }
    father.onclick = function(e){
        alert('father')
    }
  </script>

6.定时器

  • setInterval(函数, 毫秒数)    每隔多少毫秒执行一次(重复执行)
  • setTimeout(函数, 毫秒数)     隔多少秒后执行一次  (只执行一次)
  • clearInterval(定时器)    清除定时器
    window.setInterval(function(){
      console.log('1');
    },1000)
  
    var time2 = window.setTimeout(function(){
      console.log('2');
    },2000)
    // 清除定时器
    window.clearInterval(time2)

7.位置及坐标

 <!-- div {  margin: 400px; padding: 20px; width: 100px; height: 100px; border: 20px solid rgb(250, 131, 131); background-color: rgb(246, 186, 186); } -->
    <div></div>
    <script>
      var div = document.querySelector('div')
      // BOM中
      // 获取可视区域宽/高  window.innerWidth / window.innerHeight
      console.log(window.innerWidth)
      console.log(window.innerHeight)
      // 获取卷去的宽/高  document.documentElement.scrollTop || document.body.scrollTop

      // DOM中
      // 获取元素尺寸
      // offsetHeight / offsetWidth (元素内容 + padding + border)相当于IE模型
      console.log(div.offsetHeight) // 180
      console.log(div.offsetWidth) //  180
      // clientHeight / clientWidth    (元素内容 + padding)
      console.log(div.clientHeight) // 140
      console.log(div.clientWidth) // 140
      console.log(div.clientLeft) // 20    内容距离左边的尺寸
      console.log(div.clientTop) // 20     内容距离上边的尺寸

      // 事件对象内部信息
      // 鼠标事件    e事件对象
      div.onclick = function (e) {  
        // offsetX / offsetY   鼠标相对于触发事件元素的偏移量
        console.log(e.offsetX)
        // clientX / clientY   鼠标相对于浏览器可视窗口的偏移量  即使有滚动条,也是相对于可视窗口
        console.log(e.clientX)
        // pageX / pageY  鼠标相对于文档流的偏移量
        console.log(e.pageX)
        // screenX / screenY  鼠标相对于电脑屏幕的偏移量
        console.log(e.screenX)
      }

PreviousNotes:

JS.2-DOM,事件高级_Mteee.的博客-CSDN博客

相关文章:

  • QML教程(七) JavaScript
  • 蓝桥杯寒假集训第四天(全球变暖DFS)
  • VScode中不同目录间python库函数的调用
  • C语言版扫雷——从0到1实现扫雷小游戏
  • 机器学习笔记 - 模式识别之图像特征提取和特征选择的基本方法总结
  • APP应用渗透测试思路
  • 微信小程序框架
  • 网络编程 udp/ip协议 c/s模型
  • 【数据结构】C语言实现链表(单链表部分)
  • JAVA练习8
  • 聊聊最适合程序员的画图工具
  • JAVA数据结构篇--12理解LinkedHashSetTreeSet
  • DR_CAN基尔霍夫电路题解法【自留用】
  • 21级数据结构考前模拟题
  • 剑指offer----C语言版----第六天
  • 【个人向】《HTTP图解》阅后小结
  • CSS相对定位
  • fetch 从初识到应用
  • Javascript 原型链
  • Java超时控制的实现
  • JAVA之继承和多态
  • Js基础知识(四) - js运行原理与机制
  • js中的正则表达式入门
  • Node项目之评分系统(二)- 数据库设计
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Redux系列x:源码分析
  • spring boot下thymeleaf全局静态变量配置
  • windows-nginx-https-本地配置
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 微信小程序开发问题汇总
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​ArcGIS Pro 如何批量删除字段
  • ​如何防止网络攻击?
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $GOPATH/go.mod exists but should not goland
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)Knockout 创建自定义绑定
  • (转载)虚函数剖析
  • ***通过什么方式***网吧
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 中的轻量级线程安全
  • .net反编译的九款神器
  • .net经典笔试题
  • .NET中winform传递参数至Url并获得返回值或文件
  • @PreAuthorize注解