分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

JS事件

发布时间:2023-09-06 01:27责任编辑:白小东关键词:暂无标签

js与HTML之间的交互通过事件实现的。
事件流:描述从页面接受事件的顺序
?  ● IE事件流——事件冒泡流 ???从文档中嵌套层次最深的那个节点开始接受 ??(常用)
?  ● ??Netscape Communicator的事件流——事件捕获流 ??
?
1。DOM事件 ?规定的事件流包括3各阶段:时间捕获阶段,处于目标阶段和事件冒泡阶段

DOM2级事件规范要求捕获阶段不会涉及到事件目标,但在IE9,Safari,Chrome,Firefox和Opera 9.5中都会在捕获阶段触发事件对象上的事件,结果,有两次机会在目标对象上操作事件


2. DOM0级事件处理程序
就是将一个函数赋值给一个事件处理程序属性(如click load mouseover ?就是事件处理程序)
DOM0级对每个事件只支持一个事件处理程序

<input type="button" value="click me" onclick="alert(this.value);">

3.DOM2级事件处理程序

/* *DOM2级事件 定义了两个方法,用于处理指定和删除事件处理程序: addEventListener()和removeEventListener()接受3个参数:要处理的事件名,事件处理程序的函数,一个布尔值布尔值为true 表示在捕获阶段调用事件处理程序布尔值为false 表示在冒泡阶段调用事件处理程序(一般是false)*/var btn=document.getElementById("myBtn");btn.addEventListener("click",function(){alert(this.id);},false);// DOM2级方法添加事件处理程序好处:可以添加多个事件处理程序 触发是按代码先后顺序// 通过addEventListener()添加的事件处理程序只能使用removeEventlistener()来移除// 注意:通过addEventlistener()添加的匿名函数无法移除// 正确的代码 把匿名函数赋给一个变量 通过变量指定var btn=document.getElementById(‘myBtn‘);var handler=function(){alert(this.id);};btn.addEventListener("click",handler,false);// 这里省略其他代码btn.removeEventListener("click",handler,false);//有效大多数情况,都是将事件处理程序添加到事件冒泡阶段(第三个参数为false)// 跨浏览器的事件处理程序 创建一个EventUtil对象/* addHandler() 与removeHandler()接受3个参数:要操作的元素。事件名称,和事件处理程序函数*/var EventUtil = {addHandler: function (element, type, handler) {if (element.addEventListener) {element.addEventListenr(type, handler, false);} else if (element.attachEvent) {element.attachEvent("on" + type, handler);} else {element["on" + type] = handler;}},removeHandler: function (element, type, handler) {if (element.addEventListener) {element.removeEventListener(type, handler, false);} else if (element.attachEvent) {element.detachEvent("on" + type, handler);} else {element["on" + type] = null;}}};var btn=document.getElementById(‘myBtn‘);var handler=function(){alert(‘clicked‘);};EventUtil.addHandler(btn,"click",handler);// 这里省略了其他代码EventUtil.removeHandler(btn,"click",handler);


4.事件对象
在触发DOM上的某个事件时,会产生一个事件对象event。
这个对象包含所有与事件有关的信息
event对象包含的属性和方法(均为只读)
    属性/方法 ?????????????????????????类型 ??说明
?    ● bubbles ???????Boolean ???表明事件是否冒泡
?    ● cancleable ??Boolean ??是否可以取消事件的默认行为
?    ● currentTarget ??element ??指向当前的那个元素
?    ● dedaultPrevented ??Boolean ??为true 表示已调用preventDefault()
?    ● datail ??Integer(整数) ???事件相关的细节信息
?    ● eventPhase ??integer ??事件处理程序的阶段:1表示捕获阶段 ?2 处于目标阶段 ?3 表示事件冒泡阶段
?    ● preventDefault() ??function ??取消事件的默认行为 ???cancleable为true可以调用它
?    ● stopImmediatePropagation() ?取消事件进一步捕获和冒泡,同时阻止事件处理程序被调用
?    ● stopPropagation() ?取消事件进一步捕获和冒泡 ??当bubbles为true调用它
?    ● target ?????????????element ??事件的目标
?    ● trusted ??????boolean ??true表示浏览器生成
?    ● type ?????????String ?????被触发的事件类型
?    ● view ?????????AbstractView
    在事件处理程序函数内部,对象this始终等于 currentTarget的值

// 避免触发注册在document.body上的事件处理程序var btn=document.getElementById("myBtn");btn.onclick=function(event){alert(‘clicked‘);event.stopPropagation();};document.body.onclick=function(event){// alert("body clicked");alert(event.eventPhase);//3 处于事件冒泡阶段}

只有在事件处理程序执行期间,event对象才存在,一旦事件处理程序执行完毕,event对象就会被销毁

