【问题标题】:JavaScript, How to show 'current' data in a tooltip without polling?JavaScript,如何在不轮询的情况下在工具提示中显示“当前”数据?
【发布时间】:2016-05-03 07:27:41
【问题描述】:

我有一个 html 元素,(为了简单起见)一个标签,它有一个标题,因此当您将鼠标悬停在标签上时会出现一个工具提示。

我希望工具提示显示一些相关“当前”数据的快照。实际上,标签指向的对象的当前价格,但类似的可能是任何可能随时间变化的数据。

在原生 JavaScript 中,如何检测工具提示的激活,以便在显示工具提示之前重新计算数据?

我知道我可以使用 setInterval() 或其他方法使标题字符串保持最新状态,但仅在显示工具提示时重新计算标题字符串会更有效。

【问题讨论】:

  • 查看javascript事件列表,找不到anything that matches。我认为您将不得不使用mouseentersetInterval()mouseleave 的组合。
  • 可以在 Question 中包含htmljscss 吗? ,创建stacksn-ps来演示?

标签: javascript tooltip title


【解决方案1】:

尝试使用元素的data-*属性来存储值,将元素的element.title设置为data-*onmouseoveronmouseleave事件

var elem = document.querySelector("div");

var interval = setInterval(function() {
  elem.dataset.tooltip = 1+ +elem.dataset.tooltip;
}, 1000);

elem.onmouseover = elem.onmouseleave = function(e) {
  console.log(e)
  this.title = this.dataset.tooltip;
}
<div data-tooltip="0" title="0">hover</div>

【讨论】:

  • 这很有趣,但比我目前需要的要远一些。 onmouseover 技巧是这里的关键,类似于 Adrian 的回答。会提高这个答案,谢谢你的回复。
【解决方案2】:

这样的事情可能会奏效,但您将受制于更新数据请求的延迟(假设更新价格数据的来源是 http 请求或套接字连接),这可能不会t 比浏览器显示工具提示要快。它肯定不会是一致的或可靠的。

<p id="text" title="initialtitle">Text</p>
<script>
    var n = 0;

    document.getElementById("text");
        text.onmouseover = function() {
            n++;
            text.title = n;
    };
</script>

根据您正在做什么的具体情况以及您有多少回旋余地,另一种解决方案可能是打开一个 WebSocket 到服务器,然后当它发生变化时使用更新的价格信息更新所有客户端。这样数据就可以尽可能快地发送到客户端,而无需持续的 http 轮询,并且不需要计时器。

当然,如果数据源是 JavaScript 本身内的计算,而无需从服务器获取信息,那么只需根据您的需要修改上述内容即可。

Here's a jsfiddle to play around with.

【讨论】:

  • 这看起来不错。工具提示的数据将在本地缓存,因此没有延迟问题。我想我必须为出现的工具提示设置陷阱,但使用 onmouseover 是很好的横向思考。
  • 更新:已成功使用 onMouseOver 事件更新工具提示。用户现在看到的是“剩余时间”(“2 小时 12 分 12 秒后到期”),而不是固定的时间戳(“在 13:59:59 到期”)。非常感谢您的帮助。
【解决方案3】:

我认为这段代码对你有帮助

<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<div class="test" id="test" onChange="setTitle(this)" title="testing...">Test1</div>
<script type="text/javascript">
$('#test').bind("DOMSubtreeModified",function(){
  $('#test').attr('title',$('#test').html());
});
// Run below code in your console to change your div value
//$(".test").html("test2");

</script>

首先在您的浏览器中运行上述代码。并检查工具提示将是“测试...”。 然后运行

$(".test").html("test2");

在您的浏览器控制台中更改您的 div html,然后再次检查您的工具提示。您将看到 div 的确切文本。

【讨论】:

  • 参见 “In native JavaScript” 的 OP
  • 是的,原生 JS,对不起。但是感谢您的回答,它可能对使用 JQuery 的其他人有用。
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
相关资源
最近更新 更多