이벤트 모델은 browser_javascript 팁에 따라 다릅니다.
标准参考
根据 W3C DOM 2 Events 描述,EventTarget 接口被所有支持 DOM 事件模型的节点(Node)实现。 该接口提供了 'addEventListener' 和 'removeEventListener' 方法,用来绑定或解绑一个 EventListeners 接口到一个 EventTarget。
DOM 2 Events 中定义了 Event 接口,用来提供事件的上下文信息,它提供了若干标准属性和方法。 实现 Event 接口的对象一般作为第一个参数传入事件处理函数,以用来提供当前事件相关的一些信息。
DOM 2 事件模型允许 DOM 实现支持事件的多模块,如果有必要,事件模型允许附加新的事件模块。 为了共同使用性的目的,DOM 会定义一个包含低级别的,依赖设备的事件模块、一个 UI 逻辑事件模块和一个文档变化事件模块的 UI 事件模块。 第三方实现(比如浏览器厂商)在定义一个新类型事件的时候,事件名称一定不能使用大小写无关的 'DOM' 字符串作开头,该前缀是为未来的 DOM 事件模块保留的。
DOM 2 已经定义了一个 UI 事件类型模块和一个鼠标事件类型的模块,它们分别对应 U이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent 和 MouseEvent 接口。 这两个接口提供了若干标准属性和方法,以获知事件发生时的一些信息。
关于 EventTarget 接口的详细信息,请参考 DOM 2 Events 1.3. Event listener registration。
关于 Event 接口的详细信息,请参考 DOM 2 Events 1.4. Event interface。
关于事件模块的详细信息,请参考 DOM 2 Events 1.6. Event module definitions。
问题描述
各浏览器对元素绑定、解绑事件监听器的方法,事件对象的获取,以及 Event 对象的实现上存在差异。
造成的影响
如果使用某浏览器特有的事件相关的属性及方法编写代码,则可能造成兼容性问题,导致代码报错,功能失效。
受影响的浏览器
所有浏览器 |
---|
问题分析
1. 只有 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. Opera 支持使用 'attachEvent' 和 'detachEvent' 方法绑定和解绑事件监听器
根据 DOM 2 Events 中描述,节点使用 'addEventListener' 和 'removeEventListener' 方法绑定和解绑事件监听器,但 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.6 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.7 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.8 不支持这两个方法, 而使用 'attachEvent' 和 'detachEvent' 方法作为替代方案,Opera 两类方法都支持。Chrome Safari Firefox 只支持标准方法。
分析以下代码:
<button id="add" type="button">add event listener test</button> <button id="remove" type="button">remove event listener test</button> <div id="info"></div> <script type="text/javascript"> var add = document.getElementById("add"), remove = document.getElementById("remove"), showMsgA = function(){showMsg("attachEvent")}, showMsgB = function(){showMsg("addEventListener")}; if(add.attachEvent){ add.attachEvent("onclick",showMsgA); remove.attachEvent("onclick",removeE); } if(add.addEventListener){ add.addEventListener("click",showMsgB,false); remove.addEventListener("click",removeE,false); } function removeE(){ if(add.detachEvent){ add.detachEvent("onclick",showMsgA); showMsg("detachEvent"); } if(add.removeEventListener){ add.removeEventListener("click",showMsgB,false); showMsg("removeEventListener"); } } function showMsg(method){ document.getElementById("info").innerHTML += ("support " + method + "<br />"); } </script>
依次点击 'add event listener test' >> 'remove event listener test' >> 'add event listener test',测试各浏览器对这些方法的支持,结果如下:
이벤트 모델은 browser_javascript 팁에 따라 다릅니다.6 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.7 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.8 | ![]() |
---|---|
Opera | ![]() |
Chrome Safari Firefox | ![]() |
关于 'addEventListener' 和 'attachEvent' 有几点需要注意:
- 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 不支持在捕获阶段触发事件监听器,'attachEvent' 方法没有提供参数说明是否响应在捕获阶段触发的事件;
- 'addEventListener' 和 'attachEvent' 都可以注册多个事件监听器;
- 在 Firefox Chrome Safari Opera 中给同一事件注册同一个事件监听器多次,重复注册的会被丢弃;而在 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 中重复注册的事件监听器会被重复执行多次;
- 当给同一元素注册了多个事件监听器的时候,이벤트 모델은 browser_javascript 팁에 따라 다릅니다.6 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.7 的事件监听器执行顺序是随机的,이벤트 모델은 browser_javascript 팁에 따라 다릅니다.8 是倒序的,Firefox Chrome Safari Opera 是顺序的;
- 当元素注册的事件监听器中有非法的事件监听器时(非函数),在 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. Firefox 中会抛出异常,而在 Chrome Safari Opera 中则会忽略非法的事件监听器,继续执行其他的事件监听器。
2. 各浏览器获取事件对象的差异
DOM 2 Events 中规定使用事件监听器的第一个参数作为事件对象,而 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. Opera Chrome Safari 还支持通过 window.event 获取事件对象。
分析以下代码:
<button type="button" id="attach">attachEvent</button> <button type="button" id="addE">addEventListener</button> <button type="button" id="byclick">onClick</button> <br> INFO : <div id="info"></div> <script type="text/javascript"> function $(id){return document.getElementById(id);} var attach = $("attach"), addE = $("addE"), byClick = $("byclick"); attach.attachEvent && attach.attachEvent("onclick", handler); addE.addEventListener && addE.addEventListener("click", handler, false); byClick.onclick = handler; function handler(){ var src = window === this ? window.event.srcElement : this, type = src.innerHTML; window.event && showMsg(window.event.type, type + " + window.event"); arguments[0] && showMsg(arguments[0].type, type + " + arguments[0]"); } function showMsg(type, msg){ $("info").innerHTML += (msg + "(type : " + type + ")<br />"); } </script>
以上代码组合不同的事件监听器绑定方式和事件对象获取方法,测试各浏览器的支持程度。
依次点击 'attachEvent' >> 'addEventListener' >> 'onClick',结果如下:
이벤트 모델은 browser_javascript 팁에 따라 다릅니다.6 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.7 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.8 | ![]() |
---|---|
Chrome Safari | ![]() |
Opera | ![]() |
Firefox | ![]() |
汇总测试结果如下表:1
事件对象获取方式 | 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.6 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.7 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.8 | Chrome Safari | Opera | Firefox |
---|---|---|---|---|
window.event | Y | Y | Y | N |
arguments[0] | Y2 | Y | Y | Y |
注1: Y 表示支持该事件对象获取方式,N 表示不支持。
注2: 部分支持。
从上表出可以看出:
- 只有在使用 attachEvent 方法注册事件监听器的时候,이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 才支持使用事件监听器传入的第一个参数作为事件对象的方式;
- Chrome Safari Opera 两种获取事件对象的方式都支持;
- Firefox 只支持获取事件对象的标准方式。
3. 各浏览器中事件对象的属性和方法的差异
이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 对事件对象的标准属性和方法支持有限,针对大部分属性和方法,이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 都提供了一套替代非标准的替代方案; 而 Firefox Chrome Safari Opera 除了全面支持事件对象的标准属性和方法外,还在不同程度上支持了 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 提供的非标准替代方案。
以下代码检测了 Event、U이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent、MouseEvent 接口以及事件对象的非标准属性在各浏览器下的支持程度:
<button type="button" id="iEvent">Interface Event</button> <button type="button" id="iUIMouse">Interface U이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent & MouseEvent</button> <input type="text" id="nosK"> <p id="wrap" style="border:3px solid;padding:5px;width:500px;"><a id="nosCM" href="#"><img src="/static/imghw/default1.png" data-src="google.gif" class="lazy" alt="이벤트 모델은 browser_javascript 팁에 따라 다릅니다."></a></p> <br>
Interface Event | |
---|---|
Interface U이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent & MouseEvent |
|
Non-standard & click |
|
Non-standard & mouseover mouseout |
|
Non-standard & keyCode |
执行以上测试代码,分别点击 'Interface Event' 按钮、'Interface U이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent & MouseEvent' 按钮和图片,鼠标移到图片上再移开,在文本框中输入 'a',得到结果整理如下表:3
Interface & Non-standard | Property & method | 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.6 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.7 이벤트 모델은 browser_javascript 팁에 따라 다릅니다.8 | Chrome Safari Opera | Firefox |
---|---|---|---|---|
Interface Event | type | Y | Y | Y |
target | N | Y | Y | |
currentTarget | N | Y | Y | |
eventPhase | N | Y | Y | |
bubbles | N | Y | Y | |
cancelable | N | Y | Y | |
timeStamp | N | Y | Y | |
initEvent | N | Y | Y | |
preventDefault | N | Y | Y | |
stopPropagation | N | Y | Y | |
Interface U이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent | view | N | Y | Y |
detail | N | Y | Y | |
initU이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent | N | Y | Y | |
Interface MouseEvent | screenX | Y | Y | Y |
screenY | Y | Y | Y | |
clientX | Y | Y | Y | |
clientY | Y | Y | Y | |
ctrlKey | Y | Y | Y | |
shiftKey | Y | Y | Y | |
altKey | Y | Y | Y | |
metaKey | N | Y | Y | |
button | Y | Y | Y | |
relatedTarget | N | Y | Y | |
initMouseEvent | N | Y | Y | |
Non-standard | cancelBubble | Y | Y | Y |
offsetX | Y | Y | N | |
offsetY | Y | Y | N | |
returnValue | Y | Y | N | |
srcElement | Y | Y | N | |
x | Y | Y | N | |
y | Y | Y | N | |
fromElement | Y | Y | N | |
toElement | Y | Y | N | |
keyCode | Y | Y | Y |
注3: Y 代表事件对象支持该属性或方法,N 代表不支持。
从上表中可以看出:
- 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 支持事件对象的所有非标准属性,不支持除 'type' 外 Event 接口的所有方法属性及方法,不支持 U이벤트 모델은 browser_javascript 팁에 따라 다릅니다.vent 接口的所有属性和方法,不支持 MouseEvent 接口的 'metaKey'、'relatedTarget' 属性和 'initMouseEvent' 方法;
- Chrome Safari Opera 支持事件对象的所有标准及非标准的属性和方法;
- Firefox 支持事件对象的所有标准属性和方法,但仅支持非标准属性中的 'cancelBubble' 和 'keyCode'。
需要注意的是:
- Firefox 不支持事件对象的 'returnValue' 属性,测试样例中虽然显示 'returnValue' 值为 false,但这仅仅是因为给事件对象添加了 'returnValue' 属性,并没有起到取消事件默认动作的作用,这从地址栏可以看出,多了 '#' 号,这是 A 标签的 'href' 属性造成的。
- 各浏览器对 Event 接口的 'timeStamp' 属性返回值都不同。
关于 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 实现的事件对象非标准的属性及方法的详细信息,请参考 MSDN event Object。
关于 Firefox 对事件对象实现的详细信息,请参考 MDC event。
解决方案
1. 使用特性判断创建无兼容性问题的事件监听器绑定和解绑函数
如:
function addEvent(elem, type, handler, useCapture){ elem.addEventListener ? elem.addEventListener(type, handler, useCapture) : elem.attachEvent("on" + type, handler); } function removeEvent(elem, type, handler, useCapture){ elem.removeEventListener ? elem.removeEventListener(type, handler, useCapture) : elem.detachEvent("on" + type, handler); }
2. 使用特性判断获得有效的事件对象
在事件监听器中判断传入的第一个参数或 window.event 是否有效,如:
function handler(e){ e = e || window.event; }
3. 使用特性判断使用与标准对应的非标准方法及属性
尽管 이벤트 모델은 browser_javascript 팁에 따라 다릅니다. 对事件对象的标准属性和方法支持有限,但它自己实现的事件模型也基本能够替代或实现标准属性或方法的功能。
下表总结了部分与标准事件对象对应的,或可以实现标准属性或方法功能的非标准属性:
Standard | Non-standard |
---|---|
target | srcElement |
preventDefault() | returnValue |
stopPropagation() | cancelBubble |
relatedTarget | fromElement toElement |
另,标准的 'clientX' 属性和非标准的 'x' 属性作用是相同的,同样 'clientY' 和 'y' 也是。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











