【问题标题】:Is there a way to detect if I'm hovering over text?有没有办法检测我是否将鼠标悬停在文本上?
【发布时间】:2026-01-16 03:15:01
【问题描述】:

我真正想要的是检测光标何时变为“文本”类型,即当我将鼠标悬停在一段文本上时。我试过查看我悬停的元素类型,但这不太准确,因为我不知道它们实际包含什么。

我了解只有在我之前指定过 CSS 光标属性的情况下才能检测到它。

这可能吗?你会怎么做呢?

编辑: 我不想检查我当前是否在特定元素上,我想知道我是否将鼠标悬停在该元素内的任何文本上。一个 div 可以是浏览器的 100% 宽度,但在最左边有一段较短的文本。我不想检测何时将鼠标悬停在元素的任何部分上。

【问题讨论】:

  • 我敢打赌,如果你解释一下你的用例,你会得到一个更好的答案。您可能以错误的方式看待问题。
  • @Madmartigan 我只是希望能够检测到它,这样我就可以向用户显示它,例如在悬停任何文本时更改 div 的背景颜色。跨度>
  • 很抱歉,我不相信这是可能的。理论上,您可以找到页面上的每个文本节点并将其包装在一个跨度中,然后在这些跨度悬停时执行某些操作。然而,这非常低效,并且会改变页面的结构。

标签: javascript jquery dom text hover


【解决方案1】:

无需尝试检测光标是否改变。

您可以使用这种结构简单地检测鼠标是否悬停在您的文本上:

document.getElementById('myTextId').onmouseover = function() {
    // do something like for example change the class of a div to change its color :
    document.getElementById('myDivId').className = 'otherColor';
};

如果您没有 id 而是一个类或标签,您可以将 getElementById 替换为 getElementsByClassName 或 getElementByTagName(这将返回您将迭代的数组)。

如果你想在离开元素时恢复颜色,我建议你用同样的方式绑定事件onmouseout。

例如,如果你想在任何段落上做某事,你可以这样做:

var paras = document.getElementByClassName('p');
for (var i=0; i<paras.length; i++) {
    paras[i].onmouseover = function() {
        // do something like for example change the class of a div to change its color :
        document.getElementById('myDivId').className = 'otherColor';
    };
}

我打算做很多这样的事情,我建议你看看 jquery 及其教程。

【讨论】:

  • 我很确定这不是问题所要求的。没有id 或选择器可供使用,他想检测光标何时在任何“文本”上。遗憾的是,我认为这是不可能的。
  • @JamesMontagne 你是对的,如果我不够清楚,我很抱歉。
  • 任何文字,没有。但这并不意味着什么。所以我想需要某些文本。这就是我提到按类别或标签进行搜索的原因。通常你会有类似“

    ”的东西,你可以使用getElementsByClassName。

  • 不,它适用于所有 TEXT_NODES,简单地说,在页面的所有元素中。例如,当鼠标光标变为输入文本时。
  • 所有文本节点:这将没有任何用处(看看你的 html,你到处都有文本节点)。定位到段落或某些类之类的内容。
【解决方案2】:

一种可能的方法是找到 DOM 中的所有文本节点,并将它们包装在具有特定类的 span 中。然后你可以选择那个类并用它做任何你想做的事情:

// Wrap all text nodes in span tags with the class textNode
(function findTextNodes(current, callback) {
    for(var i = current.childNodes.length; i--;){
        var child = current.childNodes[i];
        if(3 === child.nodeType)
            callback(child);
        findTextNodes(child, callback);
    }
})(document.body, function(textNode){ // This callback musn't change the number of child nodes that the parent has. This one is safe:
    $(textNode).replaceWith('<span class="textNode">' + textNode.nodeValue + '</span>');
});

// Do something on hover on those span tags
$('.textNode').hover(function(){
    // Do whatever you want here
    $(this).css('color', '#F00'); 
},function(){
    // And here
    $(this).css('color', '#000');
});

JSFiddle Demo

很明显,这会在你的 DOM 中填充大量的 span 标签,并且你只想在页面加载时执行一次,因为如果再次运行它,span 的数量会增加一倍。如果您已经将自定义 css 应用于 span,这也可能会做一些奇怪的事情。

【讨论】:

  • 你最好有一个坚如磐石的 CSS 重置来消除任何适用于这些 span 的样式(nuke = 至少带有 !important 的内联样式)
  • 基本上就是我在 cmets 中提到的。这基本上可以正常工作,但可能是一个非常糟糕的主意。我真的会考虑这个功能的重要性。
  • @JamesMontagne 是的......我不赞同这个:P 在非缩小的 HTML 上,这也会创建大量的空/空白填充跨度标签。据我所知,这是完成它的唯一方法,因为您无法将事件添加到文本节点。
【解决方案3】:

如果你正在使用 jQuery(你应该这样做,因为 jQuery 很棒),这样做:

$("#myDiv").mouseover(function() {
    $("#myDiv").css("background-color", "#FF0000");
}); 

【讨论】:

  • 如果你是 javascript 新手,JQuery 没问题,但如果你已经记住了所有跨浏览器兼容性代码,那么加载速度就会不必要地糟糕。
最近更新 更多