jquery 如何綁定事件绎速?直接綁定和使用事件代理分別如何使用

jquery 如何綁定事件

事件處理中最頭疼的就是瀏覽器兼容問題嫡良,jQuery封裝了很好的API,可以方便的進行事件處理

  • 簡單介紹 live bing dagelate
  • 對應(yīng)的解除監(jiān)聽的函數(shù)分別是unbind锭吨、die、undelegate
  1. bing
    一:bind(type,[data],function(eventObject))

    bind是使用頻率較高的一種寒匙,作用就是在選擇到的元素上綁定特定事件類型的監(jiān)聽函數(shù)零如,參數(shù)的含義如下:

    • type:事件類型,如click锄弱、change考蕾、mouseover等;

    • data:傳入監(jiān)聽函數(shù)的參數(shù),通過event.data取到会宪⌒の裕可選;

    • function:監(jiān)聽函數(shù),可傳入event對象掸鹅,這里的event是jQuery封裝的event對象塞帐,與原生的event對象有區(qū)別,使用時需要注意

bind的源碼:

  bind: function( types, data, fn ) {
 
  return this.on( types, null, data, fn );
 
  }
 
$('#myol li').bind('click',getHtml);

bind的特點就是會把監(jiān)聽器綁定到目標元素上巍沙,有一個綁一個葵姥,在頁面上的元素不會動態(tài)添加的時候使用它沒什么問題。但如果列表中動態(tài)增加一個“列表元素5”句携,點擊它是沒有反應(yīng)的榔幸,必須再bind一次才行。要想不這么麻煩矮嫉,我們可以使用live削咆。

jQuery還有一種事件綁定的簡寫方式如a.click(function(){});、a.change(function(){});等蠢笋,它們的作用與bind一樣拨齐,僅僅是簡寫而已。

二:live(type, [data], fn)
live的參數(shù)和bind一樣挺尿,它又有什么蹊蹺呢奏黑,我們還是先瞄一眼源碼:

