JavaScript와 HTML 간의 상호작용은 이벤트를 통해 이루어집니다. JavaScript는 비동기 이벤트 기반 프로그래밍 모델을 사용합니다. 문서, 브라우저, 요소 또는 이와 관련된 개체에 특정한 일이 발생하면 브라우저가 이벤트를 생성합니다. JavaScript가 특정 유형의 이벤트에 관심이 있는 경우 해당 유형의 이벤트가 발생할 때 호출될 핸들러를 등록할 수 있습니다.
이벤트 흐름
이벤트 흐름은 페이지에서 이벤트가 수신되는 순서를 설명합니다. 예를 들어 두 개의 중첩된 div가 있고 내부 div가 클릭되면 내부 div가 클릭 이벤트를 먼저 트리거합니까, 아니면 외부 div를 트리거합니까? 현재 3가지 주요 모델이 있습니다
IE의 이벤트 버블링: 이벤트는 처음에 가장 구체적인 요소에 의해 수신된 다음 덜 구체적인 요소로 위쪽으로 전파됩니다.
Netscape의 이벤트 캡처: 이벤트 버블링과 달리 덜 구체적인 노드는 이벤트를 더 일찍 수신하고 가장 구체적인 요소는 이벤트를 마지막에 수신합니다.
DOM 이벤트 흐름: DOM 레벨 2 이벤트는 이벤트 흐름이 대상 단계에 있는 이벤트 캡처 단계와 이벤트 버블링 단계의 세 단계를 포함한다고 규정합니다. 이벤트를 가로챌 수 있는 기회가 주어지고, 실제 대상이 이벤트를 받게 되며, 마지막으로 버블 문장 단계가 됩니다.
Opera, Firefox, Chrome, Safari는 모두 DOM 이벤트 스트리밍을 지원합니다. IE는 이벤트 스트리밍을 지원하지 않고 이벤트 버블링만 지원합니다
다음 html이 있다면 div 영역을 클릭하세요
이벤트 핸들러
이벤트 리스너라고도 합니다. 이벤트는 사용자나 브라우저 자체에 의해 수행되는 특정 작업입니다. 예를 들어 click, load, moseover 등은 모두 이벤트 유형(일반적으로 이벤트 이름이라고 함)이며, 이벤트에 응답하는 방법을 이벤트 핸들러 또는 이벤트 리스너 또는 이벤트 핸들러라고 합니다. 이벤트 유형.
이를 이해하고 요소에 이벤트 핸들러를 추가하는 방법을 살펴보겠습니다HTML 이벤트 핸들러 요소가 지원하는 각 이벤트는 해당 이벤트 핸들러와 동일한 이름을 가진 HTML 속성을 사용하여 지정할 수 있습니다. 이 속성의 값은 실행 가능한 JavaScript 코드여야 합니다.
버튼에 대한 클릭 이벤트 핸들러를 추가할 수 있습니다.
IE는 addEventListener 및 RemoveEventListener 메서드를 지원하지 않습니다. 대신 두 개의 유사한 메서드인 attachmentEvent 및 detachEvent를 구현합니다. 두 메서드 모두 이벤트 핸들러 이름과 이벤트 핸들러 메서드를 참조하므로 이벤트 핸들러 메서드가 지원됩니다. 추가된 프로그램은 버블링 단계에 추가될 예정입니다.
attachEvent를 사용하여 이벤트 핸들러를 추가하는 방법은 다음과 같습니다
attachEvent를 사용하여 추가된 이벤트 핸들러는 detachEvent를 통해 제거할 수 있습니다. 조건도 동일한 매개변수로 제거할 수 없습니다.
이전 콘텐츠에서 이벤트 핸들러를 추가하고 제거하는 방법이 브라우저마다 다르다는 것을 알 수 있습니다. 크로스 브라우저 이벤트 핸들러를 작성하려면 먼저 다양한 브라우저에서의 처리 차이점을 이해해야 합니다. 핸들러
이벤트 핸들러를 추가할 때 addEventListener와 AttachEvent 사이에는 몇 가지 주요 차이점이 있습니다.
1. 이것이 가장 직관적입니다. addEventListener에는 3개의 매개변수가 있고, AttachEvent에는 2개의 매개변수만 있습니다. addEventListener의 세 번째 매개변수는 추가된 이벤트 핸들러가 캡처 단계에서 처리되는지 아니면 버블링 단계에서 처리되는지를 결정할 수 있습니다. (일반적으로 브라우저 호환성을 위해 버블링 단계로 설정합니다.)
2. 첫 번째 매개변수는 다른 의미를 가집니다. addEventListener의 첫 번째 매개변수는 이벤트 유형(예: click, load)이고, attachmentEvent의 첫 번째 매개변수는 이벤트 처리 함수 이름(onclick, onload)을 지정합니다.
3. 이벤트 핸들러의 범위는 다릅니다. addEventListener의 범위는 트리거 요소를 참조하며, AttachEvent 이벤트 핸들러는 전역 변수에서 실행됩니다. 요소 ID가 아닌 정의되지 않은 값을 반환합니다
4. 하나의 이벤트에 여러 개의 이벤트 핸들러를 추가하는 경우 실행 순서가 다릅니다. addEventListener는 추가된 순서대로 추가되고,attachEvent는 불규칙한 순서로 여러 개의 이벤트 핸들러를 추가합니다(추가된 메소드가 거의 없는 경우 대부분 추가된 순서대로 실행됩니다.) 추가하는 순서는 역순으로 실행되지만 너무 많이 추가하면 불규칙해집니다.) 따라서 여러 개 추가할 때는 순서에 의존하지 않는 것이 좋습니다. 함수 실행 순서에 따라 달라지는 경우에는 브라우저에 의존하지 말고 직접 처리하는 것이 가장 좋습니다.
이 네 가지 차이점을 이해한 후 더 나은 브라우저 호환성으로 이벤트 핸들러를 추가하는 방법을 작성해 볼 수 있습니다
코드는 다음과 같습니다.
코드 복사
코드는 다음과 같습니다.
var btnClick = document.getElementById('btnClick ');addEvent(btnClick, 'click', handler);
event对象包含与创建它的特定事件有关的属性和方法,触发事件的类型不同,可用的属性和方法也不同,但是所有事件都会包含
属性/方法 |
类型 |
读/写 |
说明 |
bubbles | Boolean | 只读 | 事件是否冒泡 |
cancelable | Boolean | 只读 | 是否可以取消事件的默认行为 |
currentTarget | Element | 只读 | 事件处理程序当前处理元素 |
detail | Integer | 只读 | 与事件相关细节信息 |
eventPhase | Integer | 只读 | 事件处理程序阶段:1 捕获阶段,2 处于目标阶段,3 冒泡阶段 |
preventDefault() | Function | 只读 | 取消事件默认行为 |
stopPropagation() | Function | 只读 | 取消事件进一步捕获或冒泡 |
target | Element | 只读 | 事件的目标元素 |
type | String | 只读 | 被触发的事件类型 |
view | AbstractView | 只读 | 与事件关联的抽象视图,等同于发生事件的window对象 |
要阻止事件的默认行为,可以使用preventDefault()方法,前提是cancelable值为true,比如我们可以阻止链接导航这一默认行为
IE中的事件对象访问IE中的event对象有几种不同的方式,取决于指定事件处理程序的方法。直接为DOM元素添加事件处理程序时,event对象作为window对象的一个属性存在
属性/方法 |
类型 |
读/写 |
说明 |
cancelBulle | Boolean | 读/写 | 默认为false,设置为true后可以取消事件冒泡 |
returnValue | Boolean | 读/写 | 默认为true,设为false可以取消事件默认行为 |
srcElement | Element | 只读 | 事件的目标元素 |
type | String | 只读 | 被触发的事件类型 |
function getTarget(e) {
return e.target ||
function PreventDefault(e) {
e.preventDefault();
else
e.return 값 = false;
}
function stopPropagation(e) {
e.stopPropagation();
else
e.can celBubble = true;
}
1.load: 페이지가 완전히 로드될 때 창에서 트리거되거나, 이미지가 로드될 때 img 요소에서 트리거되거나, 삽입된 콘텐츠가 로드될 때 object 요소에서 트리거됩니다.
2.unload: 페이지 완전히 로드됨 제거 후 창에서 트리거되거나 포함된 콘텐츠가 제거된 후 개체 요소에서 트리거됩니다3.select: 사용자가 텍스트 상자에서 문자를 선택할 때 트리거됩니다
4.change: 포커스가 변경된 후 텍스트 상자의 값이 변경됩니다.
5.submit: 사용자가 양식을 제출할 때 트리거됩니다.
6.resize: 창 또는 프레임 크기가 변경될 때 창에서 트리거됩니다.
7.scool: 언제 사용자는 요소에서 스크롤 막대를 사용하여 요소를 스크롤합니다. Trigger
8.focus: 페이지나 요소가 포커스를 얻을 때 창과 해당 요소에서 트리거됩니다.
9.blur: 다음 경우 창과 해당 요소에서 트리거됩니다. 페이지 또는 요소가 포커스를 잃습니다
10.beforeunload: 이전에 창에서 트리거된 페이지를 언로드합니다.
11.mousewheel: HTML을 계산하지 않고, 사용자가 마우스 휠을 통해 페이지와 상호 작용하고 페이지를 세로로 스크롤할 때 트리거됩니다. 방향