一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

jQuery中hover事件使用方法详解

时间:2015-04-11 编辑:简简单单 来源:一聚教程网


hover(over,out)一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。这是一个自定义的方法,它为频繁使用的任务提供了一种“保持在其中”的状态。
当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。而且,会伴随着对鼠标是否仍然处 在特定元素中的检测(例如,处在div中的图像),如果是,则会继续保持“悬停”状态,而不触发移出事件(修正了使用mouseout事件的一个常见错 误)。


参数 :

over (Function) : 鼠标移到元素上要触发的函数
out (Function): 鼠标移出元素要触发的函数

示例 :

鼠标悬停的表格加上特定的类

jQuery 代码:

$(“td”).hover(
function () {
$(this).addClass(“hover”);
},
function () {
$(this).removeClass(“hover”);
}
);

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结构,实现方式如下:


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


这样通过在父元素上绑定hover事件来实现此功能。

2.示例研究


下图为常见的下拉菜单简化图,HTML结构如下:



    
  •     
  •              下拉菜单         
                  
    • 下拉项1
    •             
    • 下拉项2
    •             
    • 下拉项3
    •         
                 
    实现的JavaScrip程序也是非常简单
    $('#droplist').hover(function(){
    
        $(this).find('ul').show();
    
    }, function(){
    
        $(this).find('ul').hide();
    
    });


    这种实现方式逻辑清晰,但导致HTML嵌套层级过多,书写CSS时出现了许多不便。例如:

    css;toolbar:false">#nav li { font-size:14px;  }


    我们希望这段CSS为第一层li元素设置14像素字体,但是其也作用于了第二层元素,所以不得不使用下面的语句改写过来

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


    3.解决方案


    更改HTML结构

    
    
        
  •     
  •     下拉菜单     
  •     
  • 下拉项1
  •     
  • 下拉项2
  •     
  • 下拉项3

    • 依次引入JS文件

      javascript" src="js/jquery.js">
      
      

      控制代码

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


      这样当鼠标进入#trigger时将#drop显示出来,鼠标从#trigger移如#drop时不会触发任何事件,实际上就是讲#trigger和#drop元素当做一个元素来处理。

      jquery.mixhover.js程序如下

      /**
       
       * 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);
          });
      };

      相关文章

      热门栏目