JavaScript BOM与DOM 学习笔记

学习视频链接:黑马程序员JavaScript核心教程,前端基础教程,JS必会的DOM BOM操作_哔哩哔哩_bilibili

代码地址:JavaScript学习相关知识点笔记以及演示案例: Javascript 基础知识点、BOM和DOM相关知识点的案例

目录

1. Web APIs

 2.  DOM

2.1 获取元素

2.1.1   根据ID获取

 2.1.2  根据标签名获取

2.1.3 通过HTML5新增的方法获取 

2.1.4.特殊元素获取

 2.2 事件

2.3  操作元素

2.3.1  修改元素内容 

2.3.2 修改元素属性

 2.3.3 修改表单属性

2.3.4  修改样式属性

2.3.5   操作元素总结

  2.3.6  排他思想(算法)

鼠标事件

2.3.7  自定义属性的操作

 2.3.8  H5 自定义属性

 2.4 节点操作

 2.4.1  节点层级

2.4.2  创建、添加、删除节点

2.4.3  三种动态创建元素区别

2.5  DOM重点核心 (总结)

 2.6  事件高级导读

2.6.1 注册事件

2.6.2  删除事件 

 2.6.3  DOM事件流

2.6.4 事件对象

2.6.5 事件对象的常见属性和方法

2.6.6  鼠标事件

2.6.7  键盘事件

3. BOM浏览器对象模型

3.1 window对象的常见事件

3.1.1  窗口加载事件

3.1.2  调整窗口大小事件

3.2 定时器

3.2.1 两种定时器--- setTimeout()

3.2.2  两种定时器 ---- setInterval()

3.2.3  this

3.3 JS执行队列

 3.3.1  同步和异步

3.4 location 对象

3.4.1 URL

3.4.2  location 对象的属性

3.4.3  location 对象方法

3.5 navigator 对象

​编辑

 3.6 history 对象

4.  PC端网页特效异读

4.1 元素偏移量 offset 系列

4.1.1  offset 概述

4.1.2 offset 和 style

4.2 元素可视区 client系列

4.1.4 立即执行函数

4.3  元素滚动scroll系列

 4.3.1 页面被卷去头部兼容性解决方案

4.4 三大系列总结

4.5 mouseover 和 mouseenter 区别

4.6 动画原理

 4.6.1 简单动画封装

​编辑

 4.6.2 给不同的元素记录不同的定时器

 4.6.3  缓动动画原理​编辑

4.7 节流阀

5. 移动端

5.1 触屏事件

5.1.1 触屏事件概述:

​编辑

 5.1.2 触摸事件对象(TouchEvent)

​编辑

 5.1.3 移动端拖动元素

5.2 移动端常见特效

5.2.1 在移动端click事件300ms演示问题解决方案

5.3 移动端常用开发插件


1. Web APIs

 主要是浏览器

 API 和 Web API :

 2.  DOM

 DOM 树

 DOM把以上内容都看作是对象

2.1 获取元素

获取元素的方法:

1. 根据ID获取  2.根据标签名获取  3. 通过HTML5新增的方法获取  4.特殊元素获取

2.1.1   根据ID获取

 2.1.2  根据标签名获取

 也可以直接指定一个父元素

2.1.3 通过HTML5新增的方法获取 

2.1.4.特殊元素获取

 

 2.2 事件

2.3  操作元素

2.3.1  修改元素内容 

 element.innerText 这个方法不能识别html标签。

在这两个写法中,最常用的是第二种写法。

2.3.2 修改元素属性

可以该表的常见属性

 以轮播图为例:

 2.3.3 修改表单属性

 改变表单中的文字内容,使用 value

禁用某个表单,不能再次点击  使用 disabled

2个新的表单事件   获取焦点onfocus   失去焦点onblur

    <input type="text" value="手机">
    <script>
        // 1.获取元素
        var text = document.querySelector('input');
        // 2.注册事件  获取焦点事件  onfocus
        text.onfocus = function() {
            console.log('得到焦点');
        }
        // 3.注册事件  失去焦点事件 onblur
        text.onblur = function() {
            console.log('失去焦点');
        }
    </script>

2.3.4  修改样式属性

    <script>
        // 1. 获取元素
        var div = document.querySelector('div');
        // 2. 注册事件  处理程序
        div.onclick = function() {
            // div.style里面的属性 采取驼峰命名法
            this.style.backgroundColor = 'purple'; // 改变背景颜色
        }
    </script>

