JS-事件類型(鼠標事件中event對象的獨有屬性)

本來想和上一篇一起寫,又擔心太長转培,導(dǎo)致自己復(fù)習時唾糯,看不下去,于是就另寫一篇筆記淮摔。


  • ClientX與ClientY返回客戶區(qū)坐標位置
    var bd=document.getElementById("bd");//body
    EventUtil.addHandler(bd,'click',function(evet){
    event=EventUtil.getEnent(event);
    alert('Client coordinates:'+event.clientX+','+event.clientY);
    })
被紅色包圍的部分為body

當在body區(qū)域點擊時私沮,會彈出鼠標點擊位置在整個客戶區(qū)的坐標。
還有一點需要注意,該坐標值是針對客戶區(qū),而不是頁面,當頁面向上或向下滾動時,并不會影響該位置的坐標值.

什么叫客戶區(qū)和橙?


懂了吧,是不包括菜單欄的
  • pageX與pageY頁面坐標位置
    var bd=document.getElementById("bd");
    EventUtil.addHandler(bd,'click',function(evet){
    event=EventUtil.getEnent(event);
    alert('Client coordinates:'+event.pageX+','+event.pageY);
    })
    這個屬性值,是從頁面本省而非視口的左邊和頂邊計算的.
    【注意】IE8及更早的版本不支持事件對象上的頁面坐標仔燕。有另個辦法可以幫助這些較早的版本獲取頁面坐標值。
  • 利用scrollTop魔招、scrollLeft前篇筆記關(guān)于UI事件時晰搀,有提到scroll事件,但是沒有仔細說办斑,因為它真的很奇怪

js高級程序設(shè)計這本書里外恕,提到如何兼容使用scroll值,但是實際操作中,我發(fā)現(xiàn)在火狐與谷歌的瀏覽器中即使CSS1Compat的渲染方式鳞疲,但是執(zhí)行時卻按照document.body.scrollTop的方式罪郊,所以這并沒有效果。
EventUtil.addHandler(window,'scroll',function(){
if(document.compatMode=='CSS1Compat'){
alert(document.documentElement.scrollTop);
}else{
alert(document.body.scrollTop);
}
})
但是有以中方簡單的方法卻可以實現(xiàn)
var top=document.documentElement.scrollTop||document.body.scrollTop;

  • 解決方法
    var bd=document.getElementById("bd");
    EventUtil.addHandler(bd,'click',function(event){
    var top=document.documentElement.scrollTop||document.body.scrollTop;
    var left=document.documentElement.scrollLeft||document.body.scrollLeft;
    event=EventUtil.getEvent(event);
    var pageX=event.pageX,pageY=event.pageY;
    if(!pageX){
    pageX=event.clientX+top;
    }
    if(!pageY){
    pageY=event.clientY+left;
    }
    alert(pageX+','+pageY)
    })
  • screenX與screenY屏幕坐標的位置
    這個獲得的就是鼠標的位置相對于整個電腦屏幕的位置建丧,這個瀏覽器兼容性很好排龄,就不舉例啦!
  • 修改鍵
    鍵盤上的某些按鍵也會影響到鼠標的行為翎朱,我們知道的就是橄维,按住shift鍵可以實現(xiàn)連選。
    這些修改鍵為shift拴曲、ctrl争舞、altmeta IE9澈灼、及現(xiàn)代瀏覽器都是支持這四個鍵的竞川,IE8不支持meta鍵。
    DOM中為相應(yīng)的鍵分別設(shè)置了event的四個屬性:event.shifkey叁熔、event.ctrlkey委乌、event.altkey、event.metakey荣回。這些屬性都是布爾值遭贸,來判斷用戶是否按下這些鍵。
    var bd=document.getElementById("bd");
    EventUtil.addHandler(bd,'click',function(event){
    if(event.shiftKey){
    alert('shift');
    }
    if(event.ctrlKey){
    alert('ctrl');
    }
    if(event.altKey){
    alert('alt');
    }
    if(event.metaKey){
    alert('meta');
    }
    })
    很簡單的一個例子心软。meta鍵指的是win系統(tǒng)中的windows鍵壕吹,蘋果中的cmd鍵。
  • 相關(guān)元素
  • 這個屬性很有用删铃,可以幫助解決這里最后的那個無法停止冒泡的問題耳贬。
    DOM為這兩個mouseover``與mouseout事件提供了更方便理解他們的屬性event.relatedTarget屬性。

