当鼠标进入二者的区域时触发fun1,离开时触发fun2。你也许会想到使用下面的方式

首頁  >  文章  >  web前端  >  jQuery中多個元素的Hover事件解決方案_jquery

jQuery中多個元素的Hover事件解決方案_jquery

WBOY
WBOY原創
2016-05-16 16:44:471607瀏覽
1.需求簡介

jQuery的hover事件只是針對單個HTML元素,例如:
複製代碼 程式碼如下:

$('#login').hover(fun2, fun2);

當滑鼠進入#login元素時呼叫fun1函數,離開時則呼叫fun2函數,這種API已能滿足絕大部分需求。

不過,有些時候我們希望當滑鼠進入兩個或多個元素時觸發fun1,離開他們時觸發fun2,而在這些元素間移動滑鼠並不觸發任何事件。例如兩個元素緊鄰的HTML元素,如下圖:

jQuery中多個元素的Hover事件解決方案_jquery 

當滑鼠進入二者的區域時觸發fun1,離開時觸發fun2。你或許會想到用下面的方式
複製程式碼 程式碼如下:

$(' trigger, #drop'),hover(fun1, fun2);

這種方式並不能滿足我們的需求,因為從#trigger進入#drop時會觸發fun2和fun1。要解決這個問題,比較簡單的方式是改變HTML結構,實作方式如下:
複製程式碼 程式碼如下:






$('#container').hover(fun1, fun2);

這樣透過在父元素上綁定hover事件來實現此功能。

2.範例研究

下圖為常見的下拉式選單簡單化圖,HTML結構如下:

jQuery中多個元素的Hover事件解決方案_jquery 
  




複製程式碼


程式碼如下:


ul id="#nav">



  • 下拉選單

    • 下拉項目1
    • 下拉項目2
    • 下拉項3
    • 實現的JavaScrip程序也是非常簡單




      複製代碼

      程式碼如下:

      $('#droplist').hover(function(){ $(this).find('ul').show(); } , function(){ $(this).find('ul').hide(); });
      這種實作方式邏輯清晰,但導致HTML嵌套層級過多,書寫CSS時出現了許多不便。例如:



      複製程式碼
      我們希望這段CSS為第一層li元素設定14像素字體,但是其也作用於了第二層元素,所以不得不使用下面的語句改寫過來



      複製程式碼
      程式碼如下:

      #nav li li { font-size:12pxx; } 3.解決方案 更改HTML結構



      複製代碼


      代碼如下:





      • 下拉式選單
    • 下拉項目1
    • 下拉項目2
    • 下拉項3

      • 依序引入JS檔案
        複製程式碼 程式碼如下:


        程式碼如下:


        複製程式碼


        程式碼如下:



        程式碼如下:


        $. 🎜>'#trigger',
        '#drop',
        function(trg, drop){
        #(drop).show();
        },
        function(trg, drop);
        },
        function(trg, drop ){
        #(drop).hide(); } ) 這樣當滑鼠進入#trigger時將#drop顯示出來,滑鼠從#trigger移如#drop時不會觸發任何事件,實際上就是講#trigger和#drop元素當做一個元素來處理。
        jquery.mixhover.js程式如下




        複製程式碼


        程式碼如下:/**
        * 作者:http://rainman.cnblogs.com/
        * 日期:2014-06-06
        * 依賴:jQuery
        */
        $.mixhover = function() {
        // 整理參數$.mixhover($e1, $e2, handleIn, handleOut)
        var parms;
        var length = arguments.length;
        var handleIn = arguments[length - 2];
        var handleOut = arguments[length - 1];
        if ($.isFunction(handleIn) & &t.Function & G. )) {
        parms = Array.prototype.slice.call(arguments, 0, length - 2);
        } else if ($.isFunction(handleOut)) {
        parms = Array.prototype.slice .call(arguments, 0, length - 1);
        handleIn = arguments[length - 1];
        handleOut = null;
        } else {
        parms = arguments;
        } else {
        parms = arguments; ;
        handleOut = null;
        }

        // 整理參數使得elements依序對應
        var elems = [];
        for (var i = 0, len = parms.length ; i elems[i] = [];
        var p = parms[i];
        if (p.constructor === String) {
        p = $ (p);
        }
        if (p.constructor === $ || p.constructor === Array) {
        for (var j = 0, size = p.length; j elems[i].push(p[j]);
        }
        } else {
        elems[i].push(p);
        }
        }

        // 綁定Hover事件
        for (var i = 0, len = elems[0].length; i var arr = [];
        for (var j = 0, size = elems.length; j arr.push(elems[j][i]);
        }
        $._mixhover(arr, handleIn, handleOut);
        }
        };
        $._mixhover = function(elems, handleIn, handleOut) {
        var isIn = false, timer;
        $(elems).hover( function() {
        window.clearTimeout(timer);
        if (isIn === false) {
        handleIn && handleIn.apply(elems, elems);
        isIn = true
        ;
        ; }
        },
        function() { timer = window.setTimeout(function() { handleOut && handleOut.apply(elems, elems); is = false; }, 10); }); };
    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn