事件(下)

事件(下)

事件對象

在事件對象中記錄了很多事件的信息檬寂。趾牧。。

事件類型

e.type// 事件的類型

例:

<buttonid="btn">

?? 按鈕

</button>

<script>

btn.onclick=function(e){

vare=e||window.event;

console.log(e.type);// MouseClick

?? }

btn.onmouseover=function(e){

vare=e||window.event;

console.log(e.type);// MouseOver

?? }

</script>

鼠標按鍵信息

e.button// 鼠標按鍵的信息

0表示左鍵,1表示鼠標滾輪持舆,2表示右鍵

<body>

<buttonid="btn">按鈕</button>

</body>

<scripttype="text/javascript">

btn.onmousedown=function(e){

varev=e||window.event;

varcode=ev.button;

if(code==0){

console.log("您點擊的是左鍵");

}elseif(code==1){

console.log("您點擊的滾輪");

}elseif(code==2){

console.log("您點擊的是右鍵");

}else{

console.log("不知道你點擊的是什么");

?? }

}

</script>

按鍵鍵碼

e.keyCode// 鍵盤的鍵碼

常見的按鍵碼:

13: 回車鍵(enter)

32: 空格鍵(space)

數(shù)字和字母的鍵碼是數(shù)字或字母對應的阿斯克碼

<body>

<buttonid="btn">按鈕</button>

</body>

<scripttype="text/javascript">

document.onkeypress=function(e){

varev=e||window.event;

console.log(ev.keyCode);

}

</script>

<font color="blue">作業(yè):模擬打字游戲仆百。</font>

組合按鍵的判斷:

altKey :alt 鍵按下得到 true慌闭,否則得到 false

shiftKey :shift 鍵按下得到 true初坠,否則得到 false

ctrlKey :ctrl 鍵按下得到 true,否則得到 false

document.onkeyup=function(e) {

e=e||window.event

keyCode=e.keyCode||e.which


if(e.shiftKey&&keyCode===97) {

console.log('你同時按下了 shift 和 a')

? }

}

使用說明:火狐firefox2.0和低版本IE中keyCode不兼容铜幽,可以使用e.which來獲取

<font color="red">現(xiàn)在的低版本ie和火狐都能兼容keyCode</font>

鼠標坐標點

從元素內(nèi)部開始計算的坐標:offsetXoffsetY

<body>

<style>

#box{

width:200px;

height:200px;

border:1pxsolid#000;

}

</style>

<divid="box"></div>

</body>

<scripttype="text/javascript">

box.onclick=function(e){

varev=e||window.event;

console.log(ev.offsetX,ev.offsetY);

}

</script>

訪問結(jié)果:

元素內(nèi)部的點擊坐標

相對于瀏覽器的坐標滞谢,使用:clientXclientY

<body>

<style>

#box{

width:200px;

height:200px;

border:1pxsolid#000;

margin:100px;

?? }

</style>

<divid="box"></div>

</body>

<scripttype="text/javascript">

box.onclick=function(e){

varev=e||window.event;

console.log(ev.clientX,ev.clientY);

}

</script>

訪問結(jié)果:

相對于瀏覽器的坐標

使用說明:不管頁面滾動到哪里,都是根據(jù)窗口來計算坐標除抛。(不會隨著滾動條的滾動而發(fā)生改變)

相對于頁面的坐標狮杨,會隨著滾動條的滾動而加大,使用:pageXpageY

<body>

<style>

#box{

width:20px;

border:1pxsolid#000;

margin:100px;

?? }

</style>

<div id="box">

? ? ?? 沒有什么能夠阻擋

? ? ?? 你對自由的向往

? ? ?? 天馬行空的生涯

? ? ?? 你的心了無牽掛

? ? ?? 穿過幽暗的歲月

? ? ?? 也曾感到彷徨

? ? ?? 當你低頭的瞬間

? ? ?? 才發(fā)覺腳下的路

? ? ?? 心中那自由的世界

? ? ?? 如此的清澈高遠

? ? ?? 盛開著永不凋零

? ? ?? 藍蓮花

</div>

</body>

<scripttype="text/javascript">

box.onclick=function(e){

varev=e||window.event;

console.log(ev.pageY);

}

</script>

訪問結(jié)果:

橫向坐標也是一樣的到忽。

拖拽效果

鼠標移動事件:mousemove

<body>

<style>

#box{

width:100px;

height:100px;

background:pink;

position:absolute;

left:0;

top:0;

}

</style>

<divid="box"></div>

</body>

<scripttype="text/javascript">

varx,y;

