`
joshuaton
  • 浏览: 27130 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript中onclick在各种浏览器下的差异

阅读更多

在Dom Level1中没有定义事件模型,在Dom Level2中定义了事件模型一个较小的子集,在Dom Level3(2004)中事件才被完整定义。
        由于IE还没有对于Dom Level1的完整支持,所以当前的浏览器主要存在IE和DOM两种不同的事件模型。这直接导致了事件处理成为JS跨浏览器编程中差异最大的部分。还好除 了IE之外,Mozilla FireFox、Opera、Safari都统一实现了Dom Level2定义的事件模型。
        本文尝试总结关于事件处理的所有相关要点,包括添加删除事件、得到事件对象、得到触发事件的对象、捕获和冒泡事件流、终止事件流、阻止某个事件的默认行为等等。

一、添加事件的方式
1.写在HTML元素标签内:
<div onclick="clk()" id="testDiv">click me!</div>
<script>
   function clk(){
        alert(1);
   }
</script>
2.JS得到页面元素后直接指定:
<script>
   var oDiv = document.getElementById("testDiv");
   oDiv.onclick = clk;
   //或者
   oDiv.onclick = function(){
        alert(1);
   }
</script>
3.JS为一个元素的一个事件添加多个处理函数:
<script>
   var oDiv = document.getElementById("testDiv");
//for IE
   oDiv.attachEvent("onclick",clk);
   oDiv.detachEvent("onclick",clk);
//for DOM(FireFox,Opera..)
   oDiv.addEventListner("click",clk,false)
   oDiv.removeEventListner("click",clk,false)
</script>

注意:
1.对于Dom中增删事件处理函数的第三个boolean参数稍后解释,一般情况下false就好了。
2.在第2、3种方法中,指定事件处理函数为clk而不能写成clk(),任何方法在任何位置其后加上()表示对这个方法的一次运行。这也造成了对于添加的事件处理方法无法添加参数,只能是一个无参数调用。
3.第3种方法中,IE的事件名称一"on"开头如"onclick",而Dom的事件类型没有如"click"。
4.另外强调一点,使用document.getElementById("testDiv");这样的语句最好要在页面文档完全载入之后 (window.onload内,后续方法掉用内),至少要在这个Div的定义之下,浏览器对于页面文件的解释顺序这里不详细叙述。只是强调一下严重性, 例如这段代码,<div id="testDiv"><script>var oDiv = document.getElementById("testDiv");</script></div>对于IE来讲是致命 的,很可能你会得到一个系统进程错误,然后所有IE窗口消失。

二、如何得到事件对象
对于IE:事件对象是全局对象,window.event就可以得到这个对象
对于Dom:事件根据添加事件处理函数的方法不同而略有区别。
相对上面提到的第2,3中添加事件的方法,浏览器会隐式自动把event作为事件处理函数传给处理函数,通过arguments[0]可以得到。
而对于第1种方法需要这样写<div onclick="clk(event)" id="testDiv">click me!</div>需要将event作为clk的一个参数传回来,为了和其他事件添加保持一致处理方便,建议将其作为第一个参数。
这样我们就可以通过一句话来处理浏览器差异:
var oEvent = window.event?window.event:arguments[0];

三、如何得到触发事件的元素
当我们获得事件对象oEvent之后我们希望得到触发这个事件的页面元素
对于IE:oEvent.srcElement
对于DOM:oEvent.target
同样写成一句话:oSrc = oEvent.srcElement?oEvent.srcElement:oEvent.target;

虽然很简单,这里还是需要有些细节需要特别注意的:
        对于这样的一段HTML<div onclick="clk(event)" id="outerDiv"><div id="innerDiv">testSrc</div></div>  
        虽然onclick事件是attach到outerDiv上的,但是当你点击文字"testSrc"触发事件并通过上面那句话得到的oSrc并不是outerDiv,而是实际触发的对象。
        更特别的是,对于实际触发事件的对象在IE和DOM两种模型下还有所不同,因为Dom标准中文本节点可以触发事件的而IE不可以,所以在IE下oSrc是 innerDiv(oSrc.nodeType==1),而在Dom下oSrc是内容为"testDiv"的文本节点 (oSrc.nodeType==3)。
        这会造成一定的困扰,当你的目标想要得到outerDiv时,建议使用这种写法:<div onclick="clk(event,this)" id="outerDiv"><div id="innerDiv">testSrc</div></div>这样,你甚至可以不去理会event对象,而事件处 理函数传入的this即是指向outerDiv的指针。
        当然这只是针对第1种添加事件的方法而言,而针对不可以传入参数的第2,3种添加事件方法则没有什么好办法,一直向上查找parentNode直到找到为止吧。

这里可以看出三种添加事件的方法是各有短长的,根据实际情况来选择应用吧。

四、事件对象还包含哪些信息
这块儿的东西我最不喜欢写,东西挺多浏览器差异大我记住的很少。
把我用比较多的列出来,而且基本上这些各个浏览器是一致的。
oEvent.type 事件类型 click、mouseover等等
oEvent.clientX oEvent.clientY 鼠标事件触发的坐标(相对于浏览器窗口)
oEvent.screenX oEvent.screenY 鼠标时间触发的坐标(相对于屏幕)
oEvent.keyCode 键盘事件按键代码
oEvent.altKey oEvent.ctrlKey oEvent.shiftKey 事件发生时alt、ctrl、shift键是否按下

分享到:
评论

相关推荐

    事件模型在各浏览器中存在差异

    这种差异意味着开发者在编写跨浏览器兼容的JavaScript代码时需要格外小心。使用浏览器特有方法编写的代码可能在其他浏览器中无法正常工作,可能导致错误或功能缺失。例如,下面的代码片段展示了如何在不同浏览器中...

    IE8的JavaScript点击事件(onclick)不兼容的解决方法

    在标准模式下,IE8及以下版本不支持通过`setAttribute`直接为元素添加事件监听器,这与现代浏览器如Chrome和Firefox存在差异。为了确保兼容性,通常推荐使用`addEventListener`方法为元素添加事件监听器,但由于IE8...

    元素的内联事件处理函数的特殊作用域在各浏览器中存在差异

    但是,这个作用域链在不同浏览器中可能存在差异。例如,某些浏览器可能还会将表单对象添加到作用域链中,允许事件处理函数直接访问表单属性,如`method`: ```html &lt;input type="button" value="method" onclick=...

    js日历控件,兼容各种浏览器

    - 使用成熟的JavaScript库,如jQuery,它已经处理了许多浏览器差异。 - 使用`addEventListener`或`attachEvent`(IE)添加事件监听器,确保事件处理函数在所有浏览器中都能工作。 - 检查浏览器特性,使用`...

    开发跨浏览器JavaScript时要注意的问题

    不同的浏览器对JavaScript的支持程度不一,尤其是在处理DOM元素时,开发者需要特别注意一些细节,确保代码能够在各种浏览器中正常运行。本文将详细介绍在开发跨浏览器JavaScript时需要注意的关键问题,并给出相应的...

    Javascript下IE与Firefox下的差异兼容写法总结

    在编写跨浏览器的JavaScript代码时,我们常常会遇到不同浏览器在实现Web标准时存在的差异问题。例如,在IE和Firefox两个浏览器中,它们的JavaScript实现有着明显的区别。本文将针对这些差异进行总结,并给出相应的...

    js日历控件兼容所有浏览器

    在过去,IE、Firefox、Chrome、Safari和Opera等浏览器对JavaScript的解析和执行存在显著差异。例如,Internet Explorer在某些版本中对CSS和DOM的处理与其他浏览器不一致,这可能导致日历控件在样式渲染和交互功能上...

    javascript各浏览器中option元素的表现差异

    JavaScript在不同浏览器中处理`&lt;option&gt;`元素时存在一些显著的行为差异,这主要涉及事件处理、事件源获取以及特定属性的兼容性问题。下面将详细解释这些差异。 1. **事件支持**: - Internet Explorer (IE) 6、7、...

    JavaScript中常见的一些事件

    然而,由于不同浏览器对事件的支持程度存在差异,开发者在实际应用中需要考虑使用polyfills或库(如jQuery)来实现更广泛的浏览器兼容性。此外,随着Web技术的不断演进,一些新的事件和API(如Intersection Observer...

    Javascript中浏览器窗口的基本操作总结

    JavaScript中的浏览器对象模型(BOM,Browser Object Model)是一个用于管理浏览器窗口以及窗口间通信的接口,其中...在实际开发中,为了确保代码能在各种浏览器环境下正常工作,通常需要进行兼容性检查和适当的处理。

    javascript ppt(完全版)

    JavaScript不是Java的简化版,它们在逻辑运算符、变量声明和对象调用上有差异;JavaScript主要通过浏览器执行,而Java需要Java虚拟机支持。 在编写JavaScript时,可以选择多种工具,包括Microsoft FrontPage、...

    javascript实现删除前弹出确认框

    例如,在某些旧的浏览器中,你可能需要使用`window.event.returnValue`来确保在`onclick`中返回值能正确地阻止默认行为: ```html ***" onclick="if(!confirm('确认要删除?')) window.event.returnValue=false;"&gt;...

    JavaScript兼容浏览器FFIE技巧[定义].pdf

    在JavaScript编程中,确保代码在不同的浏览器环境下都能正常工作是一项重要的任务。由于Firefox(MF/FF)和Internet Explorer(IE)对JavaScript的支持存在差异,因此需要采取特定的兼容性策略。以下是一些关键的...

    详细解读JavaScript的跨浏览器事件处理

    由于不同浏览器对于事件处理的支持存在差异,因此为了确保代码能够在所有浏览器中正常工作,需要采取一些特殊的措施。以下是一些关键知识点,详细解读了JavaScript的跨浏览器事件处理方法。 ### 一、获取事件对象 ...

    javascript在firefox与ie下的兼容性总结

    由于这两个浏览器内核的不同,导致在处理某些JavaScript特性时存在差异。以下是一些常见的兼容性问题及其解决方案: 1. **Document.form.item 问题** - 问题描述:在IE中,可以通过`document.formName.item(...

    纯JavaScript实现的兼容各浏览器的添加和移除事件封装

    不同的浏览器对事件处理的支持存在差异,尤其是在早期的版本中,Internet Explorer(IE)与非IE浏览器(如Firefox、Chrome等)的实现方式有所不同。为了确保代码在各个浏览器中都能正常工作,开发者需要进行一定的...

    JavaScript讲义

    JavaScript运行在浏览器的JavaScript引擎中,与Java语言虽名字相似,但两者完全不同,Java由SUN公司开发,运行在Java虚拟机(JVM)上。 JavaScript在网页中的应用主要分为三大部分:ECMAScript、DOM和BOM。...

    javascript兼容性解决方法大全

    然而,由于各个浏览器的实现差异,JavaScript在不同浏览器上的兼容性问题一直是开发者面临的一大挑战。本文将深入探讨如何解决JavaScript在Firefox(FF)和Internet Explorer(IE)等浏览器之间的兼容性问题。 首先...

    关于 onclick 与 bind ‘click’ 的讨论

    通过分析这个文件,我们可以进一步了解这两种事件处理方式在实际项目中的运用和差异。 总之,`onclick`和`bind('click')`是处理点击事件的两种不同策略,前者适合快速原型和简单场景,后者更适合大型项目和复杂交互...

Global site tag (gtag.js) - Google Analytics