如何防止高亮文本被“取消选择”?

18

在这个网页上选中一些文本,然后基本上在页面的任何地方单击。您的选择将消失。

是否有一种方式可以通过CSS或JavaScript防止用户在单击特定元素时出现此行为?

例如:

var element = document.getElementById("foo");
foo.onclick = function(e){
   //some magic here that prevents deselection from occuring
}
或者
foo.style.preventDeselect = "true";

编辑:也许我可以存储选择,然后在“鼠标单击”后恢复选择?有没有一种方法可以存储选择,然后重新选择它?

谢谢!

6个回答

9

"return false"和"e.preventDefault()"在Firefox和Safari中有效,但在IE中无效。据我所知,唯一的解决方案是抛出一个错误。

这在所有浏览器中都有效(但在IE中会导致错误,因为preventDefault不是一个方法):

//clicking the 'test' element will not deselect text.
var test = document.getElementById("test");
test.onmousedown = function(e){
  e = e || window.event;
  e.preventDefault();
}

如果可能的话,我仍然希望在IE中无误地完成此操作。

感谢Paolo Bergantino提供的“onmousedown”提示。


不幸的是,窗口外的 mousemove 事件将不再起作用。 - Steve

2

这在Firefox上对我有效,但我还没有尝试过IE。尝试在选择文本时单击foo.style.preventDeselect = "true";行。使用mousedown事件。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<script>
$(document).ready(function() {
    $('#test').mousedown(function() {
        return false;
    });
});
</script>
<body>

Highlight some text on this webpage, then click basically anywhere on the document. Your selection will disappear.<br><Br>

Is there a way to prevent this behavior when the user clicks on a specific element, either by CSS or Javascript?<br><Br>

E.g.:<br><Br>

var element = document.getElementById("foo");<br>
foo.onclick = function(e){<br>
   //some magic here that prevents deselection from occuring<br>
}<br><Br>

or<br><Br>

<span id='test'>foo.style.preventDeselect = "true";</span><br><Br>

Thanks!<br><Br>

</body>
</html>

这个可以运行,但不幸的是禁用了我需要的“onclick”事件。也许可以使用“preventDefault()”来解决问题... - sam
我错了.. onclick 起作用了。不幸的是,在 IE 中的 "return false" 仍然会取消选择文本。但奇怪的是,如果你在 "onmousedown" 中抛出一个错误,文本就不会被取消选择。 - sam
我已经尝试了不同的方法30分钟,但是在IE上无法使任何东西工作(除了抛出错误或使用onmousedown =p时弹出警报),所以我只能给你这个建议。祝你好运。 - Paolo Bergantino
谢谢你的努力 :) 我编辑了我的帖子...也许可以记住选择,然后在鼠标点击后恢复它? - sam
这正是我在想的,但那会让我陷入一个我不想涉足的领域。 - Paolo Bergantino
我明白你的意思...范围和类似的东西并不好处理。我想我可能会选择在IE上出现错误。人们甚至会注意到它吗? - sam

1

这种行为虽然在现代浏览器中普遍存在,但是它与CSS或Javascript几乎完全无关,并且是特定于浏览器/实现的。特别要注意的是,Firefox为整个页面和文本框内容维护单独的选择状态,而IE则不会这样做。更糟糕的是,考虑到具有单独鼠标和键盘选择界面的文本模式浏览器。


1
感谢您的反馈。我意识到不同的浏览器处理文本选择等任务的方式也各不相同,就像处理许多其他任务一样。虽然这会带来挑战,但并不是不可能解决的问题。 - sam

1

关于什么?

if(e.preventDefault) 
    e.preventDefault();
else
    e.returnValue = false;

这仍然会在IE中取消选择的文本。 - sam

0

我发现最好的方法是,在IE浏览器上需要在'onselectstart'上设置监听器。对于Mozilla和其他浏览器,可以在'mousedown'上设置监听器。这只有在您的网站的任何其他部分中不使用'mousedown'时才有效!

片段: YUI方式: FF浏览器:

  • YAHOO.util.Event.addListener(window, 'mousedown', function(evt) { YAHOO.util.Event.preventDefault(evt); });

    IE浏览器: 在IE中,您不能在窗口上设置此侦听器,因为在IE中它不起作用。 最好的方法是在body元素上设置一个类元素,然后引用它,并将侦听器应用于该元素对象。

  • //通过类获取元素并 分配给var bar YAHOO.util.Event.addListener(bar, 'selectstart', function(evt) { YAHOO.util.Event.preventDefault(evt); });

如果您想要简单的方法,只需执行以下操作

  • window.onMouseDown = function() {return false;}

或者对于IE

  • body.onSelectStart = function() {return false;}
希望这能有所帮助。

0

以防万一有人查看这个,我遇到了类似的问题。我需要在选定的文本上运行一些 JavaScript,这是通过单击工具栏按钮(带有背景图像的 span)触发的。我通过将 span 更改为 href 为 "javascript:void(0)" 的锚点来解决了我的问题。这样可以防止我的选定文本被取消选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接