Web之事件處理


javascript處理事件

事件種類

  • 基本事件(表單,window,鍵盤,鼠標(biāo))
  • HTML5事件(網(wǎng)絡(luò),通信,拖拽,歷史記錄等等)
  • 移動(dòng)設(shè)備事件
  • 自定義事件

事件處理器的注冊(cè)

首先得到元素對(duì)象element

  • element.onEvent=handler;
    這樣的注冊(cè)只能注冊(cè)一個(gè)處理程序,但優(yōu)先級(jí)最高,最先處理
  • element.addEventListener(eventName,handler,bool);
    bool值決定是事件處理器注冊(cè)還是捕獲程序注冊(cè),兩者的區(qū)別在于調(diào)用的順序不同,false時(shí)是處理器,從下往上冒泡調(diào)用,而true是捕獲注冊(cè),從上往下直到調(diào)用父元素的處理程序?yàn)橹梗簿褪钦f(shuō)我注冊(cè)的捕獲程序是我的子元素發(fā)生事件時(shí)調(diào)用的。事件處理器執(zhí)行的順序是按注冊(cè)順序。
  • element.attachEvent('onEventName',handler);
    這種可以定義多個(gè)處理器,但它們執(zhí)行的順序卻不一定,所以呵呵了。。。

事件處理的過(guò)程

運(yùn)行環(huán)境

一般情況下事件處理函數(shù)中的this指事件目標(biāo)(個(gè)人覺(jué)得就是注冊(cè)的元素對(duì)象),但是attach定義時(shí)指window

作用域

同所有javascript函數(shù)一樣,遵循閉包特性,其作用域是其定義時(shí)的作用域。但采用第一種方法定義時(shí)被轉(zhuǎn)換為能存取全局變量的頂級(jí)函數(shù),但比如open函數(shù),就要寫成window.open。

返回值

通過(guò)返回false來(lái)否定默認(rèn)操作

傳播
  • 一般冒泡傳播直至window,處理分三個(gè)階段,首先是捕獲,然后執(zhí)行處理器,再向上傳播,依次重復(fù)這樣的過(guò)程
  • 但focus,scroll,blur事件例外,且load事件傳播到documentation對(duì)象停止,整個(gè)文檔加載完畢,window的處理器才執(zhí)行。
  • 通過(guò)在處理器中使用startpropagation函數(shù)來(lái)阻止傳播,但本元素定義的處理器還是會(huì)執(zhí)行,可以用preventDefault函數(shù)來(lái)阻止默認(rèn)操作

jquery處理事件

jquery事件處理器

  • jquery的事件處理程序一般只有一個(gè)參數(shù)(必定是第一個(gè)參數(shù)),那就是jquery事件對(duì)象。
  • jquery處理器中的this指向的是對(duì)應(yīng)html元素,需要轉(zhuǎn)成jquery對(duì)象,看下面例子
