最近想学习下web前端,原因是这样的,当前中国(公元2018年)的网络环境,表现形式基本是web+移动端,像微信的小程序只要写js应该就可以了,移动端的app很多也是以web的形式展示,应用程序内是html+css+js,不仅方便发布,而且做起来也快,写完页面样式,更新资源,就好了,类似热更
javascript是怎么捕获到鼠标点击事件的?
js有很多事件,鼠标的、页面加载完成的、点击按钮的;etc..
以我 windows环境下 chrome 浏览器为例
//一个简单的Win32应用程序
//通过这个简单的实例讲解Windows消息是如何传递的
#include <windows.h>
//声明窗口过程函数
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//定义一个全局变量,作为窗口类名
TCHAR szClassName[] = TEXT("SimpleWin32");
//应用程序主函数
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR szCmdLine,
int iCmdShow)
{
//****1.设计一个窗口类****
WNDCLASS wndclass;
//****2.注册窗口类
if(!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("RegisterClass Fail!"),
szClassName, MB_ICONERROR);
return 0;
}
//****3.创建一个窗口
HWND hwnd;
hwnd = CreateWindow(szClassName,//窗口类名称
TEXT ("The Simple Win32 Application"),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格,即通常我们使用的windows窗口样式
CW_USEDEFAULT,//指定窗口的初始水平位置,即屏幕坐标系的窗口的左上角的X坐标
CW_USEDEFAULT,//指定窗口的初始垂直位置,即屏幕坐标系的窗口的左上角的Y坐标
CW_USEDEFAULT,//窗口的宽度
CW_USEDEFAULT,//窗口的高度
NULL,//父窗口句柄
NULL,//窗口菜单句柄
hInstance,//实例句柄
NULL);
//****4.显示窗口
ShowWindow(hwnd,iCmdShow);
//消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))//从消息队列中取消息
{
TranslateMessage (&msg); //转换消息
DispatchMessage (&msg); //派发消息
}
return msg.wParam;
}
//消息处理函数
//参数:窗口句柄,消息,消息参数,消息参数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//处理感兴趣的消息
switch (message)
{
case WM_DESTROY:
//当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
PostQuitMessage(0);
return 0;
// 鼠标消息
}
//其他消息交给由系统提供的缺省处理函数
return ::DefWindowProc (hwnd, message, wParam, lParam);
}在Windows上,浏览器作为一个Windows上的应用程序,也会收到鼠标点击的事件,所以收到以后的事件不是 JavaScript 事件,而是浏览器进程和js解释器共同处理的事件
浏览器访问网页是个网络io,渲染html,css 以及执行 js的操作,有些操作比如说获取远程数据、I/O操作等,他们都很耗时,如果采用同步的方式,那么进程在执行这些操作时就会因为耗时而等待,就像上面那样,下面的任务也只能等待,这样效率并不高。那浏览器是怎么做的呢?
为了协调事件,用户交互,脚本,渲染,网络等,用户代理必须使用事件循环。 事件循环的主要机制就是任务队列机制:
在调用任务的过程中, 会产生新的任务, 浏览器就会不断执行任务, 因此称为事件循环.