在IE中,event参数是未定义的(undefined),因此就会返回window.event


5 事件类型
DOM3规定了一下几类事件:
?  1. UI(user interface ?用户界面)事件:用户与页面元素交互时触发
    load ?当页面加载完成(包括所有图像,js文件,css文件等外部资源)触发window上面的load事件 ?
?  2. 焦点事件
?  3. 鼠标事件
?  4. 滚轮事件
?  5. 键盘事件
?  6. 合成事件:当为IME(input method editor)输入字符时触发
?  7. 受动(mutation)事件:当底层DOM结构发生改变时触发

EventUtil.addHandler(window,"load",function(event){alert(‘load‘);});


  5.1 ??根据DOM2的规范:应该在document而非window上面触发load事件,当时所有浏览器都在window上实现了load,来保证向后兼容
  5.2 ?unload事件 ??只要用户从一个界面切换到另一个界面,就会发生unload事件-——unload事件主要用来清楚引用,以避免内存泄漏(注意 ?其实这个事件是在body上触发的,不是window上,但为了向后兼容)

window.addEventListener(‘unload‘,function(event){alert(‘unload‘);},false);

  5.3 ?resize事件
    当浏览器窗口大小发生改变时发生resize事件。(不要再这个事件中加入大计算量的代码 )
  5.4 ?scroll事件 ??滚动

    焦点事件:
    blur ??元素 失去焦点时触发
    focus ??元素活得焦点
    鼠标与滚动事件
    click ??????dblclick ??(mousedown按下鼠标按钮时触发 ??mouseup)
    鼠标滚轮事件 ????mousewheel
    在event中clientX ?clientY储存点击的位置信息
    在没有滚动的情况下 ?pageX的值=clientX ?pageY的值=clientY

    屏幕坐标位置 ??——是相对于电脑屏幕的 ????screenX和screenY

event.keyCode ??——键盘操作所对应ASCII码

setTimeout(function(){//在此添加事件处理程序},0);//表示在当前js处理完成后立即运行这个函数// hashchange url参数列表发生变化时触发 在ajax中用来保存状态或导航信息window.addEventListener(‘hashchange‘,function(event){alert("old URL="+event.oldURL+"; new URL="+event.newURL);},false);

6. 事件委托—— 解决事件处理程序过多的问题,利用事件冒泡 ??
只需在DOM树中尽量最高的层次上添加一个事件处理程序(而不用为树下每一个子元素添加事件处理程序)
每个函数都是对象,都会占用内存,内存中对象越多,性能就会越差

事件委托的优点:
?  ● document对象很快就能访问到
?  ● 在页面中设置事件处理程序所需的时间少
?  ● 整个页面占用的内存小
/*
内存优化——事件委托

<ul id="mylinks">  <li id="goSomewhere"> go goSomewhere</li>  <li id="doSomething">doSomething</li>  <li id="sayHI">sayHI</li></ul>

对于ul元素每一项添加点击事件

*/(function () {var list = document.getElementById(‘mylinks‘);list.addEventlistener(‘click‘, function (event) {  switch (event.id) {    case "goSomewhere":        location.href = ‘http://www.wrox.com‘;        break;    case "doSomething":        document.title = "i change the document‘s title";        break;    case "sayHI":        alert(‘hi‘);    break;  }}, false);})();


6.1 移除事件处理程序: ??两种情况
?  ● ?删除了元素,但元素相关的事件处理程序还一直在内存中, 解除引用 ?设置为null
?  ● 在页面被卸载之前没有清理干净事件处理程序,他就会滞留在内存中,尤其实在两个界面来回切换时(或者刷新时),内存中的对象数目就会增加


7.模拟事件
用js在任意时刻触发特定的事件,在测试web应用程序时极其有用
DOM中事件模拟 ??在document上创建 ?createEvent () ?接受一个参数 ????需要创建事件的字符串类型:
?  ● UIevents ??一般的UI事件 ?鼠标 ?键盘事件继承自UI事件 ??DOM3中UIevent
?  ● MouseEvents 鼠标事件 ???DOM3级中时MouseEvent
?  ● MutationEvents一般的DOM变动事件 ???DOM3中时MutationEvent
?  ● HTMLevents ???一般的HTML事件

// 模拟鼠标事件var btn=document.getElementById(‘myBtn‘);// 创建事件对象var event=document.createEvent(‘MouseEvents‘);// 初始化事件对象event.initMouseEvent("click",true,true,document.defaultView,0,0,0,0,0,false,false,false,false,0,null);// 触发事件btn.dispatchEvent(event);

JS事件

原文地址:http://www.cnblogs.com/sundjly/p/7899027.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved