美文网首页吃饭用的前端
WebsAPI(五)——事件委托、定时器

WebsAPI(五)——事件委托、定时器

作者: CNLISIYIII | 来源:发表于2019-04-11 15:11 被阅读0次

(一)事件对象的公共属性和方法

1.公共属性

事件对象.target  获取最先触发的元素

this指向事件源,target指向最先触发的元素,即冒泡事件中的目标元素

子孙元素可以共享上级元素的事件

2.公共方法

1)事件对象.preventDefault();  阻止默认行为

在a标签中href="javascript:"。

或在script代码最后加return:false(推荐,无兼容性问题)。

或:e.preventDefault();(有兼容性问题)。

<script>

    var a = document.querySelector('a');

        a.onclick = function(e) {

            alert('hello');

            e.preventDefault();

        };

</script>

2)事件对象.stopPropagation();  停止冒泡传播

<script>

var divs = document.querySelectorAll('div');

        for(var i = 0; i < divs.length; i++) {

            divs[i].onclick = function(e) {

                alert(this.className);

                e.stopPropagation();

            }

        }

</script>

(二)事件委托

从性能角度:函数也是一种数据类型,也需要存储在内存中。所以注册的事件越多,开辟的内存空间越多。浏览器在注册事件时也是耗时的, 注册的事件越多耗时越长。

从动态操作元素角度:动态添加的元素需要重新注册事件。

1.事件委托

只需要注册一个事件就可以,不管是原有的子孙元素,还是未来动态添加的子孙元素,都可以实现功能。

2.事件委托的实现

把子孙元素的事件委托给上级元素。

1)获取上级元素,给上级元素注册事件。

2)通过事件对象的target,获取最先触发的元素

3)可以选择使用nodeName检测是否是指定的元素

代码举栗:

<script>

var ul = document.querySelector('ul');

        ul.onclick = function(e) {

            if(e.target.nodeName == 'LI') {

                alert(e.target.innerText);

            }

        };

</script>

3)可以选择类名className检测是否为指定元素

代码举栗:

<body>

    <button>添加</button>

    <div class="list">

        <h3>标题1</h3>

        <h3 class="box">标题2</h3>

        <h3>标题3</h3>

        <p class="box">段落1</p>

        <p>段落2</p>

        <p>段落3</p>

        <p class="box">段落4</p>

    </div>

    <script>

        var div = document.querySelector('div');

        div.onclick = function (e) {

            var t = e.target;

            if(t.className == 'box'){

                alert(t.innerText);

            }

        }

    </script>

</body>

3.扩展:事件对象兼容性问题

事件对象:事件处理的第一个形参,是标准的。形参相当于一个变量。

在IE8中console.log(e)获取不到对象,返回undefined;可以用window.event

方法1代码举栗:

<script>

        document.onclick = function (e) {

            var _e;

            if (e != undefined) {

                _e = e;

            }

            else {

                _e = window.event;

            }

            //IE低版本获取事件对象:widow.event;

            // console.log(window.event);

            console.log(_e);

        }

</script>

方法2代码举栗:

<script>

        document.onclick = function (e) {

            var _e = e || window.event;  //返回为true的值

            console.log(_e);

        }

</script>

任何数据都可以参与任何运算。

左侧数据 || 右侧数据:若左侧数据能转换为布尔值且值为true时,就输出左侧数据,否则输出右侧数据。

左侧数据 && 右侧数据:若左侧数据能转换为布尔值且值为false时,输出左侧数据,否则输出右侧数据。

1&&2  //返回2

0&&2  //返回0

(三)BOM

浏览器对象模型

1.window对象

window对象是顶级对象(或全局对象)

获取window对象:window;

定义的全局变量或全局函数都会成为window对象的属性和方法,都可以用window对象来调用,在使用时可以忽略window。

<script>

      var a = 123;

      var fn = function() {alert('执行fn')};

      console.log(window.a);  //123

      console.log(window.fn);  //fn

</script>

特殊情况1:不要定义全局变量name。因为赋值数组时,数组会自动转换为字符串。

代码举栗:

<script>

      var name = ['章三','李四','王五'];

      console.log(name[0]);  //输出'张'

</script>

特殊情况2:不要定义全局变量top。因为top是只读的,只能使用,不能重新设置。已经被window使用,并且它代表window本身,

代码举栗:

<script>

      var top = 1;

      console.log(top);  //输出window对象

</script>

2.对话框

window可以省略

1)alert:window.alert(); 

