Javascript 禁用/启用IE中的文本选择

Javascript 禁用/启用IE中的文本选择,javascript,css,internet-explorer,Javascript,Css,Internet Explorer,我们有一个项目,我们正在禁用所有正文内容的文本选择。因此,解决这个问题的方法是针对普通浏览器(如user select:none)的CSS样式,以及针对IE(如document.body.onselectstart=函数{return false;})的变通方法 所以问题是:如何在IE中的一些div元素中启用文本选择?如何做到简单快速 <div onselectstart='return true;'>blablabla</div> 注意:禁用javascript将允许

我们有一个项目,我们正在禁用所有正文内容的文本选择。因此,解决这个问题的方法是针对普通浏览器(如user select:none)的CSS样式,以及针对IE(如document.body.onselectstart=函数{return false;})的变通方法

所以问题是:如何在IE中的一些div元素中启用文本选择?如何做到简单快速

<div onselectstart='return true;'>blablabla</div>
注意:禁用javascript将允许用户选择文本


我已经更新了fiddle

嗯,最简单的方法是颠倒您的逻辑,只将此规则应用于不应该能够选择文本的元素。将此规则应用于整个主体的问题是,任何子元素都已经从其父主体元素接收到此重写事件,并且重新初始化onselectstart事件的方法不像一些人在这里的答案中所假设的那样简单。在您的情况下,我将删除整个主体的此规则,然后仅将其应用于没有任何子元素的单个元素,其中重写规则不能应用

例如:

>请参阅上的工作演示

请注意,列出的一些单独属性还不受支持,我已经添加了它们,以备将来验证。规则集的编译方式可以支持尽可能多的不同浏览器。一些浏览器将遵循CSS样式,一些浏览器需要JavaScript hack IE<10,Opera浏览器遵循特殊的元素属性,见下文

编辑:添加了对Opera浏览器unselectable='on'

使用jQuery的支持

$("body").disableSelection();

不能从一开始就覆盖那些div的属性吗?@TildalWave请检查上面的脚本。“onselectstart”内联将不起作用,因为将“onselectstart”绑定到主体将优先于内联函数调用。我不需要检查它,因为我知道此更正的代码会起作用,干得好!尽管有一点保留,这只是从可能的多个元素中首先选择一个元素,而不是所有ID为“mydiv”ID的元素,但无论如何都应该是唯一的值。反转规则逻辑可能更容易,尤其是在某些服务器端脚本中动态生成相关内容的情况下。您仍然可以改进您的选择器代码,使其更通用一些,也许使用for-each循环通过元素的某些属性匹配元素?干杯@谢谢你的建议。是的,当然可以改进,只是提供了一个更简单的解决方案。我明白这不能处理所有的情况:如果你能改进你的答案,如果你有时间,那就太好了,是的。这是一种不同的方法,与我建议的方法一样有效,其他用户可能会发现它更有用。在阅读OP的问题时,我一开始的想法是相同的,但我决定采用不同的方法,因为我认为你的解决方案已经被提出,但后来发现它们不会像最初提出的那样起作用。我删除了我对你答案的第一条评论,因为它不再相关;此外,如果您决定改进您的答案,请注意,当前版本的代码仅在Chrome中正常工作,并且兼容,因为onselectstart属性不会像在其他浏览器中一样通过函数参数转发事件。在IE中,解决方案可能是省略事件参数,然后选择一个活动元素:ifwindow.event.srcElement.id=='mydiv'{。但是,这在Firefox或Opera中仍然不起作用,需要另一种方法。如果有一种方法与所有方法兼容,我真的不知道。问题是如何在IE中的某些div元素中启用文本选择,而其他元素仍然处于禁用状态。您的代码只禁用文档中包含的所有元素的选择nt body,这显然已经实现了。你误解了我。看看这把小提琴,我的意思是什么,这在IE8中不起作用:unselectable='on'即使在旧版本的IE上也很有魅力
<body>
  this is some text that is selectable
  <div style='-o-user-select: none;
              -webkit-user-select: none;
              -moz-user-select: -moz-none;
              -khtml-user-select: none;
              -ms-user-select: none;
              user-select: none;' 
       onselectstart='return false;'
       unselectable='on'>
    this is some text that's not selectable
  </div>  
</body>
$("body").disableSelection();