JavaScript 문자열 교체 방법 및 FAQ에 대한 자세한 설명 이 기사는 JavaScript에서 문자열 문자를 대체하는 두 가지 방법 인 내부 JavaScript 코드와 웹 페이지의 내부 HTML을 탐색합니다. JavaScript 코드 내부의 문자열을 교체하십시오 가장 직접적인 방법은 대체 () 메소드를 사용하는 것입니다. str = str.replace ( "find", "replace"); 이 메소드는 첫 번째 일치 만 대체합니다. 모든 경기를 교체하려면 정규 표현식을 사용하고 전역 플래그 g를 추가하십시오. str = str.replace (/fi

그래서 여기 당신은 Ajax라는이 일에 대해 배울 준비가되어 있습니다. 그러나 정확히 무엇입니까? Ajax라는 용어는 역동적이고 대화식 웹 컨텐츠를 만드는 데 사용되는 느슨한 기술 그룹을 나타냅니다. 원래 Jesse J에 의해 만들어진 Ajax라는 용어

10 재미있는 jQuery 게임 플러그인 웹 사이트를보다 매력적으로 만들고 사용자 끈적함을 향상시킵니다! Flash는 여전히 캐주얼 웹 게임을 개발하기위한 최고의 소프트웨어이지만 JQuery는 놀라운 효과를 만들 수 있으며 Pure Action Flash 게임과 비교할 수는 없지만 경우에 따라 브라우저에서 예기치 않은 재미를 가질 수 있습니다. jQuery tic 발가락 게임 게임 프로그래밍의 "Hello World"에는 이제 jQuery 버전이 있습니다. 소스 코드 jQuery Crazy Word Composition 게임 이것은 반은 반은 게임이며, 단어의 맥락을 알지 못해 이상한 결과를 얻을 수 있습니다. 소스 코드 jQuery 광산 청소 게임

기사는 JavaScript 라이브러리 작성, 게시 및 유지 관리, 계획, 개발, 테스트, 문서 및 홍보 전략에 중점을 둡니다.

이 튜토리얼은 jQuery를 사용하여 매혹적인 시차 배경 효과를 만드는 방법을 보여줍니다. 우리는 멋진 시각적 깊이를 만드는 계층화 된 이미지가있는 헤더 배너를 만들 것입니다. 업데이트 된 플러그인은 jQuery 1.6.4 이상에서 작동합니다. 다운로드

이 기사는 브라우저에서 JavaScript 성능을 최적화하기위한 전략에 대해 설명하고 실행 시간을 줄이고 페이지로드 속도에 미치는 영향을 최소화하는 데 중점을 둡니다.

이 기사에서는 jQuery 및 Ajax를 사용하여 5 초마다 DIV의 컨텐츠를 자동으로 새로 고치는 방법을 보여줍니다. 이 예제는 RSS 피드의 최신 블로그 게시물을 마지막 새로 고침 타임 스탬프와 함께 가져오고 표시합니다. 로딩 이미지는 선택 사항입니다

Matter.js는 JavaScript로 작성된 2D 강성 신체 물리 엔진입니다. 이 라이브러리를 사용하면 브라우저에서 2D 물리학을 쉽게 시뮬레이션 할 수 있습니다. 그것은 단단한 몸체를 생성하고 질량, 면적 또는 밀도와 같은 물리적 특성을 할당하는 능력과 같은 많은 기능을 제공합니다. 중력 마찰과 같은 다양한 유형의 충돌 및 힘을 시뮬레이션 할 수도 있습니다. Matter.js는 모든 주류 브라우저를 지원합니다. 또한, 터치를 감지하고 반응이 좋기 때문에 모바일 장치에 적합합니다. 이러한 모든 기능을 사용하면 엔진 사용 방법을 배울 수있는 시간이 필요합니다. 이는 물리 기반 2D 게임 또는 시뮬레이션을 쉽게 만들 수 있습니다. 이 튜토리얼에서는 설치 및 사용을 포함한이 라이브러리의 기본 사항을 다루고
