事件处理机制--浏览器流程处理分析

事件处理机制--浏览器流程处理分析

js的运行是单线程的,单线程即一个时间只能做一件事。浏览器的运行是多线程的。

如下三种情况会进入事件队列(任务队列)中,但不立即执行:

  1.定时函数

  2.事件函数

  3.ajax的回调函数(xhr.onreadystatechange = function(){};  //会调用多次)

主线程中先执行非事件队列函数,再执行事件队列函数,事件队列中的事件先进去的先被判断,但不一定先被执行。事件队列中谁先满足条件先执行谁。

事件队列中的任务执行是有条件的:(前提条件:主线程必须是空闲的)

  1.定时函数的触发条件(到达延时事件)(延时时间不精确)定时器从放入队列时开始计时,超时的定时函数优先执行

  2.事件函数的触发条件(特定的事件发生)

  3.Ajax回调函数的触发条件(服务器有数据响应时触发:xhr.readyState状态发生变化时触发)

事件队列中的任务先进先出

先进先出:优先被判断,但不一定优先被执行

举例说明:

1. 定时函数:

<script type="text/javascript">
    console.log(1);
    setTimeout(function(){
        console.log(2);
    }, 0); //0表示以最小延时去执行
    var sum = 0;
    for(var i = 0; i < 100; i++) {
        sum += i;
    }
    console.log(sum);
    console.log(3);
</script>

所以以上代码的输出结果为:

  1
  4950
  3
  2

2. 事件函数

<input type="button" value="按钮" id="btn">

<script type="text/javascript">
    var btn = document.getElementById(‘btn‘);
    console.log(1);
    btn.onclick = function(){
        console.log(2);
    }
    console.log(3);
</script>

运行后点击按钮,输出结果为: 

  1
  3
  2

3. Ajax回调函数

var xhr = new XHLHttpRequest();
xhr.open();
xhr.send();
console.log(1);
var data = null;
xhr.onreadystatechange = function(){
    console.log(2);
    data = xhr.responseText;
}
console.log(data); // data先输出才执行函数,所以应使用回调函数实现
console.log(3);

td.linenos { background-color: #f0f0f0; padding-right: 10px }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px }
pre { line-height: 125% }
body .hll { background-color: #ffffcc }
body { background: #f8f8f8 }
body .c { color: #408080; font-style: italic }
body .err { border: 1px solid #FF0000 }
body .k { color: #008000; font-weight: bold }
body .o { color: #666666 }
body .cm { color: #408080; font-style: italic }
body .cp { color: #BC7A00 }
body .c1 { color: #408080; font-style: italic }
body .cs { color: #408080; font-style: italic }
body .gd { color: #A00000 }
body .ge { font-style: italic }
body .gr { color: #FF0000 }
body .gh { color: #000080; font-weight: bold }
body .gi { color: #00A000 }
body .go { color: #888888 }
body .gp { color: #000080; font-weight: bold }
body .gs { font-weight: bold }
body .gu { color: #800080; font-weight: bold }
body .gt { color: #0044DD }
body .kc { color: #008000; font-weight: bold }
body .kd { color: #008000; font-weight: bold }
body .kn { color: #008000; font-weight: bold }
body .kp { color: #008000 }
body .kr { color: #008000; font-weight: bold }
body .kt { color: #B00040 }
body .m { color: #666666 }
body .s { color: #BA2121 }
body .na { color: #7D9029 }
body .nb { color: #008000 }
body .nc { color: #0000FF; font-weight: bold }
body .no { color: #880000 }
body .nd { color: #AA22FF }
body .ni { color: #999999; font-weight: bold }
body .ne { color: #D2413A; font-weight: bold }
body .nf { color: #0000FF }
body .nl { color: #A0A000 }
body .nn { color: #0000FF; font-weight: bold }
body .nt { color: #008000; font-weight: bold }
body .nv { color: #19177C }
body .ow { color: #AA22FF; font-weight: bold }
body .w { color: #bbbbbb }
body .mf { color: #666666 }
body .mh { color: #666666 }
body .mi { color: #666666 }
body .mo { color: #666666 }
body .sb { color: #BA2121 }
body .sc { color: #BA2121 }
body .sd { color: #BA2121; font-style: italic }
body .s2 { color: #BA2121 }
body .se { color: #BB6622; font-weight: bold }
body .sh { color: #BA2121 }
body .si { color: #BB6688; font-weight: bold }
body .sx { color: #008000 }
body .sr { color: #BB6688 }
body .s1 { color: #BA2121 }
body .ss { color: #19177C }
body .bp { color: #008000 }
body .vc { color: #19177C }
body .vg { color: #19177C }
body .vi { color: #19177C }
body .il { color: #666666 }

时间: 2024-11-03 15:15:53

事件处理机制--浏览器流程处理分析的相关文章

【js事件详解】js事件封装函数,js跨浏览器事件处理机制

一.事件流 事件流描述的是从页面中接受事件的顺序.IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流1.事件冒泡事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上转播至最不具体的节点(文档).2.事件捕获事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件. 相关知识链接:js的事件冒泡和事件捕获 二.事件处理程序 1.HTML事件处理程序2.DOM0级事件处理程序3.DOM2级事件处理程序 DOM2级事件定义了两个方法

core java 8~9(GUI &amp; AWT事件处理机制)

MODULE 8 GUIs--------------------------------GUI中的包: java.awt.*; javax.swing.*; java.awt.event.*; 要求:1)了解GUI的开发流程:2)掌握常用的布局管理器 开发GUI图形界面的步骤-------------------------------1.选择容器 1)Frame容器 有缩小/最大化/关闭等按钮,顶层容器 2)Dialog对话框 通常依赖于容器,不单独出现 3)Applet 依赖于浏览器的支持

iOS:事件处理机制

官方文档说明:<Event Handling Guide for iOS>,本文参考转载文章,并参照官方文档补充说明. 本篇内容将围绕iOS中事件及其传递机制进行学习和分析.在iOS中,事件分为三类: 触控事件(单点.多点触控以及各种手势操作) 传感器事件(重力.加速度传感器等) 远程控制事件(远程遥控iOS设备多媒体播放等) 这三类事件共同构成了iOS设备丰富的操作方式和使用体验,本次就首先来针对第一类事件:触控事件,进行学习和分析. Gesture Recognizers Gesture

QT开发(十二)——QT事件处理机制

QT开发(十二)--QT事件处理机制 一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 鼠标事件: 鼠标移动,鼠标按键的按下和松开 拖放事件: 用鼠标进行拖放 滚轮事件: 鼠标滚轮滚动 绘屏事件: 重绘屏幕的某些部分 定时事件: 定时器到时 焦点事件: 键盘焦点移动 进入和离开事件: 鼠标移入widget之内,或是移出 移动事件: widget的

Chromium网页输入事件处理机制简要介绍和学习计划

用户在浏览网页的时候,需要与网页进行交互,常用的操作如滑动.捏合网页,以及点击网页中的链接等.这些交互操作也称为用户输入事件,浏览器需要对它们作出迅速的响应,例如及时更新网页内容或者打开新的网页等.浏览器能够对用户输入事件作出迅速的响应是至关重要的,因为这关乎到用户浏览网页时的体验,尤其是在用户滑动和捏合网页时.本文接下来就简要介绍Chromium对用户输入事件的处理机制,以及制定后续的学习计划. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在任何一个

linux input输入子系统分析《四》:input子系统整体流程全面分析

1      input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备驱动层的写法,因此在开头部分会从设备驱动层做为线索,分析输入子系统和事件处理层是如何配合的,最后从用户角度出发,从"/dev/input/*"接口如何使用输入子系统提供的服务. 既然需要详细分析,有一个这样的流程图能够帮助我们在被绕进代码的过程中,找到出口,你能够知道你现在位于代码框架的什

Android基础入门教程——3.2 基于回调的事件处理机制

Android基础入门教程--3.2 基于回调的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言 在3.1中我们对Android中的一个事件处理机制--基于监听的事件处理机制进行了学习,简单的说就是 为我们的事件源(组件)添加一个监听器,然后当用户触发了事件后,交给监听器去处理,根据不同的事件 执行不同的操作;那么基于回调的事件处理机制又是什么样的原理呢?好吧,还有一个问题:你知道 什么是方法回调吗?知道吗?相信很多朋友都是了解,但又说不出来吧!好了,带着这些疑问我们 对a

如何编写自定义标签?具体流程与分析(自定义标签快速入门)

1.自定义标签简介 自定义标签主要用于移除Jsp页面中的java代码 使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: 1.编写一个实现Tag接口的Java类(标签处理器类) 2.在WEB-INF中编写标签库描述符(tld)文件,在tld文件中对标签处理器类描述成一个标签 (参考tomcat中的examples 项目中jsp部分) 2.自定义标签的执行流程的分析 JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法.

C#委托及事件处理机制浅析

事件可以理解为某个对象所发出的消息,以通知特定动作(行为)的发生或状态的改变.行为的发生可能是来自用户交互,如鼠标点击:也可能源自其它的程序逻辑.在这里,触发事件的对象被称为事件(消息)发出者(sender),捕获和响应事件的对象被称作事件接收者. 在事件(消息)通讯中,负责事件发起的类对象并不知道哪个对象或方法会接收和处理(handle)这一事件.这就需要一个中介者(类似指针处理的方式),在事件发起者与接收者之间建立关联.在.NET Framework中,定义了一个特殊的类型(delegate