mouseover事件猎唁,事件的主目標(this)是獲得光標的元素咒劲。而相關(guān)元素(.relatedTarget)是那個失去光標的元素。
mouseout事件诫隅,事件的主目標(this)是剛失去光標的元素缎患。而相關(guān)元素(.relatedTarget)是那個剛獲得光標的元素。
動筆劃一劃阎肝,我們會發(fā)現(xiàn)正常情況(非冒泡)情況下,相關(guān)屬性指向的元素永遠在主目標元素的外層肮街。

  • 理解這一點风题,可以很好的理解如何避免冒泡。
    IE8及之前版本并不支持relatedTarget屬性,但提供著保存了同樣信息的不同屬性沛硅。在mouseover事件觸發(fā)時眼刃,IE的fromElement屬性中保存著相關(guān)元素,在mouseout事件觸發(fā)時摇肌,IE的toElement屬性中保存著相關(guān)元素擂红。
    但是,我在ietest中測試時围小,卻發(fā)現(xiàn)事件對象在發(fā)生一個事件時不僅有from還有to且還都不為空昵骤。
    IE9支持所有這些屬性。
    這又是一個跨瀏覽器的屬性肯适,需要為之前的EventUtil添加獲得相關(guān)元素的方法变秦。
    getReleatedTarget:function(event){
    if(event.relatedTarget){
    return event.relatedTarget;
    }else if(event.type=='mouseover'&& event.fromElement ){
    return event.fromElement;
    }else if(event.type=='mouseout'&& event.toElement){
    return event.toElement;
    }else{
    return null;
    }
    }

  • 利用此屬性如何避免over與out事件的冒泡。
    function stopPropagationOfOverEnter(e, handler) {
    //handle為目標元素框舔,reltg為相關(guān)元素
    //獲得相關(guān)元素
    var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement;
    //這個循環(huán)是很巧秒的地方蹦玫,利用了之前總結(jié)的相關(guān)元素總在目標元素外層。
    //建議自己測試一下刘绣,冒泡過程中樱溉,this值變化為當前事件處理對象,
    //相關(guān)元素值保持該事件開始冒泡前的相關(guān)元素值纬凤,
    //所以一旦冒泡福贞,this值便會等于然后大于相關(guān)元素值。
    while (reltg && reltg != handler)
    reltg = reltg.parentNode;
    //相關(guān)元素等于當前事件處理元素移斩,說明存在第一層冒泡肚医,不進行循環(huán),返回false
    //相關(guān)元素在事件處理元素外層向瓷,說明不是冒泡肠套,
    //進入循環(huán)后,逐漸將相關(guān)元素移至外層猖任,為null你稚,不符和相關(guān)元素reltg為true,退出循環(huán)朱躺,返回true刁赖。
    //相關(guān)元素在事件處理程序內(nèi)層,說明已經(jīng)冒泡兩層以上长搀。
    //進入循環(huán)后宇弛,隨著相關(guān)元素逐漸移至外層至與this相等。退出循環(huán)后源请,返回false
    return (reltg != handler);
    }
    div.onmouseover=function(){
    if(isMouseLeaveOrEnter(event,this)){
    //對應(yīng)事件內(nèi)容
    }
    }
    【建議看我筆記的小伙伴進行操作測試枪芒,這樣更容易理解彻况,否則太虛】

  • 鼠標按鈕
    鼠標上一共有三個按鈕,左鍵舅踪、中鍵纽甘、右鍵。
    dom為事件對象提供了button屬性抽碌,來區(qū)分這三個按鈕悍赢。
    屬性值為0:左鍵;
    屬性值為1:中間鼠標按鈕货徙;
    屬性值為2:次鼠標按鈕左权;
    但是IE8及之前版本也提供了button屬性,但是卻更加細致化啦按鈕情況破婆。
    0:沒有按下涮总;
    1:表示按下了主鍵;
    2:按下了次鍵祷舀;
    3:同時主次瀑梗;
    4:按下中間;
    5:同時主中裳扯;
    6:按下了次中抛丽;
    7:按下了三個。
    但是饰豺,人類的手指不想那么辛苦亿鲜。所以最常見的做法就是將IE模型規(guī)范化為dom規(guī)范。
    getbuttom:function(event){
    if(document.implementation.hasFeature("MouseEvent",'2.0')){
    return event.button;
    }else{
    switch(event.button){
    case 0:
    case 1:
    case 3:
    case 5:
    case 7:
    return 0;
    case 2:
    case 6:
    return 2;
    case 4:
    return 1;

                      }
                  }
              }
    
  • detail屬性
    包含一個數(shù)值冤吨,表示在給定位置上發(fā)生了幾次單擊蒿柳。
    在同一個元素上,相繼的發(fā)生一次mousedown與一次mouseup算作一次單擊漩蟆。如果之間變換位置垒探,則detail值清零。


深夜發(fā)……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怠李,一起剝皮案震驚了整個濱河市圾叼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捺癞,老刑警劉巖夷蚊,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異髓介,居然都是意外死亡惕鼓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門唐础,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呜笑,“玉大人夫否,你說我怎么就攤上這事〗行玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵汞幢,是天一觀的道長驼鹅。 經(jīng)常有香客問我,道長森篷,這世上最難降的妖魔是什么输钩? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮仲智,結(jié)果婚禮上买乃,老公的妹妹穿的比我還像新娘。我一直安慰自己钓辆,他們只是感情好剪验,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著前联,像睡著了一般功戚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上似嗤,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天啸臀,我揣著相機與錄音,去河邊找鬼烁落。 笑死乘粒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的伤塌。 我是一名探鬼主播灯萍,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寸谜!你這毒婦竟也來了竟稳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熊痴,失蹤者是張志新(化名)和其女友劉穎他爸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體果善,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡诊笤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巾陕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讨跟。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡纪他,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晾匠,到底是詐尸還是另有隱情茶袒,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布凉馆,位于F島的核電站薪寓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澜共。R本人自食惡果不足惜向叉,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗦董。 院中可真熱鬧母谎,春花似錦、人聲如沸京革。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽存崖。三九已至冻记,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間来惧,已是汗流浹背冗栗。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留供搀,地道東北人隅居。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像葛虐,于是被迫代替她去往敵國和親胎源。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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

  • 什么是事件: 我們可以簡單的把事件理解為瀏覽器的感知系統(tǒng)屿脐。比如說:他可以感覺到用戶是否點擊(click)了頁面涕蚤、鼠...
    張松1366閱讀 6,794評論 1 6
  • 事件流 IE和Netscape開發(fā)團隊提出了完全相反的兩種事件流的概念,事件冒泡流和事件捕獲流的诵。 事件冒泡 事件由...
    exialym閱讀 936評論 0 9
  • 鼠標跟隨(鼠標?在元素的中心,緩動動畫慢慢移動)開始位置 var leaderX = pic.offsetLeft...
    悟空你又瘦了閱讀 548評論 0 1
  • 做項目是經(jīng)常會遇見需要對圖片進行剪裁的情況代赁,下面來點干貨 是不是很簡單啊,end扰她。兽掰。。徒役。
    前端杜若閱讀 477評論 0 0
  • 很多人問我最近在忙啥孽尽,我說在畫畫。他們都不解廉涕,覺得你好好的怎么就跑去畫畫了泻云,言外之意有點類似于好好的咋就出家了呢。...
    油畫君閱讀 806評論 4 7