이번에는 JS 이벤트 바인딩 및 이벤트 흐름 모델에 대한 사례 분석을 가져오겠습니다. JS 이벤트 바인딩 및 이벤트 흐름 모델을 사용할 때 주의 사항은 무엇입니까?
1. JS 이벤트
(1) JS 이벤트 분류
1. 마우스 이벤트:
click/dbclick/mouseover/mouseout
2. HTML 이벤트:
onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll
3. 키보드 이벤트:
keydown: 키보드 누름 Triggered when
keypress: 키보드를 누르고 떼는 순간에 트리거됩니다.
keyup: 키보드를 올릴 때 트리거
[주의사항]
①실행 순서: keydown 키누름 keyup
②키누름은 숫자, 문자, 기호 키만 캡처할 수 있으며 기능 키는 캡처할 수 없습니다.
3keydown 주기--길게 누를 때 키 누르기
4keydown이 있지만 반드시 keyup은 아닙니다. 길게 눌렀을 때 포커스가 사라지면 keyup이 더 이상 실행되지 않습니다.
⑤keypress는 대소문자를 구분하며 keydown, kewup은 다르지 않습니다.
4. 이벤트 요소:
이벤트가 실행되면 해당 이벤트가 호출하는 함수에 기본적으로 매개변수가 전달됩니다.
이 매개변수는 이벤트에 대한 다양한 세부 정보가 포함된 이벤트 요소입니다. .
document.onkeydown=function(e){ console.log(e); } document.onkeydown=function(){ console.log(window.event); }
//兼容浏览器的写法: document.onkeydown=function(e){ e==e||Window.event; var Code=e.keyCode||e.which||e.charCode; if(code==13){ //回车 } }
5. 키보드 키를 결정하는 방법은 무엇입니까?
①재시작 기능에서 이벤트 인자 e를 받습니다.
② e.key를 사용하여 누른 키 문자로 직접 이동할 수 있습니다(권장하지 않음).
3keyCode/which/charCode를 사용하여 키의 ASCII 코드 값을 가져올 수 있습니다.
(다양한 브라우저의 작성 방식과 호환)
var Code=e.keyCode||e.which||e.charCode; //判断组合键 var isAlt=0,isEnt=0; document.onkeyup=function(e){ if(e.keyCode==18){ isAlt=1; } if(e.keyCode==13){ isEnt=1; } if(isAlt==1&&isEnt==1){ alert("同时按下Alt和Enter键"); } } document.onkeyup=function(){ console.log("keyup"); } document.onkeypress=function(){ console.log("keypress"); } document.onkeydown=function(){ console.log("keydown"); } document.onkeypress=function(){ console.log(window.event); } //判断是否按下了回车键 document.onkeydown=function(e){ var code=e.keyCode; if(code==13){ alert("你输入的是回车键"); } }
(1) DOM0 이벤트 모델
바인딩 참고 사항:
①window.onload를 사용하여 로딩을 완료한 후 바인딩합니다.
window.onload =function(){//事件}
②몸체 뒤쪽에 위치시켜 바인딩합니다.
//body内容 <body> <button onclick="func()">内联模型绑定</button> <button id="btn1">哈哈哈哈</button> <button id="btn2">DOM2模型绑定</button> <button id="btn3">取消DOM2</button> </body>
1. 인라인 모델(인라인 바인딩): html 태그에서 속성의 속성 값으로 함수 이름을 직접 사용합니다.
<button onclick="func()">内联模型绑定</button>
단점: 콘텐츠와 동작의 분리에 대한 w3c의 기본 사양을 준수하지 않습니다.
2. 스크립트 모델(동적 바인딩): JS에서 노드를 선택한 다음 onclick 속성을 노드에 추가합니다.
document.getElementById("btn1")=function(){}
장점: 콘텐츠와 동작의 분리에 관한 w3c의 기본 사양을 준수하고 html과 js의 분리를 구현합니다.
단점: 동일한 노드는 동일한 유형의 이벤트를 한 번만 추가할 수 있습니다. 여러 번 추가하면 마지막 이벤트가 적용됩니다.
document.getElementById("btn1").onclick=function(){ alert(1234); } document.getElementById("btn1").onclick=function(){ alert(234); }//重复的只能出现最近的一次
3.DOM0에는 공통적인 단점이 있습니다. DOM0을 통해 바인딩된 이벤트는 바인딩되면 취소할 수 없습니다.
document.getElementById("btn3").onclick=function(){//不能取消匿名函数 if(btn.detachEvent){ btn.detachEvent("onclick",func1); }else{ btn.removeEventListener("click",func1); } alert("取消DOM2"); }
(2) DOM2 이벤트 모델
1. DOM2 이벤트 바인딩 추가:
①IE8 이전에는 .attachEvent("onclick", function) 사용
②IE8 이후에는 .addEventListener("click", function, true / false);
매개변수 3: false(기본값)는 이벤트 버블링을 의미하고, true를 전달하면 이벤트 캡처를 의미합니다.
③ 모든 브라우저 처리 방식과 호환 가능:
var btn=document.getElementById("btn1"); if(btn.attachEvent){ btn.attachEvent("onclick",func1);//事件,事件需要执行的函数IE8可以 }else{ btn.attachEventListener("click",func1); }
2. DOM2 바인딩의 장점:
① DOM2를 사용하여 동일한 노드가 동일한 유형의 여러 이벤트에 바인딩될 수 있습니다.
②DOM2를 사용하여 바인딩된 이벤트는 특수 기능을 사용하여 취소할 수 있습니다.
3. 이벤트 바인딩 취소:
① 바인딩하려면 attachmentEvent를 사용하고, 취소하려면 detachevent를 사용합니다.
② 바인딩하려면 AttachEventListener를 사용하고, 취소하려면 RemoveEventListenter를 사용하세요.
참고: DOM2에 바인딩된 이벤트를 취소해야 하는 경우 이벤트를 바인딩할 때 콜백 함수 는 함수 이름이어야 하며
익명 함수일 수 없습니다. 이벤트 취소 시 전달된 함수 이름은 다음과 같기 때문입니다. 취소.
3. JS 이벤트 흐름 모델
(1) JS의 이벤트 흐름 모델
1. 事件冒泡(fasle/不写):当触发一个节点的事件是,会从当前节点开始,依次触发其祖先节点的同类型事件,直到DOM根节点。
2. 事件捕获(true):当初发一个节点的事件时,会从DOM根节点开始,依次触发其祖先节点的同类型事件,直到当前节点自身。
3. 什么时候事件冒泡?什么时候事件捕获?
① 当使用addEventListener绑定事件,第三个参数传为true时表示事件捕获;
② 除此之外的所有事件绑定均为事件冒泡。
4. 阻止事件冒泡:
① IE10之前,e.cancelBubble = true;
② IE10之后,e.stopPropagation();
5. 阻止默认事件:
① IE10之前:e.returnValue = false;
② IE10之后:e.preventDefault();
//css #p1{ width: 300px;; height: 300px; background-color: powderblue; } #p2{ width: 200px; height: 200px; background-color: deeppink; } #p3{ width: 100px; height: 100px; background-color:#A9A9A9; } //html <p id="p1"> <p id="p2"> <p id="p3"></p> </p> </p> <a href="01-事件笔记.html" rel="external nofollow" onclick="func()">超链接</a> p1.addEventListener("click",function(){ console.log("p1 click"); },false); p2.addEventListener("click",function(){ console.log("p2 click"); },false); p3.addEventListener("click",function(){ //原来的顺序是:3-->2-->1。 // myParagraphEventHandler(); //截获事件流后,只触发3.但是从2开始依然会冒泡; console.log("p3 click"); },false);
结果(事件冒泡)(由小到大p3-》p2-》p1):
p1.addEventListener("click",function(){ console.log("p1 click"); },true); p2.addEventListener("click",function(){ console.log("p2 click"); },true); p3.addEventListener("click",function(){ // myParagraphEventHandler(); //截获事件流后,只触发3.但是从2开始依然会冒泡; console.log("p3 click"); },true);
结果(事件捕获)(由小到大p3-》p2-》p1):
//依然遵循事件冒泡 document.onclick=function(){ console.log("document click") } //截获事件流阻止事件冒泡 function myParagraphEventHandler(e) { e = e || window.event; if (e.stopPropagation) { e.stopPropagation(); //IE10以后 } else { e.cancelBubble = true; //IE10之前 } } //截获事件流阻止事件冒泡 function myParagraphEventHandler(e) { e = e || window.event; if (e.stopPropagation) { e.stopPropagation(); //IE10以后 } else { e.cancelBubble = true; //IE10之前 } } //阻止默认事件 function eventHandler(e) { e = e || window.event; // 防止默认行为 if (e.preventDefault) { e.preventDefault(); //IE10之后 } else { e.returnValue = false; //IE10之前 } }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 JS 이벤트 바인딩 및 이벤트 흐름 모델 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!