淺析javascript中的Event事件
1、焦點(diǎn):當(dāng)一個(gè)元素有焦點(diǎn)的時(shí)候,那么他就可以接受用戶的輸入(不是所有元素都能接受焦點(diǎn))
給元素設(shè)置焦點(diǎn)的方式:
1、點(diǎn)擊
2、tab
3、js
2、(例子:輸入框提示文字)
onfocus:當(dāng)元素獲取焦點(diǎn)時(shí)觸發(fā):
element.onfocus = function(){};
onblur:當(dāng)元素失去焦點(diǎn)時(shí)觸發(fā):
element.onblur = function(){};
obj.focus() 給指定的元素設(shè)置焦點(diǎn)
obj.blur() 取消指定元素的焦點(diǎn)
obj.select()選擇指定元素里面的文本內(nèi)容
3、(例子:方塊隨著鼠標(biāo)移動(dòng))
event: 事件對(duì)象。
當(dāng)一個(gè)事件發(fā)生時(shí),和當(dāng)前這個(gè)對(duì)象發(fā)生的事件所有有關(guān)的信息都會(huì)臨時(shí)保存在一個(gè)指定的地方-event對(duì)象,供我們需要時(shí)調(diào)用。就像是飛機(jī)的黑匣子。
事件對(duì)象必須在一個(gè)對(duì)象的事件調(diào)用函數(shù)中使用才有內(nèi)容。
事件函數(shù):事件調(diào)用的函數(shù),一個(gè)函數(shù)是不是事件函數(shù),不在定義時(shí)決定而是在調(diào)用的時(shí)候決定
4、兼容
element.onclick = fn1;
IE/Chrome瀏覽器:event是一個(gè)內(nèi)置的全局對(duì)象(可以直接使用)
function fn1(){ alert(event); }
標(biāo)準(zhǔn)下:事件對(duì)象是通過事件函數(shù)的第一個(gè)參數(shù)傳入
function fn1(ev){ alert(ev); }
兼容寫法:
function fn1(ev){ var ev = ev || event; }
clientX[Y]:當(dāng)一個(gè)事件發(fā)生的時(shí)候,鼠標(biāo)到頁(yè)面可視區(qū)的距離
5、事件流(例子:仿select控件)
● 事件冒泡:當(dāng)一個(gè)元素接受到事件的時(shí)候,會(huì)把他接受到的事件傳播給他的父級(jí),一直到頂層window。
● 事件捕獲:一個(gè)元素要想接受到事件,它的父元素會(huì)首先接受到該事件,然后再傳給它。
注意:在ie下是沒有的事件捕獲的。在事件綁定中,標(biāo)準(zhǔn)下有
6、事件綁定
● 第一種:
element.onclick = fn1;
注意:oDiv.onclick = fn1;
oDiv.onclick = fn2;
這樣fn2會(huì)覆蓋fn1;
● 第二種:
IE:obj.attachEvent(事件名稱,事件函數(shù))
1、沒有捕獲
2、事件名稱有on
3、事件函數(shù)的執(zhí)行順序:標(biāo)準(zhǔn)》正序 非標(biāo)準(zhǔn)》倒序
4、this指向window
element.attachEvent(onclick,fn1);
標(biāo)準(zhǔn):obj.addEventListener(事件名稱,事件函數(shù),是否捕獲)
1、有捕獲
2、事件名稱沒有on
3、事件的執(zhí)行順序是正序
4、this指向觸發(fā)該事件的對(duì)象
element.addEventListener(click,fn1,false);
bind函數(shù)
function bind(obj,evname,fn){ if(obj.addEventListener){ obj.addEventListener(evname,fn,false); }else{ obj.attachEvent('on' + evname,function(){ fn.call(obj); }); } }
事件取消綁定
● 第一種
element.onclick = null;
● 第二種
IE:obj.detachEvent(事件名稱,事件函數(shù));
document.detachEvent('onclick',fn1);
標(biāo)準(zhǔn):obj.removeEventListener(事件名稱,事件函數(shù),是否捕獲);
document.removeEventListener('click',fn1,false);
8、鍵盤事件(例子:留言本)
● onkeydown : 當(dāng)鍵盤按鍵按下的時(shí)候觸發(fā)
● onkeyup : 當(dāng)鍵盤按鍵抬起的時(shí)候觸發(fā)
● event.keyCode : 數(shù)字類型 鍵盤按鍵的值 鍵值
ctrlKey,shiftKey,altKey布爾值
當(dāng)一個(gè)事件觸發(fā)的時(shí)候,如果shift || ctrl || alt鍵沒有按下,則返回false,否則返回true;
9、默認(rèn)事件(例子:自定義右鍵菜單、鍵盤控制div運(yùn)動(dòng))
● 事件默認(rèn)行為 : 當(dāng)一個(gè)事件發(fā)生的時(shí)候?yàn)g覽器默認(rèn)會(huì)做的事。
● 阻止默認(rèn)事件:return false;
oncontextmenu : 右鍵菜單事件,當(dāng)右鍵菜單(環(huán)境菜單)顯示出來(lái)的時(shí)候觸發(fā)。
案例:
方塊隨著鼠標(biāo)移動(dòng):
onmouseover:當(dāng)鼠標(biāo)在一個(gè)元素上移動(dòng)時(shí)觸發(fā)
注意:觸發(fā)的頻率不是像素,而是間隔時(shí)間。在一個(gè)間隔時(shí)間內(nèi)不論鼠標(biāo)移動(dòng)了多遠(yuǎn)只觸發(fā)一次
<style> body{ height: 2000px; } #div{ width:100px; height: 100px; background:red; position: absolute; } </style> <body> <div id="div1"></div> </body> <script> var oDiv = document.getElementById('div1'); document.onmouseover = function(ev){ var ev = ev || event; // 如果當(dāng)滾動(dòng)條滾動(dòng)了(頁(yè)面的頭部部分隱藏了),方塊是以頁(yè)面定位的,而鼠標(biāo)是以可視區(qū)定位的,這樣就會(huì)產(chǎn)生bug。所以我們要加上滾動(dòng)條滾動(dòng)的距離 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; oDIv.style.top = ev.clientX + scrollTop + 'px'; oDIv.style.left = ev.clientY + 'px'; } </script>
輸入框文字提示:
<style></style> <body> <input type="text" id="text1" value="請(qǐng)輸入內(nèi)容"/> <input type="button" id="btn" value="全選" /> </body> <script> var oText = document.getElementById('text1'); var oBtn = document.getElementById('btn'); oText.onfocus = function(){ if(this.value == '請(qǐng)輸入內(nèi)容'){ this.value = ''; } } oText.onblur = function(){ if(this.value == ''){ this.value = '請(qǐng)輸入內(nèi)容'; } } oBtn.onclick = function(){ oText.select(); } </script>
仿select控件:
<style> #div1{ width: 100px; height: 200px; border: 1px solid red; display: none; } </style> <body> <input type="button" value="按鈕" id="btn" /> <div id="div1"></div> <p>ppppppppp</p> <p>ppppppppp</p> <p>ppppppppp</p> <p>ppppppppp</p> <p>ppppppppp</p> </body> <script> window.onload = function(){ var oBtn = document.getElementById('btn'); var oDiv = document.getElementById('div1'); oBtn.onclick = function(ev){ var ev = ev || event; ev.cancelBubble = true; oDiv.style.display = 'block'; } document.onclick = function(){ oDiv.style.display = 'none'; } } </script>
留言本:
<style></style> <body> <input type="text" id="con"/> <ul id="box"></ul> </body> <script> var oUl = document.getElementById('box'); var oText = document.getElementById('con'); document.onkeyup = function(ev){ var ev = ev || even; if(ev.keyCode != ''){ if(ev.keyCode == 13){ var oLi = document.createElement('li'); oLi.innerHTML = oText.value; if(oUl.children[0]){ oUl.insertBefore(oLi,oUl.children[0]); }else{ oUl.appendChild(oLi); } } } } </script>
自定義右鍵菜單:
<style> body{ height: 2000px; } #box{ width: 100px; height: 200px; background: red; display: none; position: absolute;; } </style> <body> <div id="box"></div> </body> <script> var oBox = document.getElementById('box'); document.oncontextmenu = function(ev){ var ev = ev || event; var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; oBox.style.display = 'block'; oBox.style.top = scrollTop + ev.clientY + 'px'; oBox.style.left = scrollLeft + ev.clientX + 'px'; return false; } document.onclick = function(){ oBox.style.display = 'none'; } </script>
鍵盤控制div運(yùn)動(dòng):
<style> #box{ width: 100px; height: 100px; background: red; position: absolute; } </style> <body> <div id="box"></div> </body> <script> var oBox = document.getElementById('box'); var timer = null; var oLeft = false; var oTop = false; var oRight = false; var oBottom = false; // 運(yùn)動(dòng)一直就緒,等待按鍵操作 timer = setInterval(function(){ if(oLeft){ oBox.style.left = oBox.offsetLeft - 10 + 'px'; }else if(oTop){ oBox.style.top = oBox.offsetTop - 10 + 'px'; }else if(oRight){ oBox.style.left = oBox.offsetLeft + 10 + 'px'; }else if(oBottom){ oBox.style.top = oBox.offsetTop + 10 + 'px'; } // 防止溢出 limit(); },10); // 按鍵按下,開始運(yùn)動(dòng) document.onkeydown = function(ev){ var ev = ev || even; switch (ev.keyCode){ case 37: oLeft = true; break; case 38: oTop = true; break; case 39: oRight = true; break; case 40: oBottom = true; break; } } // 按鍵抬起,停止運(yùn)動(dòng) document.onkeyup = function(ev){ var ev = ev || even; switch (ev.keyCode){ case 37: oLeft = false; break; case 38: oTop = false; break; case 39: oRight = false; break; case 40: oBottom = false; break; } } function limit(){ // 控制左邊 if(oBox.offsetLeft <= 0){ oBox.style.left = 0; } // 控制上邊 if(oBox.offsetTop <= 0){ oBox.style.top = 0; } // 控制右邊 if(document.documentElement.clientWidth - oBox.offsetLeft - oBox.offsetWidth < 0){ oBox.style.left = document.documentElement.clientWidth - oBox.offsetWidth + 'px'; } // 控制下邊 if(document.documentElement.clientHeight - oBox.offsetTop - oBox.offsetHeight < 0){ oBox.style.top = document.documentElement.clientHeight - oBox.offsetHeight + 'px'; } } </script>
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- JavaScript event對(duì)象整理及詳細(xì)介紹
- javascript中的altKey 和 Event屬性大全
- Nodejs實(shí)戰(zhàn)心得之eventproxy模塊控制并發(fā)
- JavaScript對(duì)HTML DOM使用EventListener進(jìn)行操作
- JavaScript使用addEventListener添加事件監(jiān)聽用法實(shí)例
- JS中的THIS和WINDOW.EVENT.SRCELEMENT詳解
- javascript中attachEvent用法實(shí)例分析
- Node.js事件循環(huán)(Event Loop)和線程池詳解
- node.js中的events.emitter.once方法使用說(shuō)明
相關(guān)文章
Javascript中toFixed計(jì)算錯(cuò)誤(依賴銀行家舍入法的缺陷)解決方法
這篇文章主要介紹了Javascript中toFixed計(jì)算錯(cuò)誤(依賴銀行家舍入法的缺陷)解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼
這篇文章主要介紹了微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼,小程序本身對(duì)http、websocket等連接均有諸多限制,所以這次項(xiàng)目選擇了node.js自帶的ws模塊。感興趣的可以參考一下2019-02-02JS實(shí)現(xiàn)點(diǎn)擊發(fā)送驗(yàn)證碼 xx秒后重新發(fā)送功能
在一些注冊(cè)類的網(wǎng)站,經(jīng)常遇到這樣的需求,點(diǎn)擊發(fā)送驗(yàn)證碼,xx秒后重新發(fā)送,這樣的功能怎么實(shí)現(xiàn)呢,接下來(lái)通過本文給大家分享js點(diǎn)擊發(fā)送驗(yàn)證碼 xx秒后重新發(fā)送功能,需要的朋友參考下吧2019-07-07JS多個(gè)表單數(shù)據(jù)提交下的serialize()應(yīng)用實(shí)例分析
這篇文章主要介紹了JS多個(gè)表單數(shù)據(jù)提交下的serialize()應(yīng)用,接合實(shí)例形式分析了原生javascript實(shí)現(xiàn)多個(gè)表單提交時(shí)serialize操作相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-08-08最簡(jiǎn)單的JS實(shí)現(xiàn)json轉(zhuǎn)csv的方法
這篇文章主要介紹了最簡(jiǎn)單的JS實(shí)現(xiàn)json轉(zhuǎn)csv的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01基于微信小程序?qū)崿F(xiàn)人臉數(shù)量檢測(cè)的開發(fā)步驟
最近項(xiàng)目需求是統(tǒng)計(jì)當(dāng)前攝像頭中的人臉個(gè)數(shù),所以下面這篇文章主要給大家介紹了關(guān)于基于微信小程序?qū)崿F(xiàn)人臉數(shù)量檢測(cè)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12