2017百度前端技術(shù)學(xué)院-自定義右鍵菜單

效果預(yù)覽
源碼地址

一靴迫、事件流

1举塔、冒泡

  • 什么是事件冒泡
    官方的定義就是從最特定的事件目標(biāo)到最不特定的事件目標(biāo)冤议。
    意思就是說(shuō),假如用戶單擊了一個(gè)元素,該元素?fù)碛幸粋€(gè)click事件,那么同樣的事件也將會(huì)被它的祖先觸發(fā),這個(gè)事件從該元素開(kāi)始一直冒泡到DOM樹(shù)的最上層,這一過(guò)程稱為事件冒泡

示例:

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定義右鍵菜單</title>
</head>
<body>
    <ul id='menu'>
        <li>menu item 1</li>
        <li>menu item 2</li>
    </ul>
</body>
</html>

js

document.oncontextmenu =function (){
    alert('觸發(fā)了);
}

效果

2侦高、捕獲

  • 什么是事件捕獲
    事件捕獲和事件是相反的,也就是說(shuō),當(dāng)用戶觸發(fā)了一個(gè)事件的時(shí)候,這個(gè)事件是從DOM樹(shù)的最上層開(kāi)始觸發(fā)一直到捕獲到事件源.

標(biāo)準(zhǔn)的監(jiān)聽(tīng)事件方式(標(biāo)準(zhǔn)瀏覽器都可使用械馆,IE9以上)

    element.addEventListener(eventType, fn, false) 
說(shuō)明:
  • 第一個(gè)參數(shù): eventType:事件類型
  • 第二個(gè)參數(shù):fn 觸發(fā)的回調(diào)函數(shù)
  • 第三個(gè)參數(shù):一個(gè)布爾值胖眷,表示冒泡還是捕獲。false表示冒泡,true表示捕獲

IE下的監(jiān)聽(tīng)事件方式(IE專有)

·attachEvent(eventType,fn)· IE專有霹崎。

說(shuō)明:

此種監(jiān)聽(tīng)方式只有冒泡沒(méi)有捕獲珊搀。

注意:
  • 標(biāo)準(zhǔn)監(jiān)聽(tīng)方式不需加on
     document.addEventlistener('contextmenu',function (){
     alert('我是標(biāo)準(zhǔn)的我不需要on')
   },false)
  • IE監(jiān)聽(tīng)事件方式必須加on
    document.attachEvent('oncontextmenu',function(){
             alert('我是IE的我需要on')
    })

一般使用標(biāo)準(zhǔn)即可,如果兼容IE 8以下再考慮第二種尾菇,做兼容方式的書寫食棕。

二、oncontextmenu

屬于鼠標(biāo)事件错沽,鼠標(biāo)右鍵點(diǎn)擊即觸發(fā)簿晓。

用法:

我在document上綁定了此事件,通過(guò)事件冒泡機(jī)制觸發(fā)千埃。

document.oncontextmenu =function (){
    alert('觸發(fā)了);
}

3憔儿、事件對(duì)象event

概念:

Event 對(duì)象代表事件的狀態(tài),比如事件在其中發(fā)生的元素放可、鍵盤按鍵的狀態(tài)谒臼、鼠標(biāo)的位置、鼠標(biāo)按鈕的狀態(tài)耀里。
事件通常與函數(shù)結(jié)合使用蜈缤,函數(shù)不會(huì)在事件發(fā)生前被執(zhí)行

  • 標(biāo)準(zhǔn)瀏覽器中作為事件回調(diào)函數(shù)的第一個(gè)參數(shù)
        document.addEventlistener('contextmenu',function(ev){
             alert(ev)
    })
  • 低版本的IE作為window對(duì)象的一個(gè)屬性
        document.attachEvent('onc ontextmenu',function(){
             alert(window.event)
    })

一般如果不兼容ie 8以下,用標(biāo)準(zhǔn)下的event即可

4冯挎、取消默認(rèn)行為

event.preventDefault()

5底哥、阻止冒泡

event.stopPropagation()

說(shuō)明:

return false既可以阻止默認(rèn)行為,也可以阻止冒泡

6、獲取滾動(dòng)距離

  • chrome:

document.body.scrollTop(scrollLeft)

  • 非chrome:

document.documentElement.scrollTop(scrollLeft)

  • 兼容寫法:
      var scrollTop = document.documentElement.scrollTop||document.body.scrollTop,
        var scrollLeft = document.documentElement.scrollLeft||document.body.scrollLeft,

7趾徽、clientX(Y)

它提供事件發(fā)生時(shí)的應(yīng)用客戶端區(qū)域的水平坐標(biāo) (與頁(yè)面坐標(biāo)不同)续滋。例如,當(dāng)你點(diǎn)擊客戶端區(qū)域的左上角時(shí)孵奶,鼠標(biāo)事件的 clientX 值為 0 疲酌,這一值與頁(yè)面是否有水平滾動(dòng)無(wú)關(guān)

也就是說(shuō)到瀏覽器可視窗口的距離(不包括瀏覽器的工具欄)

8、 獲取元素具體尺寸

  • offsetHeight/offsetWidth

通常了袁,元素的offsetHeight是一種衡量標(biāo)準(zhǔn)朗恳,包括元素的邊框、垂直(水平)內(nèi)邊距和元素的水平(垂直)滾動(dòng)條(如果存在且渲染的話)和元素的CSS高度(寬度)

注意:

clientWidth/clientHeight的區(qū)別是载绿,`clientWidth/clientHeight 不包括邊框僻肖,和垂直(水平)滾動(dòng)條的寬度(高度)

9、獲取瀏覽器視口的尺寸

    var   browserHeight = document.documentElement.clientHeight,//瀏覽器視口的高度
                    browserWidth = document.documentElement.clientWidth; 
注意:

一開(kāi)始使用了window.innerWidth/window.innerHeight 來(lái)獲取視口尺寸卢鹦,結(jié)果在極限情況下被滾動(dòng)條覆蓋一部分臀脏,后來(lái)找到原因是:window.innerWidth/window.innerHeight 是把滾動(dòng)條也算在內(nèi)的

10、類數(shù)組轉(zhuǎn)換成數(shù)組

Array.prototype.slice.call(類數(shù)組,0)

11冀自、自定義右鍵菜單實(shí)現(xiàn)思路

1揉稚、讓自定義菜單相對(duì)于瀏覽器視口做絕對(duì)定位通過(guò)改變left/top值來(lái)改變每次菜單的位置
2、取消原來(lái)的右鍵菜單默認(rèn)行為
3熬粗、考慮極限情況搀玖,判斷event.clientX+菜單的offsetWidth/event.clientY+offsetHeight是否大于等于 document.documentElement.clientWidth/document.documemtElement.clientHeight ,如果大于等于,則把left/top賦值為event.clientX-菜單的offsetWidth/event.clientY-菜單的offsetHeight,否則賦值為event.clientX/event.clientY

js代碼:
    window.onload = function (){
  var oClick = document.getElementById('click_region'),
      oMenu = document.getElementById('menu'),
      aLi = oMenu.getElementsByTagName('li'),
      browserHeight = document.documentElement.clientHeight,//瀏覽器視口的高度
      browserWidth = document.documentElement.clientWidth; //瀏覽器視口的快讀驻呐,不包括垂直滾動(dòng)天的寬度

  document.oncontextmenu = function (ev){
    oMenu.style.display = 'block';
    var ev = ev||window.event,
        scrollTop = document.documentElement.scrollTop||document.body.scrollTop,
        scrollLeft = document.documentElement.scrollLeft||document.body.scrollLeft,
        clientX = ev.clientX,
        clientY = ev.clientY,
        // 注意:只有在隱藏的元素變成display:block的狀態(tài)才能獲取他的寬度和高度
        offsetWidth = oMenu.offsetWidth,
        offsetHeight = oMenu.offsetHeight,
        top,
        left;

    if(clientY+offsetHeight>=browserHeight){
       top = clientY-offsetHeight
    }else{
      top = clientY
    }

    if(clientX+offsetWidth>=browserWidth){
      left = clientX-offsetWidth
      console.log(left);
    }else{
      left = clientX
    }

    oMenu.style.left = left+'px';
    oMenu.style.top =scrollTop+top+'px';
    return false//阻止默認(rèn)行為灌诅,并且阻止冒泡
  }

  // 取消自定義菜單
  document.onclick = function (){
      oMenu.style.display = 'none';
  }

    var lis = Array.prototype.slice.call(aLi,0); //類數(shù)組轉(zhuǎn)成數(shù)組


    //遍歷數(shù)組
    lis.forEach(function (item,index,arr){
      aLi[index].onclick = function (event){
        alert(this.innerHTML)
         event.stopPropagation();
      }
    })

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市含末,隨后出現(xiàn)的幾起案子猜拾,更是在濱河造成了極大的恐慌,老刑警劉巖佣盒,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挎袜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肥惭,警方通過(guò)查閱死者的電腦和手機(jī)盯仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜜葱,“玉大人全景,你說(shuō)我怎么就攤上這事∏6冢” “怎么了爸黄?”我有些...
    開(kāi)封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵滞伟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我馆纳,道長(zhǎng)诗良,這世上最難降的妖魔是什么汹桦? 我笑而不...
    開(kāi)封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任鲁驶,我火速辦了婚禮,結(jié)果婚禮上舞骆,老公的妹妹穿的比我還像新娘钥弯。我一直安慰自己,他們只是感情好督禽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著狈惫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胧谈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天菱肖,我揣著相機(jī)與錄音客冈,去河邊找鬼。 笑死场仲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渠缕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褒繁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼褐健!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起澜汤,我...
    開(kāi)封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谁不,沒(méi)想到半個(gè)月后徽诲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刹帕,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偷溺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挫掏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褒傅,死狀恐怖袄友,靈堂內(nèi)的尸體忽然破棺而出殿托,到底是詐尸還是另有隱情剧蚣,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布礼搁,位于F島的核電站待诅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卑雁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一莹捡、第九天 我趴在偏房一處隱蔽的房頂上張望扣甲。 院中可真熱鬧篮赢,春花似錦琉挖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纱耻。三九已至,卻和暖如春弄喘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蘑志。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留费尽,地道東北人羊始。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓查描,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冬三。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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

  • 前言 2017-百度前端技術(shù)學(xué)院編碼任務(wù):自定義網(wǎng)頁(yè)右鍵菜單 任務(wù)目的 了解js中的oncontextmenu事件...
    朋友喜歡叫我春哥閱讀 990評(píng)論 0 2
  • 事件流 IE和Netscape開(kāi)發(fā)團(tuán)隊(duì)提出了完全相反的兩種事件流的概念敌蚜,事件冒泡流和事件捕獲流窝爪。 事件冒泡 事件由...
    exialym閱讀 930評(píng)論 0 9
  • 我們首先要明白,我們給頁(yè)面添加效果用到的js到底是什么纷跛?js其實(shí)包含三部分:dom 文檔對(duì)象模型 bom 瀏覽...
    一直以來(lái)都很好閱讀 796評(píng)論 0 0
  • 事件流: 事件流:頁(yè)面接收事件的順序邀杏。 IE定義的:事件冒泡流(由最具體的元素依次傳播到DOM樹(shù)的最上層的Docu...
    xiaoguo16閱讀 580評(píng)論 0 0
  • ? 日本是美式復(fù)古文化的推手之一,在將美式復(fù)古本土化的過(guò)程中還創(chuàng)造了個(gè)詞叫阿美咔嘰唤崭,意思是美式休閑。日本這個(gè)民族怎...
    丹寧說(shuō)閱讀 10,028評(píng)論 0 0