还有一种方式式用来修改标签的类名。 在CSS中写一个类选择武器。

2.3.5   操作元素总结

  2.3.6  排他思想(算法)

 

鼠标事件

鼠标经过 onmouseover  鼠标离开 onmouseout

 

2.3.7  自定义属性的操作

1. 获取自定义属性

  这两种方法的区别

 2. 设置移除自定义属性

 

 

 2.3.8  H5 自定义属性

 2.4 节点操作

 这是获取元素的常用方法之二;

第一个是 利用DOM提供的方法来获取元素,但是这种方法逻辑性不强,繁琐。但兼容好。

利用节点层级关系获取元素,其特点:

        利用父子兄节点关系获取元素;

        逻辑性强,但兼容性稍差;

一般情况,节点拥有 nodeType(节点类型)、nodeName(节点名称)、nodeValue(节点值)

 2.4.1  节点层级

 1. 父级节点

        // 1. 父节点  parentNode
        var erweima = document.querySelector('.erweima');
        erweima.parentNode;    
        // 父节点    得到离元素最近的父节点   如果找不到父节点就返回 null

 2. 子节点

 一般不提倡用。

        // (1).子节点  childNodes 所有的子节点 包含  元素节点  文本节点 等等。。。
        console.log(ul.childNodes);
        console.log(ul.childNodes[0].nodeType);

        // (2). children  获取所有的子元素节点   常用于实际开发中
        console.log(ul.children);

        // 获取第一/最后一个节点
        // 1. firstChild 第一个子节点  不管是文本节点还是元素节点
        console.log(ul.firstChild);
        console.log(ul.lastChild);
        // 2. firstElementChild  返回第一个子元素节点
        console.log(ul.firstElementChild);
        console.log(ul.lastElementChild);
        // 实际开发写法 : 既没有兼容性问题,又返回第一个子元素
        console.log(ul.children[0]);
        console.log(ul.children[ul.children.length - 1]); // 最后一个元素

3.  兄弟节点

 考虑到兼容性:

        var div = document.querySelector('div');
        // nextSibling  下一个兄弟节点  包含元素节点 或者 文本节点等等
        console.log(div.nextSibling);
        console.log(div.previousSibling);
        // nextElementSibling  得到下一个兄弟节点
        console.log(div.nextElementSibling);
        console.log(div.previousElementSibling);

2.4.2  创建、添加、删除节点

创建节点:

 添加节点:

        // (1)创建元素节点
        var li = document.createElement('li');
        // (2) 添加节点  node.appendChild(child)  node父级  child子级  后面追加元素  类似于数组中的push
        var ul = document.querySelector('ul');
        ul.appendChild(li);
        // (3). 添加节点 node.insertBefore(child, 指定元素);
        var li2 = document.createElement('li');
        ul.insertBefore(li2, ul.children[0]);

删除节点:

        // (4)删除节点  node.removeChild(child);
        var btn = document.querySelector('button');
        // ul.removeChild(ul.children[0]);
        // 点击按钮依次删除元素
        btn.onclick = function() {
            if (ul.children.length == 0) {
                alert('所有内容已经删除完了!!!');
                this.disabled = ture;
            } else {
                ul.removeChild(ul.children[0]);
            }
        }

复制节点:

        // (5) 复制节点
        // 浅复制 node.cloneNode(); 括号为空或者里面是false  浅复制:只复制标签不复制里面的内容
        var lili = ul.children[0].cloneNode();
        ul.appendChild(lili);
        // 深复制 node.cloneNode(); 里面是true  深复制:复制标签复制里面的内容
        var lili2 = ul.children[1].cloneNode();
        ul.appendChild(lili2);

2.4.3  三种动态创建元素区别

三种方式的区别:

document.write 是直接将内容写入页面的内容流。但是文档流执行完毕,则会导致页面全部重绘。

element.innerHTML:

1.  是将内容写入某个DOM节点,不会导致页面全部重绘

2. 创建多个元素效率更高(不要拼接字符串,采取数组的形式拼接),结构稍微复杂。

document.createElement():创建多个元素的效率稍微低一点,但是结构更加清晰 

总结:不同的浏览器下,innerHTML效率比creatElement高。

2.5  DOM重点核心 (总结)

 创建:

document.write      innerHTML       createElement

增:

appendChild

insertBefore

删:

removeChild

查:

改:

修改元素属性:src、href、title 等

修改普通元素内容:innerHTML、innerText

