jquery – 不要在子节点上触发悬停事件

前端之家收集整理的这篇文章主要介绍了jquery – 不要在子节点上触发悬停事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带瓷砖的容器(草,水等),其中一些我有物品(边境精灵,树木和一般物品).由于精灵的性质,所有项目都是64×64,而瓷砖只有32×32.

我的问题是我想在磁贴上触发悬停事件,但它们有时会被另一个磁贴的项目遮挡.

下图显示了问题.厚厚的绿色区域是我想要悬停树木时真正悬停的瓷砖.

the problem http://upload.cip.nu/pfile.php?file_id=2327

CSS:

#map_canvas .tile{
    height: 32px;
    position: absolute;
    width: 32px;
}
#map_canvas .tile .item{
    background-position: bottom right;
    background-repeat: no-repeat;
    bottom: 0;
    display: inline-block;
    height: 64px;
    margin: 0;
    padding: 0;
    position: absolute;
    right: 0;
}

HTML,简化:

<div class="tile" style="background-image: url(grass.png);"></div>
<div class="tile" style="background-image: url(grass.png);"></div>
<div class="tile" style="background-image: url(grass.png);">
    <div class="item" style="background-image(top-left-border.png);"></div>
</div>

这是现场演示http://sleavely.com/tiles/

我甚至不知道如何表达这个问题,但是这里有:

是否有可能只触发父元素(.tile)上的事件,以便溢出的子元素(.item)不会混淆我真正悬停的哪个图块?

编辑:感谢@Brilliand我实现了以下内容

function figureOutTile(e){
    var $source = jQuery(e.srcElement);
    if($source.hasClass("item")){
        var $parent = $source.parent();
        var posx = $parent.attr("col");
        var posy = $parent.attr("row");
        if(e.offsetY <= 32){
            if(e.offsetX <= 32){
                return jQuery(".tile[col="+ (posx-1) +"][row="+ (posy-1) +"]");
            }else{
                return jQuery(".tile[col="+ posx +"][row="+ (posy-1) +"]");
            }
        }else{
            if(e.offsetX <= 32){
                return jQuery(".tile[col="+ (posx-1) +"][row="+ posy +"]");
            }else{
                return $parent;
            }
        }
    }else{
        return $source;
    }
}
jQuery("#map_viewport").on({
    mouseenter: function(e) {
        var $target = figureOutTile(e);
        $target.addClass('hovered');
    },mouseleave: function() {
        jQuery(".tile.hovered").removeClass('hovered');
    }
},'.tile');​

解决方法

就你的浏览器而言,将鼠标悬停在瓷砖上的东西与悬停在瓷砖上的东西相同,而不是悬停在任何被覆盖的东西上.为了在你的特定情况下解决这个问题,我建议把你的悬停函数放在#map_canvas上,然后在那个函数中找出哪个tile正在盘旋.对于矩形网格中的切片,这是简单的算术.

当然,要使其工作,您需要包含一个mousemove事件(以检测鼠标何时从一个磁贴移动到另一个磁贴),如果用户仍然悬停在同一磁贴上,您可能应该包含退出函数代码.

编辑:虽然这个答案已被接受,但这是一个基于我的评论解决方案:

$(".tile").append($("<div/>",{
    css: {
        position: "absolute",top: 0,left: 0,right: 0,bottom: 0,"z-index": 50
    }
}));

这似乎解决了所有带有物品的瓷砖的问题,虽然它搞砸了你的:空声明.我之所以提到它主要是因为它更接近回答问题.

猜你在找的jQuery相关文章