有没有办法使 HTML 页面上的文本不可选择?

IT技术 javascript html css cross-browser textselection
2021-02-05 12:07:19

我正在构建一个带有一些文本元素的 HTML UI,例如选项卡名称,这些元素在选择时看起来很糟糕。不幸的是,用户很容易双击选项卡名称,在许多浏览器中默认选择它。

我也许可以用 JavaScript 技巧来解决这个问题(我也想看看这些答案)——但我真的希望 CSS/HTML 中有一些直接适用于所有浏览器的东西。

6个回答

在大多数浏览器中,这可以使用 CSS 来实现:

*.unselectable {
   -moz-user-select: -moz-none;
   -khtml-user-select: none;
   -webkit-user-select: none;

   /*
     Introduced in IE 10.
     See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
   */
   -ms-user-select: none;
   user-select: none;
}

对于 IE < 10 和 Opera,您将需要使用unselectable您希望不可选的元素属性。您可以使用 HTML 中的属性进行设置:

<div id="foo" unselectable="on" class="unselectable">...</div>

遗憾的是,此属性不是继承的,这意味着您必须在<div>. 如果这是一个问题,您可以改为使用 JavaScript 为元素的后代递归执行此操作:

function makeUnselectable(node) {
    if (node.nodeType == 1) {
        node.setAttribute("unselectable", "on");
    }
    var child = node.firstChild;
    while (child) {
        makeUnselectable(child);
        child = child.nextSibling;
    }
}

makeUnselectable(document.getElementById("foo"));
@JoeCoder:是的,我相信属性选择器在 IE 7 中确实有效,但在 IE 6 中无效。
2021-03-12 12:07:19
只是好奇,在样式表中使用 *.unselectable 比使用 .unselectable 有优势吗?
2021-03-15 12:07:19
根据dev.lcn.com/CSS3-selectors/browser-support.php,这个选择器应该在 IE8 及更高版本中支持,可能还有 IE7。
2021-03-16 12:07:19
你可以使用这个选择器 [unselectable=on]{...} 然后你避免放置额外的类
2021-03-29 12:07:19
@venimus 我更喜欢类而不是像 CSS 中的 [unselectable=on] 这样的 xpath 选择器。在 jquery 中,如果您首先缩小到直接容器,它们会很好,但在 CSS 中,选择器从右到左解析,因此它仍然是使用 performance-meh xpath 引擎对每个元素和每个元素的不可选择属性进行全面检查。同样,我相信使用 querySelector API,我猜它通常直接连接到 CSS/xpath 选择器引擎。随着浏览器发现性能调整,这可能会随着时间的推移而改变,但在支持 IE<=8,也许 <=9 时,我肯定会记住这一点。
2021-03-29 12:07:19
<script type="text/javascript">

/***********************************************
* Disable Text Selection script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code

***********************************************/


function disableSelection(target){

    if (typeof target.onselectstart!="undefined") //IE route
        target.onselectstart=function(){return false}

    else if (typeof target.style.MozUserSelect!="undefined") //Firefox route
        target.style.MozUserSelect="none"

    else //All other route (ie: Opera)
        target.onmousedown=function(){return false}

    target.style.cursor = "default"
}



//Sample usages
//disableSelection(document.body) //Disable text selection on entire body
//disableSelection(document.getElementById("mydiv")) //Disable text selection on element with id="mydiv"


</script>

编辑

代码显然来自http://www.dynamicdrive.com

事实上,您在所有情况下都在更改它(缩进具有误导性)
2021-03-17 12:07:19
Opera 是否有任何更新或仍然不支持使元素不可选择?
2021-03-18 12:07:19
为什么在最后一种情况下将光标样式更改为“默认”?否则+1
2021-03-31 12:07:19

所有正确的 CSS 变体是:

-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
根据这个答案,这两个 webkit 设置的顺序可能很关键,-webkit-user-select:应该在-webkit-touch-callout:. 我没有验证这一点。
2021-03-29 12:07:19

试试这个:

<div onselectstart="return false">some stuff</div>

简单但有效...适用于所有主要浏览器的当前版本。

这是 IE 唯一的属性。这使它变得多余。
2021-03-14 12:07:19
这是在 ag-Grid 中进行 shift-click 选择时,我可以获得在 IE11 中发生的文本选择所需效果的唯一方法。
2021-03-16 12:07:19
非常适合我们的应用程序(我们只针对 IE 用户)。
2021-03-25 12:07:19
这在 Firefox 中对我不起作用。
2021-04-07 12:07:19

对于 Firefox,您可以将 CSS 声明“-moz-user-select”应用于“none”。查看他们的文档,用户选择

正如他们所说,这是未来“用户选择”的“预览”,因此基于OperaWebKit的浏览器可能会支持它。我还记得为 Internet Explorer 找到了一些东西,但我不记得是什么:)。

无论如何,除非在特定情况下文本选择使某些动态功能失败,否则您不应该真正覆盖用户对网页的期望,即能够选择他们想要的任何文本。

同样在 Safari/Chrome/等中。-khtml-user-select:none;
2021-03-15 12:07:19
这是否可能出现在 CSS 标准中?
2021-03-25 12:07:19