修改表单:value、type、disabled

修改元素样式: style、className

属性操作:

 事件操作:

 2.6  事件高级导读

2.6.1 注册事件

 传统注册方式:

 方法监听注册方式:

 addEventListener事件监听方式:

        btns[1].addEventListener('click', function(){
            alert('azhe');
        })
        btns[1].addEventListener('click', function(){
            alert('不知道');
        })

attachEvent 事件监听方式 (了解 不建议在开发中使用)

        // 3. attachEvent  ie9 以前的版本支持
        btns[2].attachEvent('click', function() {
            alert(11);
        });

注册事件兼容性解决方案:

2.6.2  删除事件 

删除事件兼容性解决方案:

 2.6.3  DOM事件流

 以给一个div注册了点击事件:

 DOM 事件流分为3个阶段:

1. 捕获阶段                2.当前目标阶段                3. 冒泡事件

 注意:

2.6.4 事件对象

 

 事件对象也有兼容性的问题 ie678 通过window.event 兼容性的写法 e = e || window.event

2.6.5 事件对象的常见属性和方法

 target 和 this :

e.target 返回的是触法事件的对象(元素)  this 返回的是绑定事件的对象(元素)。

e.target 点击了那个元素就返回那个元素,this 那个元素绑定了这个点击事件,那么就返回谁

type返回事件类型:

 事件对象阻止默认行为:

 阻止事件冒泡(重点):

兼容性解决方案:

事件委托:

 事件委托的作用:

我们只操作了一次DOM,提高了程序性能。

    <script>
        // 事件委托的核心:给父节点添加侦听器,利用事件冒泡影响每一个子节点
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
            alert('事件委托');
            // e.target  这个可以获取我们点击的对象
            e.target.style.backgroundColor = 'pink';
        })
    </script>

2.6.6  鼠标事件

1. 常用的鼠标事件

1. 禁止鼠标右键菜单:

2. 鼠标事件对象

event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件的对象 MouseEvent 和键盘事件对象 KeyboardEvent

    <script>
        // 鼠标事件对象  MouseEvent
        document.addEventListener('click', function(e) {
            // 1. client 鼠标在可视化区的x和y坐标
            console.log(e.clientX);
            console.log(e.clientY);
            console.log('--------------------------');

            // 2. page  鼠标在页面文档的x和y坐标
            console.log(e.pageX);
            console.log(e.pageY);
            console.log('--------------------------');

            // 3. screen 鼠标在电脑屏幕的x和y坐标
            console.log(e.screenX);
            console.log(e.screenY);
        })
    </script>

2.6.7  键盘事件

1. 常用键盘事件:

    // 1. keyup 按键弹起的时候触法
    // document.onkeyup = function() { // 传统方式
    //     console.log('风起');
    // }
    document.addEventListener('keyup', function() {
        console.log('风起');
    })

    // 2. keydown 按键按下的时候触法
    document.addEventListener('keydown', function() {
        console.log('坐下');
    })

    // 3. keypress  按键按下的时候触法 但是它不识别功能键 比如 ctrl shift 箭头等
    document.addEventListener('keypress', function() {
        console.log('坐下press');
    })

 2. 键盘事件对象

    // 键盘事件对象中的 keyCode 属性可以得到相应键的ASCII码值
    document.addEventListener('keyup', function(e) {
        console.log('up:' + e.keyCode);
        // 如果像区分大小写,可以将这个监听事件中 keyup 改为 keypress
    })

3. BOM浏览器对象模型

BOM概述

 

3.1 window对象的常见事件

3.1.1  窗口加载事件

 注意:

        // 传统注册方式    只能执行一个事件
        window.onload = function() { 
            var btn = document.querySelector('button');
            btn.addEventListener('click', function() {
                alert('点击');
            })
        }

        // 新的注册方式
        window.addEventListener('load', function() {
            var btn = document.querySelector('button');
            btn.addEventListener('click', function() {
                alert('点击');
            })
        })

  

        // document.addEventListener('DOMContentLoaded', function()) 
        document.addEventListener('DOMContentLoaded', function() {
            alert(22);
        })

3.1.2  调整窗口大小事件

 window.onresize 是调整窗口大小加载事件,当触发时就调用的处理函数。

可以利用此函数来完成响应式布局。

注意:

        // 调整窗口大小
        window.addEventListener('load', function() {
            var div = document.querySelector('div');
            window.addEventListener('resize', function() {
                console.log(window.innerWidth); // 获取窗口的宽度
                console.log('变化了');

                if(window.innerWidth <= 800) {
                    div.style.display = 'none';
                } else {
                    div.style.display = 'block';
                }
            })
        })

3.2 定时器

window 对象提供了两种定时器 :setTimeout()  、 setInterval()

3.2.1 两种定时器--- setTimeout()

        // 语法: window.setTimeout(调用函数, 延迟时间);
        // (1). 这个window 在调用的时候可以省略, 如果省略默认的是0
        // (2).单位: 毫秒  但是可以省略 若省略默认为0
        // (3).在调用函数时,可以是直接写函数  还可以 写 函数名
        // (4). 在同一个页面中可能有很多个定时器,我们经常会给定时器加标识符
        function call() {
            alert('时间到');
        }
        var time = setTimeout(call , 3000); 

 回调函数:

 清除函数:

        // 清除定时器setTimeout
        btn.addEventListener('click', function() {
            clearTimeout(time);
        })

3.2.2  两种定时器 ---- setInterval()

 与setTimeout不同的是: 它重复调用同一个回调函数。

 清除函数:

        var begin = document.querySelector('.begin');
        var stop = document.querySelector('.stop');
        var time = null;    // 全局变量  null是一个空对象
        begin.addEventListener('click', function() {
            time = setInterval(function() {
                console.log('开启定时器');
            },2000);
        })

        stop.addEventListener('click', function() {
            clearInterval(time);
        })

3.2.3  this

 

 

3.3 JS执行队列

 3.3.1  同步和异步

 同步:

 异步:

 他们的本质区别就是:这条流水线上各个流程的执行顺序不同。

 JS 执行机制

事件循环

3.4 location 对象

location属性用于获取或设置窗体的URL,并且可以用于解析URL。因为这个属性返回的是一个对象,所以我们将这个属性也称为 location对象。

3.4.1 URL

3.4.2  location 对象的属性

重点是( href 和 search )

 具体的操作可以在浏览器的控制台中进行操作。

3.4.3  location 对象方法

    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            // location.assign() 这个方法可以实现跳转,并且可以后退
            location.assign('https://space.bilibili.com/437759560?spm_id_from=333.788.0.0');

            // location.replace 不记录历史 不可以实现后退
            location.replace('https://space.bilibili.com/437759560?spm_id_from=333.788.0.0');

            // location.reload() 重新加载页面,相当于 f5  如果里面参数为true ==> 强制刷新 ctrl+f5
            location.reload();
        })
    </script>

3.5 navigator 对象

 下面前端代码可以判断用户那个终端打开页面,实现跳转

 3.6 history 对象

    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            history.forward(); //前进功能

            history.back();  // 后退功能

            // go() 参数为正 表示前进  参数为负 表示后退
            history.go(1);
        })
    </script>

4.  PC端网页特效异读

4.1 元素偏移量 offset 系列

4.1.1  offset 概述

        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        // offsetTop   offsetLeft
        // 1. 可以得到元素的偏移 位置 返回的不带单位数值
        console.log(father.offsetTop);
        console.log(father.offsetLeft);
        // 它以带有定位的父亲为准  如果没有或者父亲没有定位 则以 body 为准
        console.log(son.offsetLeft);

        var w = document.querySelector('.w');
        // 2. 可以得到元素的大小  宽度和高度  是包含 padding + border + width 
        console.log(w.offsetWidth);
        console.log(w.offsetHeight);

        // 3. 返回带有定位的父亲 否则返回的是 body
        console.log(son.offsetParent); //返回带有定位的父亲
        console.log(son.parentNode);  //返回父亲 是最近一级的父亲 不管父亲是否带有定位

4.1.2 offset 和 style

 offset是一个只读属性

style是一个可读写的属性。

4.2 元素可视区 client系列

4.1.4 立即执行函数

4.3  元素滚动scroll系列

滚动到窗口至文档中的特定位置 :   window.scroll(x,y)   x,y 代表横纵坐标  不加单位

 4.3.1 页面被卷去头部兼容性解决方案

4.4 三大系列总结

 他们的主要用法:

4.5 mouseover 和 mouseenter 区别

mouseenter 鼠标事件

4.6 动画原理

 通过定时器 不断改变 元素的位置。

 4.6.1 简单动画封装

 4.6.2 给不同的元素记录不同的定时器

 

 

 4.6.3  缓动动画原理

 动画函数从在多个目标值之间移动

