jQuery中多個元素的Hover事件

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   使用   

  • 1.需求簡介
  • 2.樣本研究
  • 3.解決方案
1.需求簡介

jQuery的hover事件只是針對單個HTML元素,例如:

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

 

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

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

當滑鼠進入二者的“組合區”域時觸發fun1,離開時觸發fun2。你也許會想到使用下面的方式

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

 

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

<div id="container">    <div id="trigger"></div>    <div id="drop"></div></div>

 

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

 

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

2.樣本研究

為常見的下拉式功能表簡化圖,HTML結構如下:

$(‘#droplist‘).hover(function(){    $(this).find(‘ul‘).show();}, function(){    $(this).find(‘ul‘).hide();});

 

實現的JavaScrip程式也是非常簡單

$(‘#droplist‘).hover(function(){    $(this).find(‘ul‘).show();}, function(){    $(this).find(‘ul‘).hide();});

 

這種實現方式邏輯清晰,但導致HTML嵌套層級過多,書寫CSS時出現了許多不便。例如:

#nav li { font-size:14px;  }

 

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

#nav li li { font-size:12px; }

 

3.解決方案

更改HTML結構

<ul id="#nav">    <li></li>    <li></li>    <li id="trigger">下拉式功能表</li>    <li></li></ul><ul id="drop">    <li>下拉項1</li>    <li>下拉項2</li>    <li>下拉項3</li><ul>

 

依次引入JS檔案

<script type="text/javascript" src="js/jquery.js"></script><script type="text/javascript" src="js/jquery.mixhover.js"></script>

 

控制碼

$.mixhover(    ‘#trigger‘,     ‘#drop‘,     function(trg, drop){        #(drop).show();    },    function(trg, drop){        #(drop).hide();    })

 

這樣當滑鼠進入#trigger時將#drop顯示出來,滑鼠從#trigger移如#drop時不會觸發任何事件,實際上就是講#trigger和#drop元素當做一個元素來處理。

jquery.mixhover.js程式如下

/** * Author: http://rainman.cnblogs.com/ * Date: 2014-06-06 * Depend: 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) && $.isFunction(handleOut)) {        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;        handleIn = null;        handleOut = null;    }    // 整理參數 使得elements依次對應    var elems = [];    for (var i = 0, len = parms.length; i < len; 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 < size; j++) {                elems[i].push(p[j]);            }        } else {            elems[i].push(p);        }    }    // 綁定Hover事件    for (var i = 0, len = elems[0].length; i < len; i++) {        var arr = [];        for (var j = 0, size = elems.length; j < size; 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);            isIn = false;        }, 10);    });};

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.