live: function( types, data, fn ) {
 
jQuery( this.context ).on( types, this.selector, data, fn );
 
return this;

可以看到live方法并沒有將監(jiān)聽器綁定到自己(this)身上炊邦,而是綁定到了this.context上了。這個context是什么東西呢?其實就是元素的限定范圍熟史,看了下面的代碼就清楚了:

$('#myol li').context; //document
 
$('#myol li','#myol').context; //document
 
$('#myol li',$('#myol')[0]); //ol

通常情況下馁害,我們都不會像第三種方式那樣使用選擇器,所以也就認為這個context通常就是document了蹂匹,即live方法把監(jiān)聽器綁定到了 document上了碘菜。不把監(jiān)聽器直接綁定在元素上,你是不是想起事件委托機制來了呢?若沒有限寞,可以點擊這里回憶一下忍啸。live正是利用了事件委托機制來 完成事件的監(jiān)聽處理,把節(jié)點的處理委托給了document履植。在監(jiān)聽函數(shù)中计雌,我們可以用event.currentTarget來獲取到當前捕捉到事件的 節(jié)點。下面的例子來揭曉:
$('#myol li').live('click',getHtml);

三: dagelate
live存在那樣的缺點玫霎,所以我們就思考凿滤,既然老爺子負擔那么重,可不可以別把監(jiān)聽器綁定在document上呢庶近,綁定在就近的父級元素上不就好了翁脆。順應(yīng)正常邏輯,delegate誕生了鼻种。

參數(shù)多了一個selector反番,用來指定觸發(fā)事件的目標元素,監(jiān)聽器將被綁定在調(diào)用此方法的元素上叉钥“崭祝看看源碼:

delegate: function( selector, types, data, fn ) {
 
return this.on( types, selector, data, fn );
 
}

又是調(diào)用了on,并且把selector傳給了on沼侣∽婺埽看來這個on真的是舉足輕重的東西。照樣先不管它蛾洛。看看示例先:
$('#myol').delegate('li','click',getHtml);

在1.7之前的版本中jQuery處理事件有多個方法雁芙, (google 搜索: jquery live bind degelate)作用各不相同轧膘,后來統(tǒng)一的使用on/off方法

on/off

  1. .on( events [,selector ] [,data ], handler(eventObject) )

看起來參數(shù)及其復(fù)雜,我們看一下各個參數(shù)的意思

  • events:一個或多個空格分隔的事件類型和可選的命名空間兔甘,或僅僅是命名空間谎碍,比如"click", "keydown.myPlugin", 或者 ".myPlugin"

  • selector:一個選擇器字符串,用于過濾出被選中的元素中能觸發(fā)事件的后代元素洞焙。如果選擇器是 null 或者忽略了該選擇器蟆淀,那么被選中的元素總是能觸發(fā)事件

  • data:當一個事件被觸發(fā)時拯啦,要傳遞給事件處理函數(shù)的event.data

  • handler(eventObject):事件被觸發(fā)時,執(zhí)行的函數(shù)熔任。若該函數(shù)只是要執(zhí)行return false的話褒链,那么該參數(shù)位置可以直接簡寫成 false

簡單示例:

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> //不要忘記引入
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<p>點擊彈框</p>
<script>
$('p').on('click',function(){
  console.log($(this).text())
})
</script>
</body>
on
  1. .one
    .one( events [, selector ] [, data ], handler(eventObject) )
    on,綁定事件疑苔,但只執(zhí)行一次
$('p').one('click',function(){
  console.log($(this).text())
})
只執(zhí)行一次
  1. .off
    .off( events [, selector ] [, handler ] )
    移除一個事件處理函數(shù)
$('p').on('click',function(){
  console.log($(this).text())  
})  // 添加點擊事件
$('p').off('click') // 移除點擊事件
未移除
移除后

直接綁定和使用事件代理分別如何使用

  • 直接綁定
    示例:
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
  </ul>
  <input type="text">
  <button>添加</button>

  <script>
  $('ul li').on('click',function(){
    console.log($(this).text())
  })
  $('button').on('click',function(){
    var str = $('input').val() //獲取input的值
    var li1 = $('<li>'+ str + '</li>'); //新建li 接收 input的值
    li1.appendTo('ul')  //將li添加到隊列中去
  })
</script>

效果:


image

可以清楚的看到我們直接給li添加事件甫匹,會導(dǎo)致后來新增的DOMli點擊沒有效果,這個和javaScript的點擊事件和事件代理是一樣的惦费。我們可以使用事件代理來處理這個點擊事件
代碼

$('ul').on('click','li',function(){  // 選中ul 下的 li
  console.log($(this).text())
})
 $('button').on('click',function(){
    var str = $('input').val() //獲取input的值
    var li1 = $('<li>'+ str + '</li>'); //新建li 接收 input的值
    li1.appendTo('ul')  //將li添加到隊列中去
  })

效果:


image

給ul綁定事件兵迅,選中ul下的li 可以查看上面的綁定事件的on方法 下的

.on( events [,selector ] [,data ], handler(eventObject) )

selector:一個選擇器字符串,用于過濾出被選中的元素中能觸發(fā)事件的后代元素薪贫。如果選擇器是 null 或者忽略了該選擇器恍箭,那么被選中的元素總是能觸發(fā)事件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞧省,隨后出現(xiàn)的幾起案子扯夭,更是在濱河造成了極大的恐慌,老刑警劉巖臀突,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勉抓,死亡現(xiàn)場離奇詭異,居然都是意外死亡候学,警方通過查閱死者的電腦和手機藕筋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梳码,“玉大人隐圾,你說我怎么就攤上這事£瑁” “怎么了暇藏?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長濒蒋。 經(jīng)常有香客問我盐碱,道長,這世上最難降的妖魔是什么沪伙? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任瓮顽,我火速辦了婚禮,結(jié)果婚禮上围橡,老公的妹妹穿的比我還像新娘暖混。我一直安慰自己,他們只是感情好翁授,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布拣播。 她就那樣靜靜地躺著晾咪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贮配。 梳的紋絲不亂的頭發(fā)上谍倦,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音牧嫉,去河邊找鬼剂跟。 笑死,一個胖子當著我的面吹牛酣藻,可吹牛的內(nèi)容都是我干的曹洽。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辽剧,長吁一口氣:“原來是場噩夢啊……” “哼送淆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怕轿,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤偷崩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撞羽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阐斜,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年诀紊,在試婚紗的時候發(fā)現(xiàn)自己被綠了谒出。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡邻奠,死狀恐怖笤喳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碌宴,我是刑警寧澤杀狡,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站贰镣,受9級特大地震影響呜象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碑隆,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一董朝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧干跛,春花似錦、人聲如沸祟绊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘉熊,卻和暖如春遥赚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阐肤。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工凫佛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孕惜。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓愧薛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衫画。 傳聞我的和親對象是個殘疾皇子毫炉,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 本篇博客源地址 總結(jié): 鼠標事件 1.click與dbclick事件ele.click()ele.click(ha...
    ZombieBrandg閱讀 670評論 0 1
  • 1、 jQuery 能做什么削罩? jquery是一個豐富的js庫瞄勾,內(nèi)部對js的很多復(fù)雜的方法進行了封裝和加工,比如j...
    zh_yang閱讀 1,403評論 6 13
  • 總結(jié): 鼠標事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,599評論 2 10
  • 此篇文章是在51edu.com上copy過來的弥激,本來想注明作者的进陡,但是沒找到作者…… Query提供了多種綁定事件...
    java粑粑閱讀 6,048評論 1 2
  • 哈佛大學(xué)最受歡迎的課,《幸福的方法》 《幸福的方法》是哈佛大學(xué)最受歡迎的課微服,該書淺顯易懂趾疚,容易掌握,利于實操职辨,享動...
    蔣雪芳閱讀 258評論 1 1