box.onmousedown=function(){

this.onmousemove=function(e){

varev=e||window.event;

x=ev.clientX-50;

y=ev.clientY-50;

if(x<0){

x=0;

? ? ?? }

if(y<0){

y=0;

? ? ?? }

// 屏幕寬度和屏幕高度

varmaxWidth=document.documentElement.clientWidth;

varmaxHeight=document.documentElement.clientHeight;

// 能移動的最大寬度 = 屏幕寬度 - 盒子寬度

varmoveMaxWidth=maxWidth-100;

varmoveMaxHeight=maxHeight-100;

if(x>moveMaxWidth){

x=moveMaxWidth;

? ? ?? }

if(y>moveMaxHeight){

y=moveMaxHeight;

? ? ?? }

this.style.left=x+"px";

this.style.top=y+"px";

?? }

}

box.onmouseup=function(){

this.onmousemove=null;

}

</script>

<font color="red">注意:獲取鼠標坐標位置的時候橄教,不能使用offset來獲取,因為offset獲取到的值是鼠標在當前元素上的位置绘趋,也就是說一開始獲取的是大盒子的位置,但是一旦設(shè)置了小盒子的位置颗管,鼠標會出現(xiàn)在小盒子上陷遮,獲取到的位置就成了鼠標在小盒子上的位置了</font>

默認行為

具有默認行為的常見的兩個標簽

鏈接<ahref="/index.php">點我</a>往屬性href指定的地址跳轉(zhuǎn)

提交按鈕<inputtype=”submit”>往form表單屬性action指定的地址跳轉(zhuǎn)

阻止默認行為的方法:

1.給鏈接地址設(shè)置為javascript:;javascript:void(0)

2.在事件中最后return false

3.通過對象阻止,代碼如下:

functionstopDefault(event) {

vare=event||window.event;

if(e.preventDefault){

e.preventDefault();// w3c標準瀏覽器

}else{

e.returnValue=false;// IE瀏覽器

?? }

}

鼠標右鍵也有默認行為垦江。

事件委托

事件委托也叫事件代理(看站誰的角度)帽馋,使用事件委托技術(shù)能避免對每個子節(jié)點添加事件監(jiān)聽,相反把事件監(jiān)聽委托給父元素即可,這樣可提高綁定事件的性能。

傳統(tǒng)的給每個元素綁定事件:

<ul>

? ? <li>首頁</li>

? ? <li>公司介紹</li>

? ? <li>產(chǎn)品中心</li>

</ul>

<script>

varoLis=document.getElementsByTagName("li");// 獲取到所有l(wèi)i

for(variinoLis){

? ? oLis[i].onclick=function(){

? ? ? ? alert(this.innerText);

? ? }

}

</script>

代碼的缺點:

li標簽比較多的時候绽族,性能特別差姨涡,畢竟使用for循環(huán)相當于綁定了多次

當動態(tài)給li添加元素的時候,新元素沒有事件綁定

ul>

? ? <li>首頁</li>

? ? <li>公司介紹</li>

? ? <li>產(chǎn)品中心</li>

</ul>

<buttonid="btn">添加新元素</button>

<script>

btn.onclick=function(){

? ? varoNewLi=document.createElement("li");

? ? oNewLi.innerText="新聞中心";

? ? varoUl=document.getElementsByTagName("ul")[0];

? ? oUl.appendChild(oNewLi)

}

varoLis=document.getElementsByTagName("li");// 獲取到所有l(wèi)i

for(variinoLis){

? ? oLis[i].onclick=function(){

? ? ? ? alert(this.innerText);

? ? }

}

</script>

分析:當點擊按鈕給ul添加新元素以后吧慢,新元素不具備點擊事件涛漂,點擊沒有效果

解決方案:使用事件委托,將所有子元素的點擊事件委托給父元素

<ul>

? ? <li>首頁</li>

? ? <li>公司介紹</li>

? ? <li>產(chǎn)品中心</li>

</ul>

<buttonid="btn">添加新元素</button>

<script>

varoUl=document.getElementsByTagName("ul")[0];

btn.onclick=function(){

? ? varoNewLi=document.createElement("li");

? ? oNewLi.innerText="新聞中心";

? ? oUl.appendChild(oNewLi)

}

oUl.onclick=function(e){

? ? varev=e||window.event;

? ? // 獲取到單擊的目標元素dom對象

? ? vartarget=ev.target||ev.srcElement;

? ? // 判斷是否是li標簽

? ? if(target.nodeName=="li"){

? ? ? ? // 完成業(yè)務(wù)邏輯

? ? ? ? alert(target.innerText);

? ? }

}

</script>

使用事件委托的好處:

提高性能(事件委托中并沒有使用循環(huán)給每個節(jié)點設(shè)置事件检诗,只給一個父元素ul綁定事件)

后續(xù)動態(tài)添加的節(jié)點也有事件的處理

注意:事件委托底層就是通過事件冒泡來完成的匈仗,先觸發(fā)父元素的事件,在通過事件對象的target屬性找到具體的目標元素逢慌,進而在處理目標元素要執(zhí)行的業(yè)務(wù)邏輯悠轩。

事件對象總結(jié)

