WebsAPI(四)——事件监听

在同一个文件中,代码会预解析并且提升。

若加载多个文件时,后续的文件默认会等待上一个文件加载完并执行后,才会继续预解析并执行。

若一定要把先使用的程序文件放在后面的话,可以给它的script标签加上async属性。


(一)事件监听

1.事件监听注册事件

语法:事件源.addEventListener('事件类型',事件处理程序,是否捕获);

代码举栗:

<body>

    <button>点击</button>

    <div>

        内容

    </div>

    <script>

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

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

        btn.addEventListener('click',function(){

            div.style.width = '300px';

            div.style.height = '300px';

            div.style.background = 'red';

        });

        btn.addEventListener('click',function(){

            div.style.color = 'gold';

            div.style.fontSize = '50px';

        })

    </script>

</body>

事件监听注册事件属于叠加事件,后一个不会覆盖前面相同的事件。

传统注册事件属于覆盖事件,事件源.事件类型 = 事件处理程序。会让后面的事件覆盖前面相同的事件。

若考虑以后的事件扩展,选择事件监听;若不需要扩展,选择传统方式。

事件监听是标准的(官方认可的),但是有兼容问题。(移动端使用较多)

传统方式是非标准的,但是没有兼容问题。(PC端使用较多)

2.事件监听移除事件

传统移除事件,把原来的事件重新赋值为null

btn.onclick = null;

语法:事件源.removeEventListener('事件类型',事件处理程序的名称);

代码举栗:

<body>

    <button>点击</button>

    <div>

        内容

    </div>

    <script>

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

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

        var fn1 = function() { 

            div.style.width = '300px';

            div.style.height = '300px';

            div.style.background = 'red';

        };

        var fn2 = function() { 

            div.style.color = 'gold';

            div.style.fontSize = '50px';

        }

        btn.addEventListener('click',fn1); //fn1不要加小括号()

        btn.addEventListener('click',fn2);

        // 移除fn2

        btn.removeEventListener('click',fn2);

    </script>

</body>

(二)时间流

事件触发后的一个流程。有三个阶段:捕获阶段、目标阶段、冒泡阶段。(先捕获,到达目标,再冒泡)

事件监听注册 事件源.addEventListener('事件类型',事件处理程序,是否捕获);中的第三个元素:

1.事件捕获

true为捕获,从最外层document往内捕获事件,直到捕获到目标为止。

默认为false不捕获,支持事件冒泡,从点击的目标开始,向外层冒泡直到没有为止。

不管是true还是false,冒泡阶段或捕获阶段也都会进行,但是不会展示出来。传输过程一定会经历三个阶段。

2.事件冒泡

传统方式注册事件:默认启用事件冒泡

事件冒泡传输过程:从目标阶段(最先点击的元素)到最外层元素(即document)。

(三)事件对象

在事件触发后或在事件处理程序中,(函数体)所获取并操作的对象。

1.获取事件对象

语法:事件源.事件类型 = function(e){}

形参e(可以是任意字母)就是事件对象。执行函数(即事件触发后)的时候,浏览器会把事件对象交给形参e。

代码举栗:

<script>

        document.onclick = function() {

            //浏览器会默认给事件对象一些属性

            console.log(e);

            //从对象中拿东西。X坐标和Y坐标

            console.log(e.clientX,e.clientY);

        }

</script>

2.鼠标事件对象相关属性

1)鼠标事件类型:

- onclick

- onmouseenter

- onmouseleave

- onmousemove 鼠标移动事件

- onmousedown 鼠标按键按下事件

- onmouseup  鼠标按钮弹起事件

2)鼠标事件对象相关属性:(获取鼠标位置)

代码举栗:

<body>

    <div></div>

    <script>

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

        div.onclick = function(e) {

            console.log('相对于浏览器当前可视页面的位置:', e.clientX, e.clientY);

            console.log('相对于浏览器整个页面的位置:', e.pageX, e.pageY);

            console.log('相对于当前元素的位置:', e.offsetX, e.offsetY);

        };

    </script>

</body>

3.拖拽案例

<body>

    <div></div>

    <script>

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

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

        tip.onmousedown = function(e) {

            var x = e.offsetX;

            var y = e.offsetY;

            document.onmousemove = function (e) {

                login.style.left = e.clientX - x + 'px';

                login.style.top = e.clientY - y + 'px';

            }

        };

        tip.onmouseup = function() {

            document.onmousemove = null; //解绑

        }

    </script>

</body>

4.键盘事件相关属性

1)键盘事件类型

- onkeydown    键盘按下事件

- onkeyup      键盘弹起事件

一般给document绑定键盘事件。

2)键盘事件对象:(区分键盘按下了哪个键)

- 事件对象.keyCode    获取键盘按键对应的键码值

- 事件对象.altKey      表示alt键是否按下,返回布尔值。

- 事件对象.shiftKey    表示shift键是否按下,返回布尔值。

- 事件对象.ctrlKey    表示ctrl键是否按下,返回布尔值。(true按下,false没有按下)

代码举栗:

<script>

        document.onkeydown = function(e) {

            // console.log(e.keyCode); //获得键码值

            var num = e.keyCode;

            if(e.ctrlKey && e.keyCode==67) { //ctrlKey默认为ture

                alert('请登陆!');

            }

        };

</script>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容