Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery:是否有机会检测到鼠标从哪一侧输入的div中没有";抵销;方法?_Jquery_Mouseover - Fatal编程技术网

jQuery:是否有机会检测到鼠标从哪一侧输入的div中没有";抵销;方法?

jQuery:是否有机会检测到鼠标从哪一侧输入的div中没有";抵销;方法?,jquery,mouseover,Jquery,Mouseover,有没有办法检测鼠标光标来自div的哪一侧 目前我正在使用此方法: jQuery(this).bind('mousemove',function(e){ offset_pos_x = parseInt(e.offsetX); offset_pos_y = parseInt(e.offsetY); ... 然后我寻找鼠标进入div的距离,在哪个方向 问题是,这个方法有点错误,因为我需要所有的4个边,而不仅仅是两个,所以我必须检查offsetX和offsetY 如果我在div

有没有办法检测鼠标光标来自div的哪一侧

目前我正在使用此方法:

jQuery(this).bind('mousemove',function(e){
    offset_pos_x = parseInt(e.offsetX);
    offset_pos_y = parseInt(e.offsetY);
    ...
然后我寻找鼠标进入div的距离,在哪个方向

问题是,这个方法有点错误,因为我需要所有的4个边,而不仅仅是两个,所以我必须检查offsetX和offsetY

如果我在div中移动鼠标,例如X:+15,Y:-3(以像素为单位),我知道鼠标来自左侧,因为鼠标在X轴上移动了15px,但在Y轴上只移动了-3px。问题是,当X和Y几乎相同时,我不知道鼠标是从左还是从上(例如)

另外,根据我的另一个问题(),由于浏览器/操作系统的限制,事件不会在div一侧的第一个像素处触发。因此,我的“输入位置”坐标并不准确-例如:

如果我在div内(从左)快速移动鼠标光标,“entered_at”坐标位于x:17,y:76。现在,如果我在停止鼠标后向左移动鼠标,例如,移动到x:6,y:76,则起点和偏移量之间的差值为负值,因此会触发“光标来自右侧”功能

有没有其他方法可以检测鼠标光标来自哪一侧

您好,
Patrick

我不会使用偏移量,而是使用pageX/pageY(jQuery将其标准化)。如果光标的第一个mousemove事件比任何其他边缘更靠近左边缘,则它来自左边缘。您也可以考虑使用悬停事件进行此操作,而不是使用MuMeMoo.

JSFIDLE,由牙买加国旗提供。


下面是脚本的正确/有效示例,包括对绝对定位div的修复。再次感谢你的帮助,图里亚格

jsfiddle:

脚本:

$(function() {
    $("img").hover(function(e) {
        var el_pos = $(this).offset();
        var edge = closestEdge(e.pageX - el_pos.left, e.pageY - el_pos.top, $(this).width(), $(this).height());
        log('entered at: '+edge);
    }, function(e) {
        var el_pos = $(this).offset();
        var edge = closestEdge(e.pageX - el_pos.left, e.pageY - el_pos.top, $(this).width(), $(this).height());
        log('left at: '+edge+'<br><br>');
    });
});

function closestEdge(x,y,w,h) {
        var topEdgeDist = distMetric(x,y,w/2,0);
        var bottomEdgeDist = distMetric(x,y,w/2,h);
        var leftEdgeDist = distMetric(x,y,0,h/2);
        var rightEdgeDist = distMetric(x,y,w,h/2);

        var min = Math.min(topEdgeDist,bottomEdgeDist,leftEdgeDist,rightEdgeDist);
        switch (min) {
            case leftEdgeDist:
                return "left";
            case rightEdgeDist:
                return "right";
            case topEdgeDist:
                return "top";
            case bottomEdgeDist:
                return "bottom";
        }
}

function log(msg) {
    $("#console").append("<pre>" + msg + "</pre>");
}

function distMetric(x,y,x2,y2) {
    var xDiff = x - x2;
    var yDiff = y - y2;
    return (xDiff * xDiff) + (yDiff * yDiff);
}
$(函数(){
$(“img”)。悬停(函数(e){
var el_pos=$(this).offset();
var edge=closestEdge(e.pageX-el_pos.left,e.pageY-el_pos.top,$(this).width(),$(this.height());
日志('输入位置:'+边缘);
},功能(e){
var el_pos=$(this).offset();
var edge=closestEdge(e.pageX-el_pos.left,e.pageY-el_pos.top,$(this).width(),$(this.height());
日志('left at:'+edge+'

'); }); }); 函数闭合边缘(x、y、w、h){ var topEdgeDist=距离(x,y,w/2,0); var bottomEdgeDist=距离(x,y,w/2,h); var leftEdgeDist=距离度量(x,y,0,h/2); var rightEdgeDist=距离(x,y,w,h/2); var min=Math.min(TopEdgeList、BottomEdgeList、LeftEdgeList、RightEdgeList); 开关(最小值){ 案例左侧编辑: 返回“左”; 案例右侧编辑: 返回“正确”; 案例主题专家: 返回“顶部”; 案例底部编辑: 返回“底部”; } } 函数日志(msg){ $(“#控制台”).append(“+msg+”); } 函数距离(x,y,x2,y2){ var xDiff=x-x2; var-yDiff=y-y2; 返回(xDiff*xDiff)+(yDiff*yDiff); }
我对这段代码有一些问题,当在矩形上操作时,我发现它会错误地将一条边标识为应该位于顶部的右边。我花了一些时间想出了一个答案,我想与大家分享一下:

// Pass object offsetX,offsetY,width,height
function closestEdge(distLeft,distTop,w,h){
    var distBottom = (h - distTop);
    var distRight = (w - distLeft);
    var min = Math.min(distTop, distBottom, distLeft, distRight);
    switch (min) {
        case distLeft:
            return "left";
        case distRight:
            return "right";
        case distTop:
            return "top";
        case distBottom:
            return "bottom";
    }
}

信用证:

牙买加国旗小提琴中的最近边函数并没有达到它所能达到的效果,并且对于某些元素来说是不准确的。我们可以使用
offsetX
offsetY
来模拟函数并消除
distMetric
函数:

$('.btn').on('mouseenter',function(e){
    var edge = closestEdge(e.offsetX, e.offsetY, $(this).width(), $(this).height());
});
例如:

这里有一个插件

:

希望能对您有所帮助。

我改进了使用jQuery函数的解决方案,使之具有更加优雅和健壮的自定义jQuery函数

以下是:

$(函数(){
$('img').hover(函数(事件){
日志('在:'+$(this).getMouseSide(事件)处输入)
},功能(事件){
日志('left at:'+$(this).getMouseSide(event)+'

' }) $.fn.getMouseSide=函数(事件){ 函数距离度量(x,y,x2,y2){ 返回Math.pow(x-x2,2)+Math.pow(y-y2,2) } 函数闭合边缘(x、y、w、h){ var edgeDistance={ 顶部:距离度量(x,y,w/2,0) ,底部:距离度量(x,y,w/2,h) ,左:距离度量(x,y,0,h/2) ,右:距离度量(x,y,w,h/2) } ,EdgeInstances=$.map(EdgeInstance,函数(值){ 返回[值] }) 返回Object.keys(EdgeInstance)[ 美元伊纳雷( Math.min.apply(null,EdgeInstances) ,边缘位置 ) ] } 当前变量=$(此) ,elementOffset=current.offset() 返回闭合边缘( event.pageX-elementOffset.left ,event.pageY-elementOffset.top ,current.width() ,current.height() ) } }) 功能日志(消息){ $('#控制台')。追加(''+消息+'') }
在使用偏移量之前,我尝试过pageX/pageY方法,但是(如果我错了,请纠正我),使用pageX或offsetX没有区别(我的计算不同,但我认为结果不一样),只是为了解释我的意思:我需要一个起点,一个终点来计算鼠标移动的方式。但是,如果因为我移动鼠标太快而在div中的+15px(x轴)上识别出起始点,那么如果我在捕捉到起始点后向左移动鼠标光标,则结束点可能为负值…jQuery的文档警告使用offsetX和clientX:可以使用.clientX、.offsetX和.pageX等属性,但不同浏览器对它们的支持不同。幸运的是,jQuery
// Pass object offsetX,offsetY,width,height
function closestEdge(distLeft,distTop,w,h){
    var distBottom = (h - distTop);
    var distRight = (w - distLeft);
    var min = Math.min(distTop, distBottom, distLeft, distRight);
    switch (min) {
        case distLeft:
            return "left";
        case distRight:
            return "right";
        case distTop:
            return "top";
        case distBottom:
            return "bottom";
    }
}
$('.btn').on('mouseenter',function(e){
    var edge = closestEdge(e.offsetX, e.offsetY, $(this).width(), $(this).height());
});
$(function () {
    $('img').hover(function (event) {
        log('entered at: ' + $(this).getMouseSide(event))
    }, function (event) {
        log('left at: ' + $(this).getMouseSide(event) + '<br><br>')
    })

    $.fn.getMouseSide = function (event) {
        function distanceMetric(x, y, x2, y2) {
            return Math.pow(x - x2, 2) + Math.pow(y - y2, 2)
        }

        function closestEdge(x, y, w, h) {
            var edgeDistance = {
                top:        distanceMetric(x, y, w / 2  , 0)
                , bottom:   distanceMetric(x, y, w / 2  , h)
                , left:     distanceMetric(x, y, 0      , h / 2)
                , right:    distanceMetric(x, y, w      , h / 2)
            }
            , edgeDistances = $.map(edgeDistance, function (value) {
                return [value]
            })

            return Object.keys(edgeDistance)[
                $.inArray(
                    Math.min.apply(null, edgeDistances)
                    , edgeDistances
                )
            ]
        }

        var current = $(this)
        , elementOffset = current.offset()

        return closestEdge(
            event.pageX - elementOffset.left
            , event.pageY - elementOffset.top
            , current.width()
            , current.height()
        )
    }
})

function log(message) {
    $('#console').append('<pre>' + message + '</pre>')
}