【问题标题】:How can I make a div unselectable?如何使 div 不可选择?
【发布时间】:2012-04-22 22:46:13
【问题描述】:

我想让特定 div 的不可选择的双击等应该被阻止。

Here's what I've tried:

<div id="test" class="unselectable">asd</div>

$(document).ready(function() {
    $.ctrl = function(key, callback, args) {
        var isCtrl = false;
        $(document).keydown(function(e) {
            if (!args) args = []; // IE barks when args is null
            if (e.ctrlKey) isCtrl = true;
            if (e.keyCode == key.charCodeAt(65) && isCtrl) {
                callback.apply(this, args);
                return false;
            }
        }).keyup(function(e) {
            if (e.ctrlKey) isCtrl = false;
        });
    };

    //Other Method
    $(function() {
        $(document).keydown(function(objEvent) {
            if (objEvent.ctrlKey) {
                if (objEvent.keyCode == 65) {
                    objEvent.disableTextSelect();
                    return false;
                }
            }
        });
    });  
});​

但令我懊恼的是,我发现这行不通。我如何修改我的代码以实现我的目标?

【问题讨论】:

  • 再次,请在问题本身中包含您的代码,以便它对未来的读者仍然有用。 jsFiddle 链接不会永远持续下去,所以不仅仅是你得到你的答案......它也是关于搜索问题寻求帮助的其他人。
  • 就您的问题而言,我不会尝试禁用ctrl-a 或任何其他操作系统命令。
  • 为什么要在此处包含代码?它太长而且不起作用......我真的不想禁用 ctrl + a,我只想在按下它时不选择特定的 div。
  • 您无法阻止用户从网页复制文本或图像。
  • 我不想阻止复制文本或图像。整个站点只是一个带有 div 磁贴的全屏地图。并且当按下 Ctrl + A 时,它不能被取消选择,用户必须重新加载地图,回到他的位置,这会消耗额外的服务器性能。

标签: javascript jquery


【解决方案1】:

您不需要 Javascript (reference answer)。这样做:

div {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

【讨论】:

  • 你不能在 IE this better reference answer。
  • 一般不工作,在某些情况下只能在某些浏览器上工作。
【解决方案2】:

据我所知,没有办法阻止用户选择 div 上的文本。由于这是一个浏览器和可能与操作系统相关的功能,它超出了您通常可以使用 Javascript 操作的范围。

如果你想让你的用户非常恼火,你可以在整个文档上创建一个事件处理程序,它会检查用户是否曾经同时按下 control-A,如果是,试着阻止 div 被选中阻止默认操作或专注于页面的其他部分。但是,这只会让他们生气,因为您试图阻止他们以他们想要的方式使用他们的计算机,并且可能会让他们在您的网站上大肆宣传。

您能否提供更多背景信息,说明您为什么不希望用户选择某些内容? 无论您做什么,总会有解决方法,考虑到他们可以禁用 javascript/CSS 并重新加载页面。如果您想让文本更难以复制粘贴,您可以制作一张图片包含所需的文本并将其放置在 div 中,但您仍然只是为了让用户更加对您的网站感到厌烦。


虽然我不会声称我对您的整个项目非常了解,可以准确地告诉您您应该做什么,但我会说可能有更好的方法来实现您所追求的任何目标。如果您发布更多详细信息,我们可能会帮助您找到它。 :D

【讨论】:

  • 对不起,你还不够了解;请参阅我关于使用 CSS 防止文本选择的答案。 =P
  • 实际上,删除我的反对票,因为这仍然是很好的信息。请注意,您的第一个陈述是不正确的......
  • @ElliotBonneville 哇,我不知道有这样的 CSS 功能!但是,我仍然想强调,这确实不是真正应该做的事情,用户仍然可以通过禁用样式表来规避 CSS 方法。底线:如果用户想选择它,他们会想办法,我想不出很多正当的理由来阻止用户选择文本。 :D
  • 确实如此,几乎总是有另一种选择。虽然,可以阻止用户选择您的文本(即使他们试图进入您的源代码),但这对他们来说会很烦人,对您来说也是一种痛苦。
  • 为什么我要禁用 Ctrl + A?因为整个站点只是一个带有 div 磁贴的全屏地图。并且当按下 Ctrl + A 时,它不能被取消选择,用户必须重新加载地图,回到他的位置,这会消耗额外的服务器性能。
【解决方案3】:

我已经用相当明确的答案回答了至少三个关于 SO 的类似问题。 Here's the most popular.

我还使用来自该答案的信息更新了您的 jsFiddle,以便在 IE 中工作:http://jsfiddle.net/VYKfL/3/

【讨论】:

  • 在 IE 中不会阻止我的 ctrl+a
  • 嗯。所以它没有。这会破坏事情。
  • @Esailija:Firefox 也不会阻止通过全选选择不可选择的元素。
  • 唯一实用的方法可能是轮询文档选择并清除它。 jsfiddle.net/VYKfL/4 在 IE7-9 中为我工作
  • @Esailija:这有点邪恶。完全禁用选择是一回事,但允许用户选择并让它瞬间消失更糟糕。 IE 和 WebKit 在 Document 节点上有一个 selectionchange 事件,顾名思义,该事件会检测选择的变化。 Firefox 没有什么等价物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多