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