事件简述

  技术一般水平有限,有什么错的地方,望大家指正。

  事件是我们平时经常使用,这次就来了解一下事件。首先我们要明确几个概念,JavaScript是单线程,浏览器是多线程的,并不是所有的事件处理函数都是异步的。

  前两个我们都知道,这里我们主要介绍第三个。事件处理函数可以在将来执行,只要满足触发条件就会执行事件处理函数。我们经常看到的一个场景,在循环中为一组元素绑定事件,弹出它在这组元素中的索引:

<button>button1</button><button>button2</button><button>button3</button>
$(function(){
var btns = $("button");
for(var i=0,il=btns.length;i<il;i++){
$(btns[i]).click(function(){
console.log(i);
})
}
})

  上面的代码我们在点击的时候每一个都是打印3,并不能实现我们预期的目的,这是因为我们点击的时候i的值已经变成3,而事件处理函数的行为是打印i浏览器此时就会去查询i,然后找到i=3所以点击每一个按钮都会打印3,要实现我们预期的目的就需要用到闭包:

$(function(){
var btns = $("button");
for(var i=0,il=btns.length;i<il;i++){
;(function(i){
$(btns[i]).click(function(){
console.log(i);
})
}(i))
}
})

  虽然每一个点击事件的处理函数仍然是打印i但是此时浏览器去查找i的时候会优先找到作为参数的i,而此时的i就是当前循环的i的值。  

  普通的事件是同步执行的,看下面的一段代码:

$(function(){
var btn = $("#button");
btn.on("click",function(){
var span = $("<span class='span'>这是点击按钮创建的元素</span>");
$("body").append(span);
$(this).off("click");
})
btn.trigger("click");
$(".span").css("color","red");
})

  开始我一直以为$(".span").css("color","red")会先于点击事件的处理函数之前执行,后来发现自己是错的,trigger("click")触发之后就会去执行创建DOM的语句,之后才会执行改变颜色的语句。

异步的事件处理函数

  什么是异步呢?我们知道JavaScript是单线程的语言,而浏览器是它的执行环境(非Node.js),而浏览器是有多个线程来处理不同的工作的。我们的JS代码在编译完成之后,开始从上往下执行,如果执行到像setTimeout之类的这种异步函数就会把它的处理函数放在浏览器的消息队列中,当JS代码执行完之后,会通知消息队列,查看有没有需要执行的代码,如果有就执行。

  有一些事件处理函数是异步的包括window.onload或者JQ中的$(function(){})都是异步的,AJAX肯定是异步的这个是毋庸置疑的。

window.onload = function(){
console.log("onload")
}
function handler(){
console.log("handler");
}
handler();
//先打印handler 后打印onload

  setTimeout和setInterval也是异步的:

setTimeout(function(){
console.log("setTimeout");
},0)
function handler(){
console.log("handler");
}
handler();
//先打印handler 后打印setTimeout

JavaScript事件简述的更多相关文章

  1. JavaScript 模块化简述

    JavaScript 模块化简述 前言 关于模块化,最直接的表现就是我们写的 require 和 import 关键字,如果查阅相关资料,就一定会遇到 CommonJS .CMD AMD 这些名词,以 ...

  2. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

  3. JavaScript事件概览

    JavaScript事件 JavaScript是单线程,在同一个时间点,不可能同时运行两个"控制线程". 事件句柄和事件对象 1.注册事件句柄 标准和非标准 var button= ...

  4. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  5. JavaScript 事件

    事件 概念:事件是可以被 JavaScript 侦测到的行为. JavaScript 使我们有能力创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触 ...

  6. JavaScript事件详解-jQuery的事件实现(三)

    正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...

  7. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  8. 总结JavaScript事件机制

    JavaScript事件模型 在各种浏览器中存在三种事件模型: 原始事件模型 , DOM2事件模型 , IE事件模型. 其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE ...

  9. 解析Javascript事件冒泡机制

    本资源引自: 解析Javascript事件冒泡机制 - 我的程序人生 - 博客频道 - CSDN.NET http://blog.csdn.net/luanlouis/article/details/ ...

随机推荐

  1. json封装数据,然后通过创造的标签调用

    <ul class="list"> <li></li> <li></li> <li></li> ...

  2. 安装cartographer_ros

    这里使用的是hitcm(张明明)的github地址,由于google官方的教程需要FQ下载一些文件,因此容易失败,经验证hitcm(张明明)对原文件进行了少许修改后可以成功安装,在他的修改中核心代码不 ...

  3. MVC修改视图的默认路径

    概述:之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写,所有的视图引擎都继承于该 ...

  4. c语言中的0UL或1UL是什么意思

    0UL 表示 无符号长整型 0 1UL 表示 无符号长整型 1 如果不写UL后缀,系统默认为:int, 即,有符号整数. 1.数值常数有:整型常数.浮点常数:2.只有数值常数才有后缀说明:3.数值常数 ...

  5. CentOS下的Autoconf和AutoMake(实践篇) 2

    阅读过<Linux下的Autoconf和AutoMake(理论篇)>之后,进入到实践环节.实验环境:CentOS release 6.7 (Final) x64 1.检查一下这4个工具是否 ...

  6. Codeforces 101487E - Enter The Dragon

    101487E - Enter The Dragon 思路:做的时候两个地方理解错了,第一个事我以为龙吸了水,水就干了,其实龙是在下雨之前吸的,下雨时湖水又满了,所以湖水永远不会干:第二个是以为只要找 ...

  7. NeteaseCloudWebApp模仿网易云音乐的vue自己从开源代码中学习到的

    github地址: https://github.com/javaSwing/NeteaseCloudWebApp 1.Vue.prototype.$http = Axios // 类似于vue-re ...

  8. Ubuntu安装NVIDA显卡驱动

    0. 综述 电脑型号:R720 Ubuntu版本:16 显卡型号:1050ti 目前,知道3种安装N卡驱动的方法: 1. PPA源:最简便,但未必有最新驱动(亲测),或可能遇到问题(风闻). sudo ...

  9. Vue.js教程--基础2(事件处理 表单输入绑定

    事件处理 表单输入绑定 事件处理 监听v-on 监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 可以在v-on:click=''加内联语句. 有时也需要在内联语句处理器中访问原始 ...

  10. Ubuntu 18.04 LTS 安装wine 、exe程序安装和卸载

    什么是wine?Wine(是“Wine Is Not an Emulator”的缩写)是一个兼容层,能够在几个POSIX兼容的操作系统上运行Windows应用程序,如Linux.MaOS.BSD.代替 ...