javascript:禁用文本选择


84

我正在使用JavaScript禁用我的网站上的文本选择。

代码是:

<script type="text/JavaScript">

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
</script>

类似的脚本可以在这里找到

在我的本地主机上:所有浏览器(Firefox,Chrome,IE和Safari)都可以正常工作。

在我的Live网站上:除Firefox外,一切正常。

我的问题是:

  1. 是否有人对Firefox为什么对现场站点和本地主机的行为有所不同的建议?注意:已启用Javascript。

  2. 也许我的脚本太简单了,所以我用完全相同的结果尝试了以下内容


4
让我建议您避免在这种情况下使用Javascript。仅在使用CSS,你可以找到关于文本选择在CSS的详细信息,在这个问题
RienNeVaPlu͢s

第二个脚本可能太旧了。删除!document.all,因为我相信它会破坏对FX的支持
mplungjan

9
我讨厌这样做的网站。如果我想复制一些文本,可以打开开发工具并进行复制。这只是不必要的麻烦。
uylmz

4
就像瑞克所说的那样。除非您有充分的理由,否则请不要这样做。许多人可能只想选择要搜索的内容或使用词典来查找单词。禁止这样做只是一种烦恼,从长远来看,可能会使人们离开您的站点。
捷克学

1
首先,我也讨厌Pages禁止仅出于其“乐趣”而选择(文本和其他),但是我认为这是一个好问题,因为出于某些正当理由,人们希望禁用它(例如,实现鼠标手势)或在任何游戏中拖放文本块)。当然,使用JS来达到此目的是不好的,但是CSS解决方案也有它的问题(在某些浏览器中,user-select仅靠它是行不通的,它需要使用“ -vendor-”前缀,例如-moz-user-selectand -webkit-user-select,这样才能使其正常工作,则必须将所有可能的变体设置为none)。
Cyber​​knight

Answers:


209

只需使用以下CSS方法:

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

您可以在此处找到相同的答案:如何使用CSS禁用文本选择突出显示?


6
还添加在哪里找到答案的链接:stackoverflow.com/questions/826782/...
德黑伊登罗恩面包车

非常感谢你。体内的CSS适用于除IE之外的所有情况。是否有简洁的CSS解决方案也可以解决IE的此问题?我现在使用Js和CSS的组合来覆盖所有浏览器!谢谢你
琶音

1.为什么没有将此标签标记为解决方案?...它以最准确,最简单的方式解决了相关问题。2.应该提到的是,此CSS定义可以在任何HTML元素上实现,而不仅限于BODY。
TheCuBeMan '16

1
@TheCuBeMan“用户选择”是非标准功能,因此IMO并不是最佳解决方案。
ndugger

1
这可能是最好的方法-浏览器以不同的方式处理它,因为它很复杂并且使用的方式各不相同。即,他们希望提供预期的UX(无选择),同时仍然允许用户选择他们是否确实愿意。W3C草案有更多注释,并且caniuse显示了出色的支持。可以使用不同的浏览器来处理它-用户将获得其首选浏览器提供的体验。
肖恩·厄克特

24

我正在编写滑块ui控件以提供拖动功能,这是我防止用户拖动时选择内容的方式:

function disableSelect(event) {
    event.preventDefault();
}

function startDrag(event) {
    window.addEventListener('mouseup', onDragEnd);
    window.addEventListener('selectstart', disableSelect);
    // ... my other code
}

function onDragEnd() {
    window.removeEventListener('mouseup', onDragEnd);
    window.removeEventListener('selectstart', disableSelect);
    // ... my other code
}

绑定startDrag到您的dom:

<button onmousedown="startDrag">...</button>

如果要静态禁用所有元素上的文本选择,请在加载元素时执行代码:

window.addEventListener('selectstart', function(e){ e.preventDefault(); });

      

2
这是最好的解决方案,因为CSS解决方案不适用于具有contenteditable属性的div (例如,如果要在用户鼠标调整控件大小时禁用文本选择)。
mbomb007 '18

12

对于JavaScript,请使用以下功能:

function disableselect(e) {return false}
document.onselectstart = new Function (return false)
document.onmousedown = disableselect

要启用选择,请使用以下命令:

function reEnable() {return true}

并在任何需要的地方使用此功能:

document.onclick = reEnable

除非new Function (return false)是不是有效的JavaScript代码。只使用document.onselectstart = disableselect
amik

@amik怎么样:document.oncontextmenu = new Function("return false;");或使用CSS:<body onselectstart="return false">
Hassan Azimi

是的new Function("return false;")可以工作,但是与仅使用disableselect现有的相比,它不必要地复杂。onselectstart="return false"也可以,但是与CSS无关。我也注意到您的其余答案也是错误的-该reEnable功能根本无法使用。
amik

@amik哈哈很好,JavaScript中没有什么必要,但我们仍然这样做。当然,代码可以重构,但是看看问题,响应,回答问题而不是试图做作业。
哈桑·阿齐米

好吧,但是SO是一个教育的地方,所以我考虑提供一个在技术上既错误又根本不解释的答案不是一个好主意。
amik

4

如果您有这样的html页面:

    <身体
    onbeforecopy =“返回假”
    ondragstart =“返回假” 
    onselectstart =“返回假” 
    oncontextmenu =“返回假” 
    onselect =“ document.selection.empty()” 
    oncopy =“ document.selection.empty()”>

有一种禁用所有事件的简单方法:

document.write(document.body.innerHTML)

您获得了html内容并丢失了其他内容。


4

一个可能还会使用,在所有浏览器中都可以正常运行,需要javascript:

onselectstart = (e) => {e.preventDefault()}

例:

onselectstart = (e) => {
  e.preventDefault()
  console.log("nope!")
  }
Select me!


另一种js替代方法是,通过测试CSS的支持,然后禁用userSelect,或MozUserSelect针对Firefox。

let FF
if (CSS.supports("( -moz-user-select: none )")){FF = 1} else {FF = 0}
(FF===1) ? document.body.style.MozUserSelect="none" : document.body.style.userSelect="none"
Select me!


纯CSS,逻辑相同。警告您必须将这些规则扩展到每个浏览器,这可能很冗长。

@supports (user-select:none) {
  div {
    user-select:none
  }
}

@supports (-moz-user-select:none) {
  div {
    -moz-user-select:none
  }
}
<div>Select me!</div>


0

简单复制此文本并放在前面 </body>

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.