程序笔记   发布时间:2022-07-14  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了JavaScript核心-兼容性问题等(二)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

5.8 三种动态创建元素区别 document.write() element.innerHTML document.createElement()

  1. document.write 是直接将内容写入页面的内容流࿰c;但是文档流执行完毕࿰c;则它会导致页面全部重绘
  2. innerHTML 是将内容写入某个 DOM 节点࿰c;不会导致页面全部重绘
  3. innerHTML 创建多个元素效率更高(不要拼接字符串࿰c;采取数组形式拼接)࿰c;结构稍微复杂
  4. createElement() 创建多个元素效率稍低一点点࿰c;但是结构更清晰 总结:不同浏览器下࿰c;innerHTML 效率要比 creatElement 高

6. DOM 重点核心

JavaScript核心-兼容性问题等(二)

关于dom操作࿰c;我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。 6.1 创建

JavaScript核心-兼容性问题等(二)

JavaScript核心-兼容性问题等(二)

JavaScript核心-兼容性问题等(二)

JavaScript核心-兼容性问题等(二)

JavaScript核心-兼容性问题等(二)

JavaScript核心-兼容性问题等(二)

6.7 事件操作 给元素注册事件࿰c; 采取 事件源.事件类型 = 事件处理程序

JavaScript核心-兼容性问题等(二)

1.1 注册事件概述

给元素添加事件࿰c;称为注册事件或者绑定事件。 注册事件有两种方式:传统方式和方法监听注册方式

JavaScript核心-兼容性问题等(二)

方法监听注册方式:

w3c 标准 推荐方式 addEventListener() 它是一个方法 IE9 之前的 IE 不支持此方法࿰c;可使用 attachEvent() 代替 特点:同一个元素同一个事件可以注册多个监听器 按注册顺序依次执行

1.2 addEventListener 事件监听方式

eventTarget.addEventListener(type, listener[, useCapture])

JavaScript核心-兼容性问题等(二)

1.3 attachEvent 事件监听方式

