摘要:事件流包括兩種模式冒泡和捕獲。和事件名,函數(shù),此方法不支持僅僅支持兩個參數(shù)事件名稱事件回調(diào)。事件中沒有這個屬性。鼠標(biāo)相對于事件源元素的左邊界上邊界坐標(biāo),只有事件有這個屬性,標(biāo)準(zhǔn)事件沒有對應(yīng)的屬性。
事件 事件的概念
事件就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬間【觸發(fā)與響應(yīng)】
事件觸發(fā):用戶在頁面上操作(如點擊按鈕, 鼠標(biāo)滑過, 鼠標(biāo)點擊, 鼠標(biāo)松開, 文本框獲得焦點, 失去焦點等)
捕獲--目標(biāo)--冒泡
事件流
事件流是描述的從頁面接受事件的順序,當(dāng)幾個都具有事件的元素層疊在一起的時候, 那么你點擊其中一個元素,并不是只有當(dāng)前被點擊的元素會觸發(fā)事件,而層疊在你點擊范圍的所有元素都會觸發(fā)事件。事件流包括兩種模式:冒泡和捕獲。
事件冒泡
事件冒泡是從里往外逐個觸發(fā). 事件捕獲, 是從外往里逐個觸發(fā). 現(xiàn)代的瀏覽器默認(rèn)情況下都是事件冒泡的模式.
"on"+事件名
表單:
change事件---域的內(nèi)容被改變
focus事件--元素獲得焦點(不冒泡)
blur事件---元素失去焦點(不冒泡)
window事件:
load事件--頁面資源包括圖像完成加載,當(dāng)頁面完全加載后觸發(fā)
resize事件---窗口改變。
scroll事件---當(dāng)用戶滾動帶滾動條的元素時觸發(fā)
鼠標(biāo)事件:
contextmenu--鼠標(biāo)右鍵
click事件---單擊
mouseover事件(冒泡)---當(dāng)鼠標(biāo)移入某個元素的那一刻觸發(fā)
mouseenter事件(不冒泡)----當(dāng)鼠標(biāo)移入某個元素的那一刻觸發(fā)
mouseout事件(冒泡)---當(dāng)鼠標(biāo)剛移出某個元素的那一刻觸發(fā)
mouseleave事件(不冒泡)----當(dāng)鼠標(biāo)剛移出某個元素的那一刻觸發(fā)
mouseover和 mouseenter的區(qū)別是:
mouseover,mouseout: 元素的子元素也會觸發(fā)事件
mouseenter ,mouseleave: 元素的子元素不會觸發(fā)事件
鍵盤事件--一般由window對象或者document對象調(diào)用
keydown事件---某個鍵盤按鍵被按下
keyup事件----某個鍵盤按鍵被松開。
keypress事件----某個鍵盤按鍵被按下并松開。
1.事件源:要綁定事件的對象;
2.事件名稱:發(fā)生了或是綁定了什么事件;
3.事件處理程序:要執(zhí)行的函數(shù)或是要處理的結(jié)果。
(1) 行內(nèi)式:頁面的標(biāo)簽當(dāng)中---不利于維護(hù)
行內(nèi)式注冊事件,將事件類型當(dāng)作屬性名,屬性值為一個調(diào)用我們在js中定義好的函數(shù)。相當(dāng)于函數(shù)的返回值賦給onclick點我
內(nèi)聯(lián)模式調(diào)用的函數(shù)不能放到window.onload里面, 否則會找不到該函數(shù).
(2) 內(nèi)嵌式(屬性綁定模式): 寫在script標(biāo)簽之間---只能綁定一個函數(shù)
//先獲取到元素節(jié)點對象, 再針對該節(jié)點對象添加事件 var box=document.getElementById("box") box.onclick=function(){ alert("點我才彈出來")
(3) 導(dǎo)入式:后面一般用的多
把代碼存放在.js文件中,導(dǎo)入到html文件
注冊事件的方式:
(1)on+type
var oBtn = document.getElementById("btn1"); oBtn.onclick=function(){ alert("a") } oBtn.onclick=function(){ alert("b") //一個節(jié)點對象只能邦定一個同名事件,后面的后覆蓋掉前面的 }
(2)addEventListener:標(biāo)準(zhǔn)事件(ie不支持)
element.addEventListener("click", fn, false);
//三個參數(shù):"事件名稱", "事件回調(diào)", "捕獲(true)/冒泡(false)"。
//FF和Chrome addEventListener(事件名,函數(shù)),此方法ie不支持 var oBtn = document.getElementById("btn1"); oBtn.addEventListener("click",function() { alert("a"); }); oBtn.addEventListener("click",function() { alert("b"); })
(3)attachEvent:僅僅ie支持
element.attachEvent("onclick", fn);
//兩個參數(shù):"on事件名稱", "事件回調(diào)"。
var oBtn = document.getElementById("btn1"); //IE attachEvent(事件名,函數(shù)),此方法只有ie支持,F(xiàn)F和Chrome均不支持 oBtn.attachEvent("onclick",function() { alert("a"); }); oBtn.attachEvent("onclick",function() { alert("b"); })
兼容的寫法:
//ie只支持attachEvent,而FF和Chrome只支持addEventListener function addEvent(obj,ev,fn) //obj為要綁定事件的元素,ev為要綁定的事件,fn為綁定事件的函數(shù) { if(obj.attachEvent) { obj.attachEvent("on" + ev,fn); } else { obj.addEventListener(ev,fn,false); } } //綁定事件 addEvent(oBtn,"click",function() { alert("a"); })移除事件
function removeEventListener(element,type,listener){ if(element.removeEventListener){ element.removeEventListener(type,listener,false); //標(biāo)準(zhǔn)事件 }else if(element.detachEvent){ element.detachEvent("on"+type,listener); //ie事件 }else { element["on"+type] = null; //屬性綁定事件 } }事件對象(event)
event對象是在觸發(fā)事件時, 瀏覽器會通過函數(shù)把事件對象作為參數(shù)傳遞過來, 在事件觸發(fā)執(zhí)行函數(shù)時一般會得到一個隱藏的參數(shù), 該參數(shù)也是放在arguments數(shù)組中
//普通函數(shù)的arguments function func() { console.log(arguments.length); //1, 得到一個傳遞的參數(shù) } func("hello"); //事件綁定的執(zhí)行函數(shù) box.onclick = function(){ console.log(arguments.length); //1, 得到一個隱藏參數(shù) console.log(arguments); //數(shù)組 console.log(arguments[0]); //獲得該事件對象([object MouseEvent]) };
通過上面兩組函數(shù)中, 我們發(fā)現(xiàn), 通過事件綁定的執(zhí)行函數(shù)是可以得到一個隱藏參數(shù)的. 說明瀏覽器會自動分配一個參數(shù),這個隱藏參數(shù)其實就是event對象(事件對象)
獲取事件對象通過函數(shù)內(nèi)部的arguments數(shù)組對象獲取
box.onclick = function(){ console.log(arguments[0]); //獲得該事件對象([object MouseEvent]) };
通過給函數(shù)添加一個自定義的形參(推薦)
box.onclick = function(e){ console.log(e); //[object MouseEvent] }
event事件兼容問題:
ie不能通過傳遞的參數(shù)來獲取,需要用到全局的window.event來獲取
兼容代碼
box.onclick = function(evt){ var e= evt || window.event; //獲取到event對象(事件對象) console.log(e); }; 其中window.event中的window可以省略, 最終我們可以寫成: box.onclick = function(evt){ var e= evt || event; //獲取到event對象(事件對象) console.log(e); };
注意: evt||event不要倒過來寫事件對象屬性
button--返回的是鼠標(biāo)鍵碼(0代表鼠標(biāo)左鍵,1代表鼠標(biāo)滾動,2代表鼠標(biāo)右鍵)
event.clientX、event.clientY
鼠標(biāo)相對于瀏覽器窗口可視區(qū)域的X,Y坐標(biāo)(窗口坐標(biāo)),會隨頁面左右滾動而改變
可視區(qū)域不包括工具欄和滾動條。IE事件和標(biāo)準(zhǔn)事件都定義了這2個屬性
event.pageX、event.pageY
瀏覽器內(nèi)容區(qū)域的x,y坐標(biāo), 不會隨頁面滾動而改變
類似于event.clientX、event.clientY,但它們使用的是文檔坐標(biāo)而非窗口坐標(biāo)
這2個屬性不是標(biāo)準(zhǔn)屬性,但得到了廣泛支持。IE事件中沒有這2個屬性。
event.offsetX、event.offsetY
鼠標(biāo)相對于事件源元素(srcElement)
的X(左邊界),Y(上邊界)坐標(biāo),只有IE事件有這2個屬性,標(biāo)準(zhǔn)事件沒有對應(yīng)的屬性。
event.screenX、event.screenY
事件目標(biāo)對象target目標(biāo)對象,存放綁定事件的元素節(jié)點對象
標(biāo)準(zhǔn)事件對象使用 event 的 target 屬性獲取事件目標(biāo)event.target
IE 事件對象使用 event 的 srcElement 屬性獲取事件目標(biāo)
獲取事件目標(biāo)對象兼容代碼寫法:
box.onclick = function(evt){ var e= evt || event; //獲取到event對象(事件對象) var objEle = eve.target || eve.srcElement;//獲取事件目標(biāo)對象 };
事件對象event:
1.target: 指向事件觸發(fā)的目標(biāo)元素對象,第一個事件源
2.currentTarget: 事件處理函數(shù)的元素對象,始終與 this 相等;
target在事件流的目標(biāo)階段;currentTarget在事件流的捕獲,目標(biāo)及冒泡階段。只有當(dāng)事件流處在目標(biāo)階段的時候,兩個的指向才是一樣的, 而當(dāng)處于捕獲和冒泡階段的時候,target指向被單擊的對象而currentTarget指向當(dāng)前事件活動的對象(一般為父級)在事件里面,this始終指代當(dāng)前對象 始終是觸發(fā)事件的事件源 或者是始終是正在執(zhí)行事件處理函數(shù)的事件源
//target等于目標(biāo)節(jié)點對象(點擊的元素節(jié)點對象)鼠標(biāo)點了那就是具體的目標(biāo)節(jié)點對象 //currentTarget是隨著事件流,永遠(yuǎn)等于this, //this等于正在執(zhí)行事件處理函數(shù)的事件的對象 //currentTarget指向當(dāng)前事件活動的對象(跟this理解是一樣)禁止事件冒泡。
但是一般我們只在指定的節(jié)點上添加事件, 而不想讓其傳遞到下層節(jié)點觸發(fā)事件, 這樣我們就需要阻止事件冒泡;
阻止事件冒泡有兩個方法:
( 在指定不想再繼續(xù)傳遞事件的節(jié)點的事件執(zhí)行函數(shù)中使用)
1.取消冒泡, IE
e.cancelBubble = true;
停止傳播, 非IE
e.stopPropagation();
例如:
document.getElementsByTagName("input")[0].onclick= function(evt){ var e = evt || window.event; //可以通過下述兩個方法取消事件冒泡 e.cancelBubble = true || e.stopPropagation(); }阻止事件的默認(rèn)行為。
1.return false
//阻止默認(rèn)的右鍵菜單
document.oncontextmenu = function(){ console.log("右鍵被按下"); return false; }
//第一種: var imgBox =document.getElementById("img"); function turn1(link){ imgBox.src = link.href; } //第二種: function turn2(link){ imgBox.src = link.href; return false; } //第三種: var link3=document.getElementById("link3"); link3.onclick= function () { imgBox.src=link3.href; return false; }
標(biāo)準(zhǔn)事件對象使用 event 的 preventDefault() 方法取消事件默認(rèn)行為
event.preventDefault(); // 瀏覽器不會跳轉(zhuǎn)
3.IE 事件對象使用 event 的 returnValue 屬性取消事件默認(rèn)行為,該屬性默認(rèn)值為 true 設(shè)置為 false 就可以取消事件默認(rèn)行為。
event.returnValue = false; // 瀏覽器不會跳轉(zhuǎn)
兼容代碼寫法:
function StopDefault(){ if(window.attachEvent){ event.returnValue = false; }else if(window.addEventListener){ event.preventDefault(); } }鍵碼 : keyCode屬性
所有按鍵(包括功能鍵control, alt,shift, tab, 方向鍵等, 不包括亮度,音量..的按鍵)在發(fā)生 keydown和keyup 事件時,event對象的 keyCode屬性中會包含一個代碼,與鍵盤上一個特定的鍵對應(yīng)。對數(shù)字字母字符集,keyCode屬性的值與 ASCII 碼中對應(yīng).
document.onkeydown = function(evt) { var e = evt || event; console.log(e.keyCode); //按任意鍵,得到相應(yīng)的 keyCode };
注意: 大寫字母或小寫的編碼相同, 都為大寫字母。
字符編碼: charCode屬性Firefox, Chrome和Safari的event對象支持charCode屬性, 只有按下字符鍵并且使用keypress事件時才會得到charCode, 這個charCode的值和ASCII碼對應(yīng), 和keyCode也類似, 但是charCode的字母區(qū)分大小寫. ( 字符鍵: 數(shù)字, 字母(區(qū)分大小寫), 字符, 空格, 回車 )
document.onkeypress = function(evt) { var e = evt || event; console.log(e.charCode); }
注:可以使用 String.fromCharCode()將 ASCII 編碼轉(zhuǎn)換成實際的字符
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/53544.html
摘要:實現(xiàn)一個完整的實現(xiàn)應(yīng)該由下列三個不同的部分組成核心文檔對象模型瀏覽器對象模型文檔對象模型是針對但經(jīng)過擴(kuò)展用于的應(yīng)用程序編程接口。級別級由兩個模塊組成核心和。其中,核心規(guī)定是如何映射基于的文檔結(jié)構(gòu),以便簡化對文檔中任意部分的訪問和操作。 javascript從一個簡單的輸入驗證器發(fā)展成為一門強(qiáng)大的編程語言,完全出乎人們的意料。 javascript實現(xiàn)一個完整的javascript實現(xiàn)應(yīng)...
摘要:簡介原文鏈接簡稱是一種輕量級,解釋型的編程語言,其函數(shù)是一等公民。標(biāo)準(zhǔn)的目標(biāo)是讓任何一種程序設(shè)計語言能操控使用任何一種標(biāo)記語言編寫出的任何一份文檔。核心規(guī)定了如何映射基于的文檔結(jié)構(gòu),以便簡化對文檔的任意部分的訪問和操作。 JavaScript 簡介 原文鏈接 JavaScript ( 簡稱:JS ) 是一種 輕量級,解釋型 的編程語言,其函數(shù)是一等公民。眾所周知,它是用于網(wǎng)頁開發(fā)的腳...
摘要:精致從細(xì)節(jié)做起。標(biāo)準(zhǔn)會在每年的月發(fā)布一次,作為當(dāng)年的正式版本,便是年發(fā)布的正式版本。支持情況各大瀏覽器對的支持情況瀏覽器支持情況對的支持情況支持情況。在瀏覽器中基于實現(xiàn)的已經(jīng)成為的重要組成部分。 精致從細(xì)節(jié)做起。前端的工作也有一段時間了,大大小小的前端框架都有接觸過,越是深入學(xué)習(xí)越是感覺之前的學(xué)習(xí)過于粗糙,基礎(chǔ)不夠扎實,于是準(zhǔn)備近期把JavaScript的基礎(chǔ)知識點梳理一下,查缺補(bǔ)漏,...
摘要:由于計算機(jī)的國際化,組織的標(biāo)準(zhǔn)牽涉到很多其他國家,因此組織決定改名表明其國際性。規(guī)范由萬維網(wǎng)聯(lián)盟制定。級標(biāo)準(zhǔn)級標(biāo)準(zhǔn)是不存在的,級一般指的是最初支持的。 這篇筆記的內(nèi)容對應(yīng)的是《JavaScript高級程序設(shè)計(第三版)》中的第一章。 1.ECMA 和 ECMA-262 ECMA 是歐洲計算機(jī)制造商協(xié)會的縮寫,全程是 European Computer Manufacturers Ass...
摘要:以下內(nèi)容都是一些概念性的知識點弄懂這些基本的概念是我們在世界看得更遠(yuǎn)的墊腳石誕生于年年公司開發(fā)發(fā)布時臨時將名字改為當(dāng)時它的主要目的是處理以前由服務(wù)端語言負(fù)責(zé)的輸入驗證操作隨著其發(fā)展現(xiàn)在已不再局限于數(shù)據(jù)驗證而是具備了與瀏覽器窗口及其內(nèi)容等幾乎 以下內(nèi)容都是一些概念性的知識點,弄懂這些基本的概念是我們在JavaScript世界看得更遠(yuǎn)的墊腳石. Javascript Javascript誕...
摘要:原文第一章主要介紹的大概情況基本語法。通過和來引用對象屬性或數(shù)組元素的值就構(gòu)成一個表達(dá)式。 原文:https://keelii.github.io/2016/06/16/javascript-definitive-guide-note-0/ 第一章 主要介紹 JavaScript 的大概情況、基本語法。之前沒有 JavaScript 基礎(chǔ)的看不懂也沒關(guān)系,后續(xù)章節(jié)會有進(jìn)一步的詳細(xì)說明...
閱讀 3750·2021-10-12 10:11
閱讀 2007·2019-08-30 15:53
閱讀 1614·2019-08-30 13:15
閱讀 2330·2019-08-30 11:25
閱讀 1831·2019-08-29 11:24
閱讀 1680·2019-08-26 13:53
閱讀 3551·2019-08-26 13:22
閱讀 1802·2019-08-26 10:24