1. 程式人生 > >js對mouseover和mouseout事件處理

js對mouseover和mouseout事件處理

mouseover和mouseout事件是SPA經常用到的兩個事件,很多時候我們期望通過捕獲這兩個事件來操作目標DOM或者源DOM,但是當我們添加了事件監聽,捕獲事件控制代碼以後通過this方法或者event.target(event.srcElement)方式得到的目標DOM或者源DOM 並不是我們所期望的。尤其是當涉及到源DOM或者目標DOM內含有多級子元素時,這兩個事件的響應變得更加讓人迷惑。

之所以會產生以上情況,主要原因就是js的事件冒泡機制:當一個元素觸發了某一事件以後,該事件會逐級向上冒泡,觸發所有祖先元素所繫結的同類事件。由此不難理解,當一個元素有子元素時,我們對其繫結mouseover和mouseout事件,當滑鼠在該元素上移動時,由於冒泡機制,就會在不適宜的時候觸發事件。這裡借用其他兄弟的一段話:為了阻止mouseover和mouseout的反覆觸發,這裡要用到event物件的一個屬性relatedTarget,這個屬性就是用來判斷 mouseover和mouseout事件目標節點的相關節點的屬性。簡單的來說就是當觸發mouseover事件時,relatedTarget屬性代表的就是滑鼠剛剛離開的那個節點,當觸發mouseout事件時它代表的是滑鼠移向的那個物件。由於MSIE不支援這個屬性,不過它有代替的屬性,分別是 fromElement和toElement。

以下是一個簡單的能夠說明這兩個事件特殊處理的例子:

$('#customer_filterBox').on('mouseover', '.customer_filterCondition', function(e){
$(this).siblings().removeClass('cur')
showFilterConditionBox = $(this).attr('tar');
$('#customer_filterConditionBox').find('ul.'+showFilterConditionBox).show().siblings().hide();
});
$('#customer_filterBox').on('mouseout', '.customer_filterCondition', function(e){
var toTarg = getEvent(e).relatedTarget || getEvent(e).toElement;
if($(toTarg).parent().hasClass('customer_filterConditions')){
$('#customer_filterBox').find('.customer_filter-'+showFilterConditionBox).addClass('cur');
}
else if($(toTarg).hasClass('customer_filterCondition')){
return;
}
else{
$('#customer_filterBox').find('.customer_filterCondition').removeClass('cur');
$('#customer_filterConditionBox').find('ul').hide();
}
});
$('#customer_filterConditionBox').on('mouseout', function(e){
var toTarg = getEvent(e).relatedTarget || getEvent(e).toElement;
if($(toTarg).hasClass('customer_filterCondition') || $(toTarg).hasClass('customer_filter_condition')){
return;
}
else{
$('#customer_filterBox').find('.customer_filterCondition').removeClass('cur');
$('#customer_filterConditionBox').find('ul').hide();
}
});

以上程式碼直接截取了前段時間一個專案內的程式碼,有時間會對此處進行詳述。

這段程式碼主要是實現一個滑鼠懸浮自動切換tab的功能,dom結構如下:

<div class="customer_filterClass">
<span class="customer_filterCondition customer_filter-service" tar="service">服務包</span>
<span class="customer_filterCondition customer_filter-enterprise" tar="enterprise">企業</span>
<span class="customer_filterCondition customer_filter-community" tar="community">社群</span>
<div class="customer_filterConditionBox" id="customer_filterConditionBox">
<ul class="customer_filterConditions service" name="service"></ul>
<ul class="customer_filterConditions enterprise" name="enterprise"></ul>
<ul class="customer_filterConditions community" name="community"></ul>
</div>
</div>

此段只做提醒自己使用,其中的具體原因待有時間另寫文章解釋。

相關推薦

jsmouseovermouseout事件處理

mouseover和mouseout事件是SPA經常用到的兩個事件,很多時候我們期望通過捕獲這兩個事件來操作目標DOM或者源DOM,但是當我們添加了事件監聽,捕獲事件控制代碼以後通過this方法或者event.target(event.srcElement)方式得到的目標D

js當中mouseovermouseout多次觸發(非冒泡)

JS當中,mouseover和mouseout多次觸發事件,不光是冒泡會產生,就是不冒泡,在一定條件下 ,也會產生多次觸發事件; 例如下面的結構的情況下,我在class="ceng_up feature_tips"這個層上加這兩個事件,就會多次觸發mouseover和mou

javascript中mouseovermouseout事件詳解

  與 mouseenter 事件不同,不論滑鼠指標穿過被選元素或其子元素,都會觸發 mouseover 事件。只有在滑鼠指標穿過被選元素時,才會觸發 mouseenter 事件。   與 mouseout 事件不同,只有在滑鼠指標離開被選元素時,才會觸發

重複繫結mouseovermouseout事件

滑鼠懸浮日期上顯示日程數量        我需要實現滑鼠懸浮在日期顯示提示資訊,提示資訊用了layer外掛,提示資訊內容是新建的日程數量,效果圖如下:     滑鼠放在17號顯示了當前日期新建了19條日程記錄,這裡需要在初始化日曆的時候,為有日程記錄的日期繫結事件,重複繫

JQuery中使用mouseover事件mouseout事件作用在同一個元素上時出現閃爍現象