JavaScript核心-兼容性问题等(二)

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

 function addEventListener(element, eventName, fn) {
      // 判断当前浏览器是否支持 addEventListener 方法
      if (element.addEventListener) {
        element.addEventListener(eventName, fn);  // 第三个参数 默认是false
      } else if (element.attachEvent) {
        element.attachEvent('on' + eventName, fn);
      } else {
        // 相当于 element.onclick = fn;
        element['on' + eventName] = fn;
 } 

兼容性处理的原则: 首先照顾大多数浏览器࿰c;再处理特殊浏览器

2.1 删除事件的方式

JavaScript核心-兼容性问题等(二)

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

 function removeEventListener(element, eventName, fn) {
      // 判断当前浏览器是否支持 removeEventListener 方法
      if (element.removeEventListener) {
        element.removeEventListener(eventName, fn);  // 第三个参数 默认是false
      } else if (element.detachEvent) {
        element.detachEvent('on' + eventName, fn);
      } else {
        element['on' + eventName] = null;
 } 

<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            BACkground-color: pink;
        }
    </style>
</head>

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        var divs = document.querySELEctorAll('div');
        divs[0].onclick = function() {
                alert(11);
                // 1. 传统方式删除事件
                divs[0].onclick = null;
            }
            // 2. removeEventListener 删除事件
        divs[1].addEventListener('click', fn) // 里面的fn 不需要调用加小括号

        function fn() {
            alert(22);
            divs[1].removeEventListener('click', fn);
        }
        // 3. detachEvent
        divs[2].attachEvent('onclick', fn1);

        function fn1() {
            alert(33);
            divs[2].detachEvent('onclick', fn1);
        }
    </script>
</body>

</html>

3. DOM 事件流

事件流描述的是从页面中接收事件的顺序。 事件发生时会在元素节点之间按照特定的顺序传播࿰c;这个传播过程即 DOM 事件流。 比如我们给一个div 注册了点击事件: DOM 事件流分为3个阶段:

  1. 捕获阶段
  2. 当前目标阶段
  3. 冒泡阶段 事件冒泡: IE 最早提出࿰c;事件开始时由最具体的元素接收࿰c;然后逐级向上传播到到 DOM 最顶层节点的过程。 事件捕获: 网景最早提出࿰c;由 DOM 最顶层节点开始࿰c;然后逐级向下传播到到最具体的元素接收的过程。

    JavaScript核心-兼容性问题等(二)

    我们向水里面扔一块石头࿰c;首先它会有一个下降的过程࿰c;这个过程就可以理解为从最顶层向事件发生的最具体元素(目标点)的捕获过程;之后会产生泡泡࿰c;会在最低点( 最具体元素)之后漂浮到水面上࿰c;这个过程相当于事件冒泡。

    JavaScript核心-兼容性问题等(二)

    事件发生时会在元素节点之间按照特定的顺序传播࿰c;这个传播过程即 DOM 事件流。 注意 JS 代码中只能执行捕获或者冒泡其中的一个阶段。 onclick 和 attachEvent 只能得到冒泡阶段。 addEventListener(type, listener[, useCapture])第三个参数如果是 true࿰c;表示在事件捕获阶段调用事件处理程序;如果是 false(不写默认就是false)࿰c;表示在事件冒泡阶段调用事件处理程序。 实际开发中我们很少使用事件捕获࿰c;我们更关注事件冒泡。 有些事件是没有冒泡的࿰c;比如 onblur、onfocus、onmouseenter、onmouSELEave 事件冒泡有时候会带来麻烦࿰c;有时候又会帮助很巧妙的做某些事件࿰c;我们后面讲解。

<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .father {
            overflow: hidden;
            width: 300px;
            height: 300px;
            margin: 100px auto;
            BACkground-color: pink;
            text-align: center;
        }
        
        .son {
            width: 200px;
            height: 200px;
            margin: 50px;
            BACkground-color: purple;
            line-height: 200px;
            color: #fff;
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="son">son盒子</div>
    </div>
    <script>
        // dom 事件流 三个阶段
        // 1. JS 代码中只能执行捕获或者冒泡其中的一个阶段。
        // 2. onclick 和 attachEvent(ie) 只能得到冒泡阶段。
        // 3. 捕获阶段 如果addEventListener 第三个参数是 true 那么则处于捕获阶段  document -> html -> body -> father -> son
        // var son = document.querySELEctor('.son');
        // son.addEventListener('click', function() {
        //     alert('son');
        // }, truE);
        // var father = document.querySELEctor('.father');
        // father.addEventListener('click', function() {
        //     alert('father');
        // }, truE);
        // 4. 冒泡阶段 如果addEventListener 第三个参数是 false 或者 省略 那么则处于冒泡阶段  son -> father ->body -> html -> document
        var son = document.querySELEctor('.son');
        son.addEventListener('click', function() {
            alert('son');
        }, false);
        var father = document.querySELEctor('.father');
        father.addEventListener('click', function() {
            alert('father');
        }, false);
        document.addEventListener('click', function() {
            alert('document');
        })
    </script>
</body>

</html>

4.1 什么是事件对象

eventTarget.onclick = function(event) {} eventTarget.addEventListener(‘click’, function(event) {}) // 这个 event 就是事件对象࿰c;我们还喜欢的写成 e 或者 evt 官方解释:event 对象代表事件的状态࿰c;比如键盘按键的状态、鼠标的位置、鼠标按钮的状态。 简单理解:事件发生后࿰c;跟事件相关的一系列信息数据的集合都放到这个对象里面࿰c;这个对象就是事件对象 event࿰c;它有很多属性和方法。 比如:

  1. 谁绑定了这个事件。
  2. 鼠标触发事件的话࿰c;会得到鼠标的相关信息࿰c;如鼠标位置。
  3. 键盘触发事件的话࿰c;会得到键盘的相关信息࿰c;如按了哪个键。

<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            BACkground-color: pink;
        }
    </style>
</head>

<body>
    <div>123</div>
    <script>
        // 事件对象
        var div = document.querySELEctor('div');
        div.onclick = function(e) {
                // console.log(E);
                // console.log(window.event);
                // e = e || window.event;
                console.log(e);


            }
            // div.addEventListener('click', function(E) {
            //         console.log(E);

        //     })
        // 1. event 就是一个事件对象 写到我们侦听函数的 小括号里面 当形参来看
        // 2. 事件对象只有有了事件才会存在࿰c;它是系统给我们自动创建的࿰c;不需要我们传递参数
        // 3. 事件对象 是 我们事件的一系列相关数据的集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信息࿰c;鼠标坐标啊࿰c;如果是键盘事件里面就包含的键盘事件的信息 比如 判断用户按下了那个键
        // 4. 这个事件对象我们可以自己命名 比如 event 、 evt、 e
        // 5. 事件对象也有兼容性问题 ie678 通过 window.event 兼容性的写法  e = e || window.event;
    </script>
</body>

</html>

4.2 事件对象的使用语法

JavaScript核心-兼容性问题等(二)

4.3 事件对象的兼容性方案

事件对象本身的获取存在兼容问题:

  1. 标准浏览器中是浏览器给方法传递的参数࿰c;只需要定义形参 e 就可以获取到。
  2. 在 IE6~8 中࿰c;浏览器不会给方法传递参数࿰c;如果需要的话࿰c;需要到 window.event 中获取查找。 解决: e = e || window.event;

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

e.target 和 this 的区别: this 是事件绑定的元素࿰c; 这个函数的调用者(绑定这个事件的元素) e.target 是事件触发的元素。

JavaScript核心-兼容性问题等(二)


<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            BACkground-color: pink;
        }
    </style>