2)prompt:window.prompt(); 

3)confirm:window.confirm(); 

3.定时器

1)window.setTimeout(callback, time);

window可以省略。time单位为毫秒。

作用:延迟执行一段程序,只执行一次(定时炸弹),返回一个数字。

代码举栗:

<script>

        setTimeout(function(){

            console.log('bumb!');

        }, 3000);

</script>

定时器的事件不是百分之百精确的,因为要考虑到代码执行顺序问题:当定时器代码和非定时器代码同时存在时,先执行非定时器代码。非定时器代码执行结束后才会执行定时器,此时与定时器设置的延迟时间无关。

代码举栗:

<script>

        setTimeout(function(){

            console.log('bumb!');

        }, 3000);

        while(true) {

        }

</script>

延迟时间为0也不例外。

代码举栗:

<script>

        setTimeout(function(){

            console.log('bumb!');

        }, 0);

        console.log('a');  //先输出a,再输出bumb!

</script>

定时器返回的是一个数字,定时器的标识。

代码举栗:

<script>

        var flag = setTimeout(function(){

            alert('bumb1!');

        }, 5000);  //1。表示第几个定时器。

        var flag2 = setTimeout(function(){

            alert('bumb2!');

        }, 5000);  //2

        console.log(flag);

        console.log(flag2);

</script>

2)清除定时器setTimeout

<body>

    <button>清除定时器</button>

    <script>

        var flag = setTimeout(function(){

            alert('bumb1!');

        }, 5000); 

        var btn = document.querySelector('button');

        btn.onclick = function() {

            clearTimeout(flag);

        }

    </script>

</body>

3)window.setInterval(callback, time); (常用)

可以重复执行,不清除定时器就会一直执行下去。

细节问题与setTimeout定时器一样。

代码举栗:

<script>

        setInterval(function(){

            console.log(Math.random());

        },1000);

</script>

4)清除定时器setInterval

代码举栗:

<body>

    <button>stop</button>

    <script>

        //调用setInterval时,就会产生一个定时器,并且返回数字标示定时器。

        var flag = setInterval(function(){

            console.log(Math.random());

        },1000);

        var btn = document.querySelector('button');

        btn.onclick = function() {

            clearInterval(flag);  //清除定时器

        }

    </script>

</body>

4.location 操作浏览器地址栏

属性:location.href; 设置或获取地址栏地址

方法:location.reload(); 刷新页面

5.history 操作历史记录

属性:history.length;  获取历史记录的长度

方法:

history.back();    回退上一个历史记录

history.forward();  前进下一个历史记录

history.go(数字);  正数,表示前进; 负数,表示回退;

6.navigator 获取浏览器信息

属性:navigator.userAgent; 用来获取浏览器的信息

相关文章

  • WebsAPI(五)——事件委托、定时器

    (一)事件对象的公共属性和方法 1.公共属性 事件对象.target 获取最先触发的元素 this指向事件源,ta...

  • 2018-12-10

    jQuery其他事件 绑定事件bind 自定义事件 事件冒泡 定时器弹框 事件委托

  • WebsAPI(四)——事件监听

    在同一个文件中,代码会预解析并且提升。 若加载多个文件时,后续的文件默认会等待上一个文件加载完并执行后,才会继续预...

  • 事件委托

    ------------------事件委托----------------- 事件: 事件委托: 原理: 冒泡 ...

  • web前端面试题@六(事件委托)

    *说到事件委托,我们首先先要知道什么是事件委托—— · 那么什么是事件委托呢??? JS里的事件委托就是当事件...

  • 前端常见面试题(十一)@郝晨光

    什么是事件委托?为什么要用事件委托? 什么是事件委托? 事件委托,又称事件代理,就是将元素的事件处理交由父元素或者...

  • 十六、DOM之事件委托 ------ 2020-01-05

    1、事件委托: 2、事件委托的优势:

  • JQuery事件委托

    JavaScript(jQuery)中的事件委托 一:什么是事件委托? 事件委托是利用事件冒泡,只指定一个事件...

  • Qt学习笔记(七)定时器

    1、基本使用 ①在.h中先声明定时器事件,该事件继承自QObject ②重写定时器事件 ③销毁定时器

  • 事件委托笔记

    事件委托原理:事件冒泡机制。 什么是事件委托: 事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪...

网友评论

    本文标题:WebsAPI(五)——事件委托、定时器

    本文链接:https://www.haomeiwen.com/subject/tamtwqtx.html