美文网首页
js原生创建模拟事件和自定义事件的方法

js原生创建模拟事件和自定义事件的方法

作者: 再见田园犬 | 来源:发表于2015-05-19 12:49 被阅读10804次

让我万万没想到的是,原来《JavaScript高级程序设计(第3版)》里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法.

  1. 模拟鼠标事件
    MDN上已经说得很清楚,尽管为了保持向后兼容MouseEvent.initMouseEvent()仍然可用,但是呢,我们应该使用MouseEvent().
    我们使用如下页面做测试
<!DOCTYPE html>
<html>
<head lang="zh-CN">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title></title>
    <style>
        .button {
            width: 200px;
            height: 200px;
            background-color: antiquewhite;
            margin: 20px;
            text-align: center;
            line-height: 200px;
        }
    </style>
</head>
<body>
    <div class="button">Button</div>
    <script>
        "use strict";
        var btn = document.querySelector('.button');
        btn.addEventListener('click', function (event) {
            console.log('OH~!You clicked me~!');
        }, false);
        var ev = new MouseEvent('click', {
            cancelable: true,
            bubble: true,
            view: window
        });
        btn.dispatchEvent(ev);
    </script>
</body>
</html>

打开一下这个页面,并且在打开控制台的情况下,你就可以看到控制台打印了一句话,证明模拟成功了.
如下图所示:

Screenshot from 2015-05-19 12:20:40.png
当然,在构建这个MouseEvent对象的时候还是有很多属性可以填写的,不过,可能就是示例的那几个比较有用,如果像查看更多的属性,请查看如下地址
(由于MouseEvent继承自UIEvent和Event,所以,他也继承了他们的属性)
https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent
https://developer.mozilla.org/en-US/docs/Web/API/UIEvent
https://developer.mozilla.org/en-US/docs/Web/API/Event
想查看MouseEvent()构造器的具体用法,请查看
https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent
  1. 模拟键盘事件
    打开控制台,并且重新载入页面,你就可以看到控制台打印了字母'A'
<!DOCTYPE html>
<html>
<head lang="zh-CN">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title></title>
    <style>
        .button {
            width: 200px;
            height: 200px;
            background-color: antiquewhite;
            margin: 20px;
            text-align: center;
            line-height: 200px;
        }
    </style>
</head>
<body>
    <div class="button">Button</div>
    <script>
        "use strict";
        var btn = document.querySelector('.button');
        document.addEventListener('keyup', function (event) {
            console.log(String.fromCharCode(event.keyCode));
        }, false);
        var ev = new KeyboardEvent('keyup', {
            keyCode: 65
        });
        document.dispatchEvent(ev);
    </script>
</body>
</html>

如下是KeyBoardEvent的详细说明
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

  1. 自定义事件
    自定义事件有两种方法,一种是使用new Event(),另一种是new customEvent()
  2. new Event()
<!DOCTYPE html>
<html>
<head lang="zh-CN">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title></title>
    <style>
        .button {
            width: 200px;
            height: 200px;
            background-color: antiquewhite;
            margin: 20px;
            text-align: center;
            line-height: 200px;
        }
    </style>
</head>
<body>
    <div class="button">Button</div>
    <script>
        "use strict";
        var btn = document.querySelector('.button');
        var ev = new Event('test', {
            bubbles: 'true',
            cancelable: 'true'
        });
        btn.addEventListener('test', function (event) {
            console.log(event.bubbles);
            console.log(event.cancelable);
            console.log(event.detail);
        }, false);
        btn.dispatchEvent(ev);
    </script>
</body>
</html>

运行效果如下所示,请先注意,event.detail的值为undefined


Screenshot from 2015-05-19 12:37:01.png
  1. new customEvent()
<!DOCTYPE html>
<html>
<head lang="zh-CN">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title></title>
    <style>
        .button {
            width: 200px;
            height: 200px;
            background-color: antiquewhite;
            margin: 20px;
            text-align: center;
            line-height: 200px;
        }
    </style>
</head>
<body>
    <div class="button">Button</div>

    <script>
        "use strict";
        var btn = document.querySelector('.button');

        var ev = new CustomEvent('test', {
            bubbles: 'true',
            cancelable: 'true',
            detail: 'tcstory'
        });
        btn.addEventListener('test', function (event) {
            console.log(event.bubbles);
            console.log(event.cancelable);
            console.log(event.detail);
        }, false);
        btn.dispatchEvent(ev);
    </script>
</body>
</html>

效果如下图

Screenshot from 2015-05-19 12:40:30.png
可以很明显的看到,其实new customEvent()比new Event()多了可以在event.detail属性里携带自定义数据的功能(event.detail的值为tcstory),这就是差别了.
Event()的详细说明
https://developer.mozilla.org/en-US/docs/Web/API/Event/Event
customEvent() 的详细说明
https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent

总结下来发现,除了模拟自定义事件比较有用的话,模拟鼠标事件和键盘事件则好像有点坑和不一致性.以模拟键盘事件来说吧.
KeyboardEvent.key在MDN上的文档被提示为推荐使用的属性,而KeyboardEvent.keyCode却被说成是不推荐使用的,应该使用key属性,然而你去看****KeyboardEvent.key****的文档就会发现,这个属性压根就没得到多少浏览器的支持,如果用这个属性,简直就是掉坑里了.
下图所示,一大片的红字啊

Screenshot from 2015-05-19 12:48:15.png

相关文章

  • js原生创建模拟事件和自定义事件的方法

    让我万万没想到的是,原来《JavaScript高级程序设计(第3版)》里面提到的方法已经是过时的了.后来我查看了M...

  • IFE2017,动态数据绑定(二)学习笔记

    自定义事件 我们知道JS里绑定事件有addEventListener()这个方法。在JS中我们可以这样创建一个自定...

  • jQuery例子记录(持续更新)

    目录: 1.自定义事件2.操作DOM(与JS原生对比) 1.自定义事件 绑定自定义事件: 事件名称refresh....

  • Markdown

    touch.js学习 准备工作 引用 touch.js是百度开源的一套支持原生js事件和自定义事件的js库...

  • 自定义事件遇到的坑

    1. JS触发原生事件 通过这种方法可以用JS触发原生事件 2. 创建的Event对象最好不要重用 昨天在写一个功...

  • MarkDown学习

    touch.js学习 准备工作 touch.js是百度开源的一套支持原生js事件和自定义事件的js库js中包含很多...

  • MARKDOWN学习?

    touch.js学习 准备工作 touch.js是百度开源的一套支持原生js事件和自定义事件的js库js中包含很多...

  • touch.js

    touch.js学习 touch.js是百度开源的一套支持原生js事件和自定义事件的js库js中包含很多这种库 封...

  • 20、jQuery 事件机制

    20、jQuery 事件机制 原生js事件与jQuery事件: (1)用原生的js给div注册事件 原生js注册相...

  • MarkDown学习

    touch.js学习 1.准备工作 touch.js是百度开源的一套支持原生js事件和自定义事件的js库js中包含...

网友评论

      本文标题:js原生创建模拟事件和自定义事件的方法

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