Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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中不闪烁_Jquery_Jquery Ui - Fatal编程技术网

如何使弹出框在jquery中不闪烁

如何使弹出框在jquery中不闪烁,jquery,jquery-ui,Jquery,Jquery Ui,我有一个简单的场景,其中我有div标记,当鼠标悬停在上面时,它会使用jquery和jquery ui显示一个包含更多信息的覆盖。我遇到的问题是,当鼠标悬停在覆盖层上时,覆盖层会闪烁: $('#myobject').hover(function() { $popover = $('#popover'); $popover.show(); $popover.position({ my: "left top", at: "left top", of: $(this)

我有一个简单的场景,其中我有div标记,当鼠标悬停在上面时,它会使用jquery和jquery ui显示一个包含更多信息的覆盖。我遇到的问题是,当鼠标悬停在覆盖层上时,覆盖层会闪烁:

$('#myobject').hover(function() {
  $popover = $('#popover');
  $popover.show();
  $popover.position({
    my: "left top",
    at: "left top",
    of: $(this)
  });
}, function() {
  $('#popover').hide();
});
显然,我必须做一些事情,在popover上移动鼠标不会杀死悬停事件,但我不知道如何做到这一点。您可以在此处看到正在运行的场景:

尝试将子级放在父级中:


它会像那样闪烁,因为“hover”事件附加到myobject。当您四处移动鼠标时,鼠标不会悬停在myobject上,因为您在myobject上有popover。因此,您正在myobject和popover之间快速移动,导致闪烁发生

一个更好的解决方案是使用mouseover和mouseout的组合

$('#myobject').mouseenter(function() {
    $popover = $('#popover');
    $popover.show();
    $popover.position({
        my: "left top",
        at: "left top",
        of: $(this)
    });
});

$('#popover').mouseout(function() {
    $('#popover').hide();
});

我已更新了您的。请删除myobject上的mouseleave事件,并将其添加到popover元素中:

$('#myobject').bind('mouseenter',function() {
    $popover = $('#popover');
    $popover.show();
    $popover.position({
        my: "left top",
        at: "left top",
        of: $(this)
    });
});

$('#popover').bind('mouseleave', function(){
    $(this).hide();
});
更新的JSFIDLE:

一旦显示popover div,jQuery认为它不再在myobject上悬停,移动鼠标,循环继续导致闪烁

这项工作:

$('#myobject').mouseenter(function() {
    $popover = $('#popover');
    $popover.show();
    $popover.position({
        my: "left top",
        at: "left top",
        of: $(this)
    });
});

$('#popover').mouseout(function() {
    $('#popover').hide();
});
根据您修复角点问题的需要,在某些情况下可能会出现一种笨拙的解决方法,即通过添加以下内容,确保每当鼠标返回页面主体时,popover都已关闭:

$('body').hover(function() {
    $('#popover').hide();
});

很好…虽然我的答案有效,但我也喜欢这个+1你有什么理由愿意或不愿意做一件事而不是另一件事吗?谢谢。我喜欢它的简单性,但我相信如果您希望孩子完全与页面对齐,而您的父母有align:relative,那么就会出现问题。不过,当孩子需要相对于父母对齐时,这种方法非常有效。啊,很好。好吧,不管是哪种方式,为了简单起见还是+1。对不起@Keltex,我会尝试其他答案之一。几乎有效。问题是,如果你飞得很快,它会让人看不见popover。其他类似的答案也是一样。@Keltex-Huh…非常有趣。我没注意到……让我看看。如果我能很快过拐角,我就能做到。基本上,我认为在这种情况下,鼠标永远不会在popover中,所以mouseout事件不会发生。@Keltex-是的,我相信你是对的。你能不能在事后不必将$popover移到左上角的情况下定位它?不幸的是,弹出窗口遮挡了对象,这是设计的一部分。我考虑的一个选项是设置setInterval来轮询鼠标是否在弹出窗口之外……几乎可以工作。问题是,如果你飞得很快,它会让人看不见popover。其他simlar答案也是一样。@keltex-好的,为您的“角落”问题添加了一个可能的解决方法。由于jsFiddle框架的设置方式,这将在整个页面上更好地工作:jsFiddle.net/vRH3Q/13几乎可以工作。问题是,如果你飞得很快,它会让人看不见popover。其他simlar答案也是如此。
$('body').hover(function() {
    $('#popover').hide();
});