国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

jQuery中mouseout控制div層時受其他標簽影響問題

2024-04-27 15:04:26
字體:
來源:轉載
供稿:網友

話說有一個DIV元素,其內部有一個IMG元素和SPAN元素,不用理會這兩個內部元素怎么布局,這不是我要討論的重點。

為了實現一些特殊的效果,我需要利用TD的onmouSEOver和onmouseout事件,測試時就會發現如下的狀況:

當鼠標移入DIV內部時,onmouseover事件被觸發;接著再鼠標移動到DIV內部的IMG或者SPAN元素之上,我們肯定不會認為這時鼠標已經移到了DIV的外邊,但奇怪的是onmouseout事件觸發了,而且緊接著onmouseover事件也馬上被觸發了。

這可不是我想要的,那么怎么來"屏蔽"內部元素給外層元素帶來的javascript事件干擾呢?

這里列舉兩種方法:

一. setTimeout

因為在鼠標移動到內部元素之上而觸發了外層元素的onmouseout事件后,外層元素的onmouseover也會馬上觸發,所以我們只需要把外層元素的onmouseout事件需要執行的動作延遲很短的一段時間來運行,然后在onmouseover事件中再執行clearTimeout方法,這樣就可以避免內部元素引起的事件干擾。

具體的執行過程請看下圖(縱向的虛線表示時間):

這是個很巧妙的的方法,因為當onmouseout觸發后,實質性的方法并沒有馬上執行,而是要等待一小段時間。如果在這段時間里馬上又觸發了 onmouseover事件,那么基本上就可以肯定onmouseout事件的觸發是因為內部元素的干擾了,所以在onmouseover事件中使用 clearTimeout來阻止延時的方法執行。

二.contains

在onmouseover時先進行如下判斷,結果為true時再執行方法體:

$("#popFormDiv").mouseover(function () {             var s = event.fromElement || event.relatedTarget;             if (!this.contains(s)) { $(this).show("slow"); }                    });

在onmouseout時先進行如下判斷,結果為true時再執行方法體:

$("#popFormDiv").mouseout(function () {             var s = event.toElement || event.relatedTarget;             if (!this.contains(s)) { $(this).hide("slow"); }         });

下面來解釋一下上面兩行代碼的含義:

在IE中,所有的HTML元素都有一個contains方法,它的作用是判斷當前元素內部是否包含指定的元素。我們利用這個方法來判斷外層元素的事件是不是因為內部元素而被觸發,如果內部元素導致了不需要的事件被觸發,那我們就忽略這個事件。

event.fromElement指向觸發onmouseover和onmouseout事件時鼠標離開的元素;event.toElement指向觸發onmouseover和onmouseout事件時鼠標進入的元素。

那么上面兩行代碼的含義就分別是:

○ 當觸發onmouseover事件時,判斷鼠標離開的元素是否是當前元素的內部元素,如果是,忽略此事件;

○ 當觸發onmouseout事件時,判斷鼠標進入的元素是否是當前元素的內部元素,如果是,忽略此事件;

這樣,內部元素就不會干擾外層元素的onmouseover和onmouseout事件了。

但問題又來了,非IE的瀏覽器并不支持contains函數,不過既然我們已經知道了contains函數的作用,就可以自行添加如下的代碼來為非IE瀏覽器增加contains支持:

if (typeof (HTMLElement) != "undefined") {             HTMLElement.PRototype.contains = function (obj) {                 while (obj != null && typeof (obj.tagName) != "undefined") {                     if (obj == this)                         return true;                      obj = obj.parentNode;                 }                  return false;              };          }

上面不的方法不兼容火狐:

重點是jQuery:

jQuery中可以使用mouseleave來代替mouseout,這樣就不會發生上面所說的事情了。

還有就是,mouseover會不斷的被反復觸發,用mouseenter代替就好了。

完美解決~


上一篇:javascript的 === 和 ==

下一篇:jquery之滾樓

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盖州市| 内乡县| 北流市| 饶阳县| 青海省| 苍南县| 巴塘县| 泰来县| 新余市| 揭阳市| 弥渡县| 衡水市| 安义县| 利川市| 旺苍县| 滨海县| 翼城县| 和田县| 万山特区| 雷山县| 衡阳市| 古田县| 弥渡县| 社会| 图们市| 高平市| 商河县| 江永县| 松潘县| 佛坪县| 长治市| 雷山县| 贺州市| 东台市| 环江| 北海市| 安平县| 肥乡县| 新干县| 阳新县| 合阳县|