javascript 跨浏览器开发经验总结(五) js 事件

 更新时间:2010年05月19日 19:02:33   作者:  
javascript 跨浏览器开发之js 事件的兼容性问题,需要的朋友可以参考下。
简单事件模型和高级事件模型

简单事件模型和高级事件模型简单事件,就是事件与页面元素直观的绑定在一起的形式,如:
复制代码 代码如下:

<div onclick="alert(this.innerHTML);">
element.onclick = function(){alert(this.innerHTML);}

只要不是用了个别浏览器独有的事件,一般的click,mouseover事件等在各浏览器中都可以这么使用。

但是当一个事件需要绑定多个监听,或者需要动态注册/移出监听时,简单事件模型就不够用了,需要使用高级事件模型(IE和其他浏览器在使用高级事件模型时就有区别了):
复制代码 代码如下:

//注册
function addEventHandler(element, evtName, callback, useCapture) {
//DOM标准
if (element.addEventListener) {
element.addEventListener(evtName, callback, useCapture);
} else {
//IE方式,忽略useCapture参数
element.attachEvent('on' + evtName, callback);
}
}

//移除
function removeEventHandler(element, evtName, callback, useCapture) {
//DOM标准
if (element.removeEventListener) {
element.removeEventListener(evtName, callback, useCapture);
} else {
//IE方式,忽略useCapture参数
element.dettachEvent('on' + evtName, callback);
}
}



标签中onclick事件与href属性的调用顺序关系
在a标签响应点击事件时,会先进行onclick事件的响应,再执行href中的跳转方法。如以下标签点击后会先后提示“button”和“href”:

<a href=”javascript:alert(“href”);” onclick="alert(this.innerHTML);"> button </a>

但是,最好不要在href中定义具体的javascript方法,因为这个是定义跳转的链接地址的属性,如果需要先后执行两个javascript方法,应该这样写:

<a href=”#” onclick="alert(this.innerHTML); alert(“href”);"> button </a>

但是上面的写法中如果onclick绑定的响应方法中并没有提交请求跳转至别的页面,那么会发现当前网页做了一次刷新,因为以上代码中href=“#”表示跳转到当前页的顶部,但是并没有发出新的html请求。有的时候,我们并不希望页面在响应onclick事件后又跳回顶部(尤其是页面高度较长,出现滚动条,并且该链接位于页面底部时,跳转至顶部后用户还需要拖动滚动条找回原来位置继续操作时),那么应该在onclick后返回false值,阻止继续进行href定义的动作,如:

<a href=”#” onclick="alert(this.innerHTML); alert(“href”);return false;"> button </a>

或者将#替换成空的javascript语句:

<a href=”javascript:void(0)” onclick="alert(this.innerHTML); alert(“href”);"> button </a>


onload事件的调用顺序

有的时候在页面初始化时需要调用一些脚本来设置页面元素的初始状态,最标准的做法是用<body onload=””>方式或者document.onload方式调用。onload的事件的触发会在页面元素渲染完毕之后调用,这样就保证了不会出现脚本执行时找不到未渲染的页面元素的情况。如果是在<head>区域的<script>块中执行脚本,并使用了页面元素时,就很有可能出现找不到元素的错误。如果是在<body>区域的<script>块中执行脚本,只能使用该<script>块之前的页面元素,因为<body>区域的元素基本是顺序解析的。


onchange事件

<input>元素和<select>的<option>元素都支持onchangge事件,但是经常我们会发现元素的内容值变化了却没有触发onchangge事件。这是因为onchange事件的触发还有另一个条件:当前元素处于失去焦点(onblur)的状态。所以,onchange事件只能捕获用户操作时的值变化,对于使用javascript脚本动态改变元素value的情况,它是捕获不到的。

事件截获

因除了IE之外的浏览器不能识别window.event所以要使用以下方式来获取当前事件和事件发生的目标元素:
var evt = e?e:(window.event?window.event:null);
var el = evt.srcElement?evt.srcElement:evt.target;

这里有一些其它相关的文章,非常值得参考下
JavaScript Event事件学习第一章 Event介绍
javascript 跨浏览器的事件系统

相关文章

  • JS promise解决异步问题过程详解

    JS promise解决异步问题过程详解

    Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息
    2023-04-04
  • JavaScript判断浏览器及其版本信息

    JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 分享5个JavaScript的写法小技巧

    分享5个JavaScript的写法小技巧

    写代码的时候总有一些东西是会重复出现的,次数多了你就会想找找捷径了,下面这篇文章主要给大家介绍了关于5个JavaScript的写法小技巧,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • JS中数组重排序方法

    JS中数组重排序方法

    在数组中有两个可以用来直接排序的方法,分别是reverse()和sort()。下面通过本文给大家详细介绍,对js 数组重排序相关知识感兴趣的朋友一起看看吧
    2016-11-11
  • JS异步加载的三种实现方式

    JS异步加载的三种实现方式

    本篇文章主要介绍了JS异步加载的三种实现方式,有些时候我们需要JS异步加载,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-03-03
  • JS 仿腾讯发表微博的效果代码

    JS 仿腾讯发表微博的效果代码

    这篇文章主要介绍了JS 仿腾讯发表微博的效果代码,有需要的朋友参考一下
    2013-12-12
  • 在iframe中使bootstrap的模态框在父页面弹出问题

    在iframe中使bootstrap的模态框在父页面弹出问题

    这篇文章主要介绍了在iframe中使bootstrap的模态框在父页面弹出问题,解决方法非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-08-08
  • 前端页面禁止别人调试的方法

    前端页面禁止别人调试的方法

    这篇文章主要介绍了前端页面禁止别人调试的方法的相关资料,需要的朋友可以参考下
    2023-03-03
  • 让任务管理器中的CPU跳舞的js代码

    让任务管理器中的CPU跳舞的js代码

    下面的代码就是利用js控制cpu的占有率,实现时高时低效果
    2008-11-11
  • JS获取并操作iframe中元素的方法

    JS获取并操作iframe中元素的方法

    JS获取并操作iframe中元素的方法,需要的朋友可以参考一下
    2013-03-03

最新评论