</head>

<body>
    <div>123</div>
    <ul>
        <li>abc</li>
        <li>abc</li>
        <li>abc</li>
    </ul>
    <script>
        // 常见事件对象的属性和方法
        // 1. e.target 返回的是触发事件的对象(元素)  this 返回的是绑定事件的对象(元素)
        // 区别 : e.target 点击了那个元素࿰c;就返回那个元素 this 那个元素绑定了这个点击事件࿰c;那么就返回谁
        var div = document.querySELEctor('div');
        div.addEventListener('click', function(e) {
            console.log(e.target);
            console.log(this);

        })
        var ul = document.querySELEctor('ul');
        ul.addEventListener('click', function(e) {
                // 我们给ul 绑定了事件  那么this 就指向ul  
                console.log(this);
                console.log(e.currentTarget);

                // e.target 指向我们点击的那个对象 谁触发了这个事件 我们点击的是li e.target 指向的就是li
                console.log(e.target);

            })
            // 了解兼容性
            // div.onclick = function(E) {
            //     e = e || window.event;
            //     var target = e.target || e.srcElement;
            //     console.log(target);

        // }
        // 2. 了解 跟 this 有个非常相似的属性 currentTarget  ie678不认识
    </script>
</body>

</html>

<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>

    </style>
</head>

<body>
    <div>123</div>
    <a href="http://www.baidu.com">百度</a>
    <form action="http://www.baidu.com">
        <input type="submit" value="提交" name="sub">
    </form>
    <script>
        // 常见事件对象的属性和方法
        // 1. 返回事件类型
        var div = document.querySELEctor('div');
        div.addEventListener('click', fn);
        div.addEventListener('mouseover', fn);
        div.addEventListener('mouseout', fn);

        function fn(e) {
            console.log(e.type);

        }
        // 2. 阻止默认行为(事件) 让链接不跳转 或者让提交按钮不提交
        var a = document.querySELEctor('a');
        a.addEventListener('click', function(e) {
                e.preventDefault(); //  dom 标准写法
            })
            // 3. 传统的注册方式
        a.onclick = function(e) {
            // 普通浏览器 e.preventDefault();  方法
            // e.preventDefault();
            // 低版本浏览器 ie678  returnValue  属性
            // e.returnValue;
            // 我们可以利用return false 也能阻止默认行为 没有兼容性问题 特点: return 后面的代码不执行了࿰c; 而且只限于传统的注册方式
            return false;
            alert(11);
        }
    </script>
</body>

</html>

5.1 阻止事件冒泡的两种方式(面试经常问)

事件冒泡:开始时由最具体的元素接收࿰c;然后逐级向上传播到到 DOM 最顶层节点。 事件冒泡本身的特性࿰c;会带来的坏处࿰c;也会带来的好处࿰c;需要我们灵活掌握。 阻止事件冒泡

JavaScript核心-兼容性问题等(二)


<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .father {
            overflow: hidden;
            width: 300px;
            height: 300px;
            margin: 100px auto;
            BACkground-color: pink;
            text-align: center;
        }
        
        .son {
            width: 200px;
            height: 200px;
            margin: 50px;
            BACkground-color: purple;
            line-height: 200px;
            color: #fff;
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="son">son儿子</div>
    </div>
    <script>
        // 常见事件对象的属性和方法
        // 阻止冒泡  dom 推荐的标准 stopPropagation() 
        var son = document.querySELEctor('.son');
        son.addEventListener('click', function(e) {
            alert('son');
            e.stopPropagation(); // stop 停止  Propagation 传播
            e.cancelBubble = true; // 非标准 cancel 取消 bubble 泡泡
        }, false);

        var father = document.querySELEctor('.father');
        father.addEventListener('click', function() {
            alert('father');
        }, false);
        document.addEventListener('click', function() {
            alert('document');
        })
    </script>
</body>

</html>

5.2 阻止事件冒泡的兼容性解决方案

if(e && e.stopPropagation){ e.stopPropagation(); }else{ window.event.cancelBubble = true; }

6. 事件委托(代理、委派)(面试经常问)

JavaScript核心-兼容性问题等(二)

事件委托 事件委托也称为事件代理࿰c; 在 jQuery 里面称为事件委派。 事件委托的原理 不是每个子节点单独设置事件监听器࿰c;而是事件监听器设置在其父节点上࿰c;然后利用冒泡原理影响设置每个子节点。 以上案例:给 ul 注册点击事件࿰c;然后利用事件对象的 target 来找到当前点击的 li࿰c;因为点击 li࿰c;事件会冒泡到 ul 上࿰c; ul 有注册事件࿰c;就会触发事件监听器。 事件委托的作用 我们只操作了一次 DOM ࿰c;提高了程序的性能。

<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <ul>
        <li>知否知否࿰c;点我应有弹框在手!</li>
        <li>知否知否࿰c;点我应有弹框在手!</li>
        <li>知否知否࿰c;点我应有弹框在手!</li>
        <li>知否知否࿰c;点我应有弹框在手!</li>
        <li>知否知否࿰c;点我应有弹框在手!</li>
    </ul>
    <script>
        // 事件委托的核心原理:给父节点添加侦听器࿰c; 利用事件冒泡影响每一个子节点
        var ul = document.querySELEctor('ul');
        ul.addEventListener('click', function(e) {
            // alert('知否知否࿰c;点我应有弹框在手!');
            // e.target 这个可以得到我们点击的对象
            e.target.style.BACkgroundColor = 'pink';


        })
    </script>
</body>

</html>

7.1 常用的鼠标事件

1.禁止鼠标右键菜单 contextmenu主要控制应该何时显示上下文菜单࿰c;主要用于程序员取消默认的上下文菜单

document.addEventListener(‘contextmenu’, function(E) { e.preventDefault(); })

2.禁止鼠标选中(SELEctstart 开始选中) document.addEventListener(‘SELEctstart’, function(E) { e.preventDefault(); })

7.2 鼠标事件对象

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

JavaScript核心-兼容性问题等(二)


<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        body {
            height: 3000px;
        }
    </style>
</head>

<body>
    <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>
</body>

</html>

案例: 跟随鼠标的天使

这个天使图片一直跟随鼠标移动

鼠标不断的移动࿰c;使用鼠标移动事件: mousemove 在页面中移动࿰c;给document注册事件 图片要移动距离࿰c;而且不占位置࿰c;我们使用绝对定位即可 核心原理: 每次鼠标移动࿰c;我们都会获得最新的鼠标坐标࿰c; 把这个x和y坐标做为图片的top和left 值就可以移动图片

JavaScript核心-兼容性问题等(二)

<!DOCTYPE html>
<html lang="en">

<head>
    <@H_393_77@meta charset="UTF-8">
    <@H_393_77@meta name="viewport" content="width=device-width, initial-scale=1.0">
    <@H_393_77@meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        img {
            position: absolute;
            top: 2px;
        }
    </style>
</head>

<body>
    <img src="images/angel.gif" alt="">
    <script>
        var pic = document.querySELEctor('img');
        document.addEventListener('mousemove', function(e) {
            // 1. mousemove只要我们鼠标移动1px 就会触发这个事件
            // console.log(1);
            // 2.核心原理: 每次鼠标移动࿰c;我们都会获得最新的鼠标坐标࿰c; 把这个x和y坐标做为图片的top和left 值就可以移动图片
            var x = e.pageX;
            var y = e.pageY;
            console.log('x坐标是' + x, 'y坐标是' + y);
            //3 . 千万不要忘记给left 和top 添加px 单位
            pic.style.left = x - 50 + 'px';
            pic.style.top = y - 40 + 'px';


        });
    </script>
</body>

</html>

3.3 页面被卷去的头部兼容性解决方案(scroll滚动)

需要注意的是࿰c;页面被卷去的头部࿰c;有兼容性问题࿰c;因此被卷去的头部通常有如下几种写法:

  1. 声明了 DTD࿰c;使用 document.documentElement.scrollTop
  2. 未声明 DTD࿰c;使用 document.body.scrollTop
  3. 新方法 window.pageYOffset 和 window.pageXOffset࿰c;IE9 开始支持
 function getScroll() {
    return {
      left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft||0,
      top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
    };
 } 
使用的时候  getScroll().left

大佬总结

以上是大佬教程为你收集整理的JavaScript核心-兼容性问题等(二)全部内容,希望文章能够帮你解决JavaScript核心-兼容性问题等(二)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。