1、JS事件css
(一)JS事件分類html
1.鼠標事件:瀏覽器
click/dbclick/mouseover/mouseout函數
2.HTML事件:spa
onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll.net
3.鍵盤事件:code
keydown:鍵盤按下時觸發
keypress:鍵盤按下並擡起的瞬間觸發。
keyup:鍵盤擡起觸發htm
[注意事項]seo
①執行順序:keydown keypress keyup
②keypress只能捕獲數字,字母,符號鍵,而不能捕獲功能鍵。
③長按時循環執行keydown--keypress
④有keydown,並不必定有keyup,當長按時焦點失去,將再也不觸發keyup
⑤keypress區分大小寫,keydown,kewup不區分。事件
4.事件因子:
當觸發一個事件時,該事件將向事件所調用的函數中,默認傳入一個參數,
這個參數就是一個事件因子,包含了該事件的各類詳細信息。
1
2
3
4
5
6
|
document.onkeydown=
function
(e){
console.log(e);
}
document.onkeydown=
function
(){
console.log(window.event);
}
|
1
2
3
4
5
6
7
8
|
//兼容瀏覽器的寫法:
document.onkeydown=
function
(e){
e==e||Window.event;
var
Code=e.keyCode||e.which||e.charCode;
if
(code==13){
//回車
}
}
|
5.如何肯定鍵盤按鍵?
①再出發的函數中,接收事件因子e。
②可使用e.key直接去到按下的按鍵字符(不推薦使用)。
③一次可使用keyCode/which/charCode取到按鍵的ASCII碼值。
(兼容各類瀏覽器的寫法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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(
"你輸入的是回車鍵"
);
}
}
|
(一)DOM0事件模型
綁定注意事項:
①使用window.onload加載完成後進行綁定。
window.onload =function(){//事件}
②放在body後面進行綁定。
1
2
3
4
5
6
7
|
//body內容
<body>
<button onclick=
"func()"
>內聯模型綁定</button>
<button id=
"btn1"
>哈哈哈哈</button>
<button id=
"btn2"
>DOM2模型綁定</button>
<button id=
"btn3"
>取消DOM2</button>
</body>
|
1.內聯模型(行內綁定):將函數名直接做爲html標籤中屬性的屬性值。
1
|
<button onclick=
"func()"
>內聯模型綁定</button>
|
缺點:不符合w3c中關於內容與 行爲分離的基本規範。
2.腳本模型(動態綁定):經過在JS中選中某個節點,而後給節點添加onclick屬性。
1
|
document.getElementById(
"btn1"
)=
function
(){}
|
優勢:符合w3c中關於內容與行爲分離的基本規範,實現html與js的分離。
缺點:同一個節點只能添加一次同類型事件,若是添加屢次,最後一個生效。
1
2
3
4
5
6
|
document.getElementById(
"btn1"
).onclick=
function
(){
alert(1234);
}
document.getElementById(
"btn1"
).onclick=
function
(){
alert(234);
}
//重複的只能出現最近的一次
|
3.DOM0共有缺點:經過DOM0綁定的事件,一旦綁定將沒法取消。
1
2
3
4
5
6
7
8
|
document.getElementById(
"btn3"
).onclick=
function
(){
//不能取消匿名函數
if
(btn.detachEvent){
btn.detachEvent(
"onclick"
,func1);
}
else
{
btn.removeEventListener(
"click"
,func1);
}
alert(
"取消DOM2"
);
}
|
(二)DOM2事件模型
1.添加DOM2事件綁定:
①IE8以前,使用.attachEvent("onclick",函數);
②IE8以後,使用.addEventListener("click",函數,true/false);
參數三:false(默認)表示事件冒泡,傳入true表示事件捕獲。
③兼容全部瀏覽器的處理方式:
1
2
3
4
5
6
|
var
btn=document.getElementById(
"btn1"
);
if
(btn.attachEvent){
btn.attachEvent(
"onclick"
,func1);
//事件,事件須要執行的函數IE8能夠
}
else
{
btn.attachEventListener(
"click"
,func1);
}
|
2.DOM2綁定的優勢:
①同一個節點,可使用DOM2綁定多個同類型事件。
②使用DOM2綁定的事件,能夠有專門的函數進行取消。
3.取消事件綁定:
①使用attachEvent綁定,要用detachevent取消。
②使用attachEventListener綁定,要用removeEventListenter取消。
注意:若是DOM2綁定的事件,須要取消,則綁定事件時,回調函數必須是函數名,
而不能是匿名函數,由於取消事件時,取消傳入函數名進行取消。
3、JS事件流模型
(一)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();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
//css
#div1{
width: 300px;;
height: 300px;
}
#div2{
width: 200px;
height: 200px;
}
#div3{
width: 100px;
height: 100px;
padding: 0px 0px 0px 5px; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-left: 3px solid rgb(108, 226, 108); line-height: 20px; width: 640px; clear: both; outline: 0px !important; border-radius: 0px !important; border-top: 0px !important; border-right: 0px !important; border-bottom: 0px !important; border-image: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; box-sizing: content-box !important; font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; min-height: auto !important; color: gray !important;">#A9A9A9;
}
//html
<div id=
"div1"
>
<div id=
"div2"
>
<div id=
"div3"
></div>
</div>
</div>
<a href=
"01-事件筆記.html"
rel=
"external nofollow"
onclick=
"func()"
>超連接</a>
div1.addEventListener(
"click"
,
function
(){
console.log(
"div1 click"
);
},
false
);
div2.addEventListener(
"click"
,
function
(){
console.log(
"div2 click"
);
},
false
);
div3.addEventListener(
"click"
,
function
(){
//原來的順序是:3-->2-->1。
// myParagraphEventHandler(); //截獲事件流後,只觸發3.可是從2開始依然會冒泡;
console.log(
"div3 click"
);
},
false
);
|
結果(事件冒泡)(由小到大div3-》div2-》div1):
1
2
3
4
5
6
7
8
9
10
|
div1.addEventListener(
"click"
,
function
(){
console.log(
"div1 click"
);
},
true
);
div2.addEventListener(
"click"
,
function
(){
console.log(
"div2 click"
);
},
true
);
div3.addEventListener(
"click"
,
function
(){
// myParagraphEventHandler(); //截獲事件流後,只觸發3.可是從2開始依然會冒泡;
console.log(
"div3 click"
);
},
true
);
|
結果(事件捕獲)(由小到大div3-》div2-》div1):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
//依然遵循事件冒泡
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以前
}
}
|