前提:實現一個電影網站中的關於選定圖片出現一個新的div容器展示具體電影詳情的功能(通過使用visibility屬性隱藏一個div並顯示另一個div)操作:我把mouseover事件和mouseout事件作用到一個div容器時,整個div出現了閃爍的現象,原因:糾結了很久,才

mouseentermouseleave的用法(處理mouseovermouseout亂跳的情況)

$(function(){ $(document).ready(function(){ $("#test").mouseenter(function(){ //在這寫有焦點時的邏輯 })

jq:mouseovermouseout多次觸發解決辦法

mouseover ren div clas 結構 tro 需要 als ldr 區別: mouseover與mouseenter   不論鼠標指針穿過被選元素或其子元素,都會觸發 mouseover 事件。   只有在鼠標指針穿過被選元素時,才會觸發 mouseenter

jQuery的文件引入、入口函數以及jsjquery象之間的互相轉換

現象 length 一個 cti 編寫 3.3 方法 使用 ntb JavaScript與jquery的區別 JavaScript是一門編程語言,用來編寫客戶端瀏覽器腳本。 jQuery是javascript的一個庫,包含多個可重用的函數,用來輔助簡化javascript

SAP BTE訊息(事件處理)

小技巧-業務交易事件BTE BTE是什麼,當然不是BT的ERP, E文全稱Business Transaction Event,業務交易事件,我們知道一般的增強(Tcode:SMOD|CMOD)依舊使用ABAP,BTE則可提供了RFC呼叫其它產品的可能(Tcode:FIBF),舉一個檢查物料主資

使用JDBCBLOBCLOB進行處理

從網上看到這篇文章,轉過來做為學習用 設有表: create table blobimg (id int primary key, contents blob); 一、BLOB入庫的專用訪問:     1) 最常見於Oracle的JDBC示例中     一般是先通過se

DOM同時設定mouseovermouseout事件控制元素顯示時出現閃爍問題

在給一個DOM元素同時設定mouseover與mouseout事件來控制另一元素顯示與隱藏式時會出現閃爍問題。 這是由js事件的冒泡引起的,在網上找了很多解決方案,經測試很多都沒有效果。 最終找到一個

JavaScriptHTML事件處理程式屬性中的this的含義

HTML裡事件處理程式屬性中的this: HTML文件裡事件處理程式屬性中的this表示觸發此事件的元素。例如: <iframe id="iframe" src="{{url}}" width="{{iframewidth}}" height="{{iframehe

C語言中時間日期的處理

北京燕園智峰韓語培訓中心 韓語:依附於漢城(首爾)著名大學--漢城(首爾)大學的授課內容,短期內使學員快速掌握韓語培訓的聽、說、讀寫能力。教員由漢城(首爾)著名大學--延世大學的講師和漢城(首爾)專業培訓的歸國老師共同打造韓語課程。本班質量可靠、學費低廉,是大學生選擇學韓語的首佳之選。培訓機構自從開辦六年以

JavaScript中mouseovermouseout多次觸發解決辦法

問題描述 我希望當滑鼠移動到id1上的時候,id2顯示,當滑鼠離開id1的時候,id2顯示。問題如下:  1.當滑鼠從id1上移動到id2上的時候,id由有顯示變為不顯示,然後變為顯示  2.當滑鼠從id2上移動到id1上的時候, id2有顯示變為不顯示,然後變為顯示  我希望的是當滑鼠在id1或者id2

Xstream解析XML,包括陣列List的處理

使用Xstream須要引入xstream-1.4.jar和xpp3-1.1.4c.jar import com.thoughtworks.xstream.XStream; import com.hikvision.bms.main.Person; /** * 使用Xstr

vue中滑鼠劃過事件處理方式

vue中對滑鼠劃過進行處理 滑鼠事件進行監聽 需求中,在一個table(元件)表中,對於其中一列(該列為圖片列),當滑鼠劃過該列的某個單元格子(圖片)時,需要展示出該單元格子對應的遮罩層 翻閱了一些部落格,發現好多都提到了mouse事件,如mouseove

[js筆記] focusblur事件之表單驗證

focus 當一個元素獲得焦點時,這個DOM節點會觸發focus事件 blur 當一個元素失去焦點時,這個DOM節點會觸發blur事件 <!DOCTYPE html PU

Android鍵盤觸控事件處理

activity和VIEW都能接收觸控和按鍵,如果響應事件只需要在繼承類裡複寫事件函式即可 但是對於VIEW來說,我們如果不改變DRAW,不需要繼承,所以如果想響應事件,則需要 當一個檢視(如一個按鈕)被觸控時,該物件上的 onTouchEvent() 方法會被呼叫。不過,為

jQueryExtJS的timeOut超時設定event事件處理

ajax請求如何自定義超時時間,並處理相應的超時事件呢? 對jQuery來說,超時可以直接設定timeout引數,並在error事件中捕獲第二個引數,如果是“timeout”則表明捕獲了超時事件,非常清楚。 例子: $.ajax({ type: "POST"

mouseovermouseout多次出發解決方案。

原文地址:http://litib.tk/2010/08/mouseover%E5%92%8Cmouseout%E5%A4%9A%E6%AC%A1%E8%A7%A6%E5%8F%91%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/ 在用到mo