【问题标题】:Is there a way to fire over events ignoring z-index?有没有办法触发忽略 z-index 的事件?
【发布时间】:2011-04-30 18:47:31
【问题描述】:

如果我有这样的事情:

有没有办法在两个 div 上触发 mouseover 事件?

编辑:对不起所有..我试图简化问题,以便清楚地理解,我忘了提到我有超过 100 个这样的 div,所以这些解决方案可能不起作用。我去看看我能不能适应它们。

【问题讨论】:

  • 我的猜测,这是来自使用其他 ECMAScript 衍生产品,不,你不能。
  • 但是我还没有在JS中真正做到过。
  • @Christopher - 你喜欢我的方法吗?
  • @Fosco 这或多或少是在 AS 中做到这一点的最佳方式......遗憾的是,ECMA 通常意味着这样的事件被吃掉了。

标签: jquery z-index jquery-events


【解决方案1】:

我在这里用 JSFiddle 整理了一个工作示例:

http://jsfiddle.net/gfosco/CU5YT/

它类似于 madeinstefanos 答案,但特定于您的示例..

var mouseX = 0;
var mouseY = 0;
var front = 0;
var back = 0;

function log(text) {
    $("#log").append(text + '<BR>');
}

function mouseWithin(selector) {
  var pos = $(selector).position();
  var top = pos.top;
  var left = pos.left;
  var height = $(selector).height();
  var width = $(selector).width();

  if (mouseX >= left && mouseY >= top && mouseX <= left + width 
                     && mouseY <= top + height) {
    return true;
  }
  return false;
}

$(document).bind('mousemove', function(e) {
    mouseX = e.pageX;
    mouseY = e.pageY;
    if (front == 1 && !mouseWithin("#front")) {
            front = 0;
            log('Front Leave');
    }
    if (back == 1 && !mouseWithin("#back")) {
            back = 0;
            log('Back Leave');
    }    
    if (front === 0 && mouseWithin("#front")) {     
            front = 1;
            log('Front Hover');
    }
    if (back === 0 && mouseWithin("#back")) { 
            back = 1;
            log('Back Hover');
    }        

});

【讨论】:

  • 一个更简洁的版本:$(document).bind('mousemove', function(e) { mouseX = e.pageX; mouseY = e.pageY; var onFront = mouseWithin("#front" ); var onBack = mouseWithin("#back"); if( !onFront ) { if( front ) log('Front Leave'); front = 0; } else { if(front ) log('Front Hover'); else log('Front Over'); front = 1; } if( !onBack ) { if( back ) log('Back Leave'); back = 0; } else { if( back ) log('Back Hover') ; else log('Back Over'); back = 1; } });
【解决方案2】:

这是可能的。您无法为位于另一个元素下方的元素的一部分获取 mouseenter|mouseover 事件,但如果您知道元素的尺寸和位置,则可以侦听 mousemove 事件并获取鼠标何时进入某个特定区域。

我创建了两个 div,和你的一样:

<div id="aboveDiv" style="position:absolute;top:30px;left:30px;width:100px;height:100px;background-color:red;z-index:2;"></div>
<div id="belowDiv" style="position:absolute;top:80px;left:80px;width:100px;height:100px;background-color:green;z-index:1;"></div>

我想知道鼠标什么时候进入下面的div所占据的区域,为此我写了这个脚本:

$(function (){

  var divOffset = {
    top: $("#belowDiv").position().top,
    left: $("#belowDiv").position().left,
    right: $("#belowDiv").position().left + $("#belowDiv").width(),
    bottom: $("#belowDiv").position().top + $("#belowDiv").height(),
    isOver: false
  }


  $(window).mousemove(function (event){
    if (event.pageX >= divOffset.left && event.pageX <= divOffset.right && event.pageY >= divOffset.top && event.pageY <= divOffset.bottom){
      if (!divOffset.isOver){
        divOffset.isOver = true;

        /* handler the event */
        alert("gotcha");
      }
    }else{
      if (divOffset.isOver){
        divOffset.isOver = false;
      }
    }
  });
});

监听mouseinter|mouseover并不简单,但效果很好。

这里是fiddle的链接

【讨论】:

  • 这样做的好方法,但需要额外检查 event.pageXevent.PageY 是否在这两个 div 的交集上。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2013-11-15
  • 2020-07-02
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2015-04-17
相关资源
最近更新 更多