【问题标题】:Bootstrap popovers for table row hover: Not possible to click link inside popover表行悬停的引导弹出框:无法单击弹出框内的链接
【发布时间】:2013-05-11 23:28:16
【问题描述】:

我有表格行,我在 twitter 引导弹出窗口中显示附加信息。

我使用的交互设计中的一些注意事项:

  • 将鼠标悬停在行时必须显示弹出框
  • 弹出框将包含 1 个或多个链接

现在,链接部分是最难的部分。如果将鼠标从表格行移动到弹出框(包含链接),弹出框将消失

我正在使用此代码创建弹出框:

var options = {placement: 'bottom', trigger: 'hover', html: true};
$(this).popover()

--假设相关的html包括链接被生成并放入data-content属性

请注意{placement: 'bottom' }。为了使鼠标可以移动到弹出框,我尝试了{placement: 'in bottom'}(添加了in关键字,它在选择器内生成弹出框dom元素)。

问题在于表格行,这在 HTML 方面是不合法的。也许这就是为什么placement: 'in bottom' 变得更加丑陋的原因:弹出框粘在我的视口顶部。

My example on JSFiddle 试试我的演示

它包含示例...

我的问题是我应该如何定义我的弹出框,以便可以点击链接——考虑到交互设计设置的限制?

【问题讨论】:

  • 可能会尝试单击关闭弹出窗口,请参阅:stackoverflow.com/questions/8947749/…
  • @BassJobsen,不确定我是否关注你。首先,它会改变用户与页面的交互。这会使我网站的用户感到困惑。另外,我想在 :hover 上打开每个弹出框,但是您说它们应该在单击时关闭。在这种情况下,当我将鼠标移动到 10 行时,会打开 10 个弹出框。
  • 在 :hover 上打开弹出框并关闭所有其他框。问题是您可能会在移动到弹出框时触摸其他:悬停。我也喜欢@davidkonrad 的想法,使用延迟。

标签: javascript twitter-bootstrap popover


【解决方案1】:

问题显然是弹出框做了它应该做的事情。当您将弹出框附加到 <tr> 并让弹出框响应悬停时 - 弹出框挂在 <tr> 的底部下方 - 您将永远无法访问弹出框的内容。

Trigger:hover 很容易被 trigger:manual 模仿

$('table').on('mouseenter', 'tr', function() {
    $(this).popover('show');
});
$('table').on('mouseleave', 'tr', function() {
    $(this).popover('hide');    
});

设置触发器:手动使我们能够操纵弹出行为。下面的解决方案给mouseenter/mouseleave-事件增加了一点延迟,然后检查鼠标是否在弹出框内(通过将事件附加到弹出框本身)。如果鼠标在弹出框内,则不会显示新的弹出框,并且不会隐藏活动的弹出框,即使在另一个 <tr> 中存在 mouseenter-事件。分叉的jsfiddle:http://jsfiddle.net/xZxkq/

var insidePopover=false;

function attachEvents(tr) {
    $('.popover').on('mouseenter', function() {
        insidePopover=true;
    });
    $('.popover').on('mouseleave', function() {
        insidePopover=false;
        $(tr).popover('hide');
    });
}

$('table').on('mouseenter', 'tr', function() {
    var tr=$(this);
    setTimeout(function() {
        if (!insidePopover) {
            $(tr).popover('show');
            attachEvents(tr);
        }
    }, 200);
});

$('table').on('mouseleave', 'tr', function() {
    var tr=$(this);
    setTimeout(function() {
        if (!insidePopover) $(tr).popover('hide');  
    }, 200);
});

【讨论】:

  • 不错。当我在弹出窗口已经打开时将鼠标悬停在 tr 上时,弹出窗口将不再工作
  • 一定是别的东西。试试jsfiddle。弹出框不会被破坏、操纵或其他任何东西。
  • 我尝试了 jsfiddle。也许insidePopover 在某些情况下仍然出乎意料
  • 哪个浏览器?刚刚在 Chrome、FireFox、Safari 和 IE 中测试过。它可以在 Chrome、FireFox 和 Safari 中运行,但在 IE 中该表完全混乱。不过,这不是由上面的脚本引起的 - 在@Jesper Rønn-Jenses fiddle 中也是如此。猜猜这是 另一个 IE 兼容性问题。
  • 我在 linux 上发现了 chrome 和 FF 的问题。我想我首先触发了.second 行的mouseenter(和mouseleave)。在此之后,我触发了 .first 的 mouseenters(mouseleaves)(有延迟),之后我触发了 .second 事件的 popover 的 mouseenter。
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2013-01-07
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多