$("p").click(function(){
    $(this).css({background,#555555});  
});
  • jquery處理器的返回值始終有意義,如果返回false,該事件的默認(rèn)行為及接下來(lái)的冒泡傳播均會(huì)停止,類似于調(diào)用了stopPropagation和preventDefault.
  • 要想傳入多個(gè)參數(shù),需用trigger函數(shù)顯式觸發(fā)事件。

jquery事件對(duì)象

包含了jquery事件的詳細(xì)信息,有諸多NB屬性,比如data屬性,還定義了preventDefault等方法。

jquery注冊(cè)

簡(jiǎn)單注冊(cè)
$(".sign").click(handler);
//jquery對(duì)象.簡(jiǎn)單事件類型名(處理器);
//注意,以下為特例
$(selector).hover(f,g);
//為鼠標(biāo)放上去和離開分別注冊(cè)
$(selector).toggle(f1,f2,f3...);
//第i次事件調(diào)用fi
高級(jí)注冊(cè)
$('a').on('mouseover mouseleave',handler);
$('a').on({
    mouseover:f,
    mouseleave:g
});
$('a').on('mouseover',{sb:6},handler);
//對(duì)于動(dòng)態(tài)元素怎么辦呢
$(parent).on(name,childSelector,{sb:6},handler);
//用父元素為它注冊(cè)
//中間參數(shù)會(huì)作為jquery事件對(duì)象的data屬性值
//one方法使用與on一致,但只起一次作用,搞完就注銷

事件注銷

$(selector).off('EventName');
//移除該事件所有處理器
$(selector).off(jquery對(duì)象);
$('a').off({
    mouseover:f,
    mouseleave:g
});//移除單個(gè)處理器

事件觸發(fā)

$('a').click();
//$(selector).SimpleEventName();但這樣不能手動(dòng)觸發(fā)addEventListener和attachEvent注冊(cè)的處理器
$(selector).trigger(EventName,[args]);
//triggerHandler方法觸發(fā)的事件不會(huì)冒泡也沒(méi)有默認(rèn)操作
$(selector).live(Name,handler)
//為動(dòng)態(tài)元素即在注冊(cè)后添加的元素也注冊(cè),取消用die,用法基本同bind與unbind

Angular處理事件

事件的產(chǎn)生與傳播

基本事件

Angular定義了一系列的基本事件,很多以ng-××的形式,和$××的形式

自定義事件
$scope.$emit('name','args');
//冒泡傳播至$rootScope
$scope.$broadcast('name','args');
//向下傳播給自己所有的子scope

上次博客中提到訪問(wèn)$rootScope的變量可以讓不同的controllers通信,但采用共享數(shù)據(jù)通信畢竟不正統(tǒng)也缺乏響應(yīng)性,采用事件也是controllers通信的一個(gè)好方法啊。

事件處理器的注冊(cè)

  • 在html里通過(guò)ng-click之類的綁定處理函數(shù)
  • $scope.$on('name',handler);
  • $scope.$watch(variable-name,handler);
    watch是監(jiān)視被ng-model所綁定的變量,當(dāng)它們變化時(shí)就會(huì)調(diào)用watch所定義的處理器函數(shù),Angular維護(hù)一個(gè)watch隊(duì)列,瀏覽器接收到事件時(shí)$digest就會(huì)檢視這個(gè)隊(duì)列,一旦發(fā)現(xiàn)變化就更新dom并且改變頁(yè)面對(duì)應(yīng)的地方,但$digest只會(huì)檢視進(jìn)入angular context的事件
    使用$scope.$apply()會(huì)強(qiáng)制進(jìn)行一次digest操作
  • 使用jquery的方式來(lái)注冊(cè)
    通過(guò)angular.element(CSS選擇器)可以得到j(luò)query對(duì)象,然后像jquery一樣去去注冊(cè)

詳細(xì)的例子可以看這兩篇文章
理解$watch ,$apply 和 $digest --- 理解數(shù)據(jù)綁定過(guò)程
angularjs的事件 $broadcast and $emit and $on

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • <a name='html'>HTML</a> Doctype作用?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)、<...
    clark124閱讀 3,570評(píng)論 1 19
  • 這篇博文主要是寫給新手的,是給那些剛剛開始接觸Angular,并且想了解數(shù)據(jù)幫定是如何工作的人。如果你已經(jīng)對(duì)Ang...
    iqing2012閱讀 386評(píng)論 0 3
  • 以下文章為轉(zhuǎn)載,對(duì)理解JavaScript中的事件處理機(jī)制很有幫助,淺顯易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy閱讀 3,075評(píng)論 1 10
  • 使用cartool工具可以直接提取素材至指定目錄中,使用方法:1. 到github上下載cartool項(xiàng)目2. 在...
    cweioo閱讀 1,162評(píng)論 0 1
  • 突然感覺(jué)簡(jiǎn)書很便,不就是學(xué)習(xí)記錄嘛。何必要費(fèi)力不討好的寫自己的bolg,而且還是一個(gè)不會(huì)后臺(tái)的前端狗。 今天本來(lái)是...
    前端狗閱讀 2,800評(píng)論 1 4