将 函数封装到 JS文件中去。

手动调用点击事件 可以用方法: arrow_r.click();

自动调用点击事件 可以用方法: next.click();

技巧:

if(callback) {
    callback();
}
// 等价于
callback && callback();

4.7 节流阀

防止轮播图按钮连续点击造成播放过快 。

5. 移动端

5.1 触屏事件

5.1.1 触屏事件概述:

        // 1. 获取元素
        var div = document.querySelector('div');
        //  手指触摸DOM元素事件
        div.addEventListener('touchstart', function() {
            console.log('触摸到');
        })
        //  手指在DOM元素身上移动
        div.addEventListener('touchmove', function() {
            console.log('滑动');
        })
        // 手指离开DOM元素事件
        div.addEventListener('touchend', function() {
            console.log('离开');
        })

 5.1.2 触摸事件对象(TouchEvent)

 5.1.3 移动端拖动元素

5.2 移动端常见特效

5.2.1 在移动端click事件300ms演示问题解决方案

### 原因的产生:

移动端双击屏幕时会缩放屏幕,之所以没有被判定为两次单独的点击事件,是因为在点击时,会有 300ms 的判断时间,若第二次点击的时间距第一次小于了 300ms,则判断为双击事件。

### 要想消除这 300ms 的判断时间,即连点两次则表示两次单独的点击事件,有两种方法:

方法一:

粗暴型,禁用缩放,禁止浏览器的默认双击事件:

<meta name="viewport" content="user-scalable=no">

在系统标签中加入上述代码

方法二:

写一个封住函数,若触摸和松开的时间小于 300ms,则立即调用回调函数

click演示解决方案(了解):

        //封装tap,解决click 300ms延时
        function tap (obj, callback) {
            var isMove = false;
            var startTime = 0; //记录触摸时候的时间变量

            obj.addEventListener('touchstart', function (e) {
            startTime = Date.now(); //记录触摸时间
            });

            obj.addEventListener('touchmove',function (e){
                isMove = true;//看看是否有滑动,有滑动算拖拽,不算点击
            });

            obj.addEventListener ('touchend', function (e) {
                if (!isMove && (Date.now() - startTime) < 150) { // 如果手指触摸和离开时间小于150ms算点击
                    callback && callback(); //执行回调函数
                }
                isMove = false; // 取反  重置
                startTime = 0;
            });
        }
        //调用
        tap (div, function() {  /* 执行代码 */  });

方法三:

使用 fastclick 插件

原理是 检测到 touchend 事件后,立刻触发模拟 click 事件,并且把浏览器 300 毫秒之后真正触发的事件给阻断掉

5.3 移动端常用开发插件

swiper插件:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发

superslide: http://www.superslide2.com/

iscroll : https://github.com/cubiq/iscroll

 

未完续待。。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于学习 JavaScript DOM(文档对象模型),你可以按照以下步骤进行: 1. 先了解什么是DOMDOM 是一种对 HTML 和 XML 文档的编程接口,它将文档解析成由节点和对象(如元素、属性和文本)组成的结构,开发者可以使用 DOM 提供的方法和属性来操作和修改这些节点和对象。 2. 学习基本的 JavaScript:在学习 DOM 之前,你需要对基本的 JavaScript 语法和概念有一定的了解。你可以从 W3Schools 或 MDN 网站上找到一些入门教程和资料。 3. 熟悉 DOM 的基本操作:掌握如何使用 JavaScript 来访问和操作 DOM 元素是学习 DOM 的关键。你可以学习如何通过 JavaScript 获取元素、修改元素内容、添加或删除元素等操作。 4. 掌握事件处理:了解如何使用 JavaScript 来处理用户的交互事件,例如点击按钮、提交表单等。你可以学习如何注册事件处理函数,并在事件发生时执行相应的操作。 5. 深入学习 DOM API:DOM API 提供了许多方法和属性,可以帮助你更高效地操作 DOM学习这些 API 的用法,例如查询选择器、遍历节点树、修改样式等,可以提升你在开发中的效率。 6. 实践项目:通过实践项目来巩固所学的知识。你可以尝试创建一些简单的交互式网页,使用 JavaScriptDOM API 实现一些功能,如表单验证、动态内容更新等。 记住,在学习过程中不断练习和实践是非常重要的。还有许多在线资源和教程可供参考,你可以根据自己的需求和学习风格选择适合自己的学习材料。祝你学习愉快!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值