在行內(nèi)綁定的事件,在行內(nèi)傳入event攻泼,其他事件驅(qū)動函數(shù)在定義的時候傳入自定義參數(shù)火架。在函數(shù)中通過獲取參數(shù)或者window.event來得到事件對象。

名稱? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 意義? ? ? ? ? ? ? ? ? ? ? ? 使用方式? ? ? ? ? ? ? ? ? ? ? ? ? 兼容問題

stopPropagation方法? ? ?阻止冒泡? ? ? ? ? ? ? ? ?e.propagation()? ? ? ? ? ? ? ? ?e.cancelBubble=true

preventDefault方法? ? ? ?阻止默認行為? ? ? ? ? ?e.preventDefault()? ? ? ? ? ? e.returnValue=false

clientX? ? ? ? ? ? ? ? ? ? ? ? ? ?鼠標點擊坐標? ? ? ? ? ?e.clientX? ? ? ? ? ? ? ? ? ? ? ? ? ?無

offsetX? ? ? ? ? ? ? ? ? ? ? ? ? ?鼠標點擊坐標? ? ? ? ? ?e.offsetX? ? ? ? ? ? ? ? ? ? ? ? ? 無

pageX? ? ? ? ? ? ? ? ? ? ? ? ? ? 鼠標點擊坐標? ? ? ? ? ?e.pageX? ? ? ? ? ? ? ? ? ? ? ? ? ?無

target? ? ? ? ? ? ? ? ? ? ? ? ? ? ?精準的事件源? ? ? ? ? ?e.target? ? ? ? ? ? ? ? ? ? ? ? ? ? ?e.srcElement

keyCode? ? ? ? ? ? ? ? ? ? ? ? 鍵盤碼? ? ? ? ? ? ? ? ? ? ? e.keyCode? ? ? ? ? ? ? ? ? ? ? ? e.which

type? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?事件類型? ? ? ? ? ? ? ? ? ?e.type? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 無

button? ? ? ? ? ? ? ? ? ? ? ? ? ? 鼠標按鍵信息? ? ? ? ? ? e.button? ? ? ? ? ? ? ? ? ? ? ? ? ? ?無

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忙菠,一起剝皮案震驚了整個濱河市何鸡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌只搁,老刑警劉巖音比,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氢惋,居然都是意外死亡洞翩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門焰望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骚亿,“玉大人,你說我怎么就攤上這事熊赖±赐溃” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵震鹉,是天一觀的道長俱笛。 經(jīng)常有香客問我,道長传趾,這世上最難降的妖魔是什么迎膜? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮浆兰,結(jié)果婚禮上磕仅,老公的妹妹穿的比我還像新娘珊豹。我一直安慰自己,他們只是感情好榕订,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布店茶。 她就那樣靜靜地躺著,像睡著了一般劫恒。 火紅的嫁衣襯著肌膚如雪贩幻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天兼贸,我揣著相機與錄音段直,去河邊找鬼。 笑死溶诞,一個胖子當著我的面吹牛鸯檬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播螺垢,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼喧务,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枉圃?” 一聲冷哼從身側(cè)響起功茴,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孽亲,沒想到半個月后坎穿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡返劲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年玲昧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篮绿。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡孵延,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亲配,到底是詐尸還是另有隱情尘应,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布吼虎,位于F島的核電站犬钢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏思灰。R本人自食惡果不足惜玷犹,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望官辈。 院中可真熱鬧箱舞,春花似錦、人聲如沸拳亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肺魁。三九已至电湘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹅经,已是汗流浹背寂呛。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘾晃,地道東北人贷痪。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蹦误,于是被迫代替她去往敵國和親劫拢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 事件對象(上) 事件復習 事件三要素: 事件源 + 事件名稱 + 事件處理程序 事件源 : 誰觸發(fā)這個事件 (按鈕...
    新生勿擾閱讀 232評論 0 0
  • 事件流分為兩種强胰,捕獲事件流和冒泡時間流 捕獲事件流:從根節(jié)點出發(fā)開始執(zhí)行舱沧,一直往子節(jié)點查找執(zhí)行,直到查到到根節(jié)點偶洋。...
    路上靈魂的自由者閱讀 397評論 0 0
  • 轉(zhuǎn)載自https://www.cnblogs.com/liugang-vip/p/5616484.html 起因:...
    React大法好閱讀 230評論 0 0
  • 轉(zhuǎn)載:為了永久查看熟吏,我都cv 過來,省的原作者刪除后找不到玄窝。 起因:1牵寺、這是前端面試的經(jīng)典題型,要去找工作的小伙伴...
    七色煙火閱讀 489評論 0 4
  • DOM0 事件和DOM2級在事件監(jiān)聽使用方式上有什么區(qū)別哆料? DOM 0 級事件是基于元素內(nèi)聯(lián)屬性或DOM元素命名的...
    邢烽朔閱讀 338評論 0 0