【问题标题】:Prevent select on input text field防止在输入文本字段上选择
【发布时间】:2015-05-27 03:16:02
【问题描述】:

出于以下考虑,我试图阻止在输入字段上进行选择

  • 防止使用鼠标选择
  • 防止使用键盘进行选择(包括 Ctrl+A、shift+箭头)
  • 允许使用键盘和鼠标聚焦到现场

到目前为止,我已经尝试过这些事情:

CSS

我尝试过使用下面的类

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

结果:仍然可以选择

我也在下面尝试过,但没有成功:

$("#my_field").attr('unselectable','on')
     .css({'-moz-user-select':'-moz-none',
           '-moz-user-select':'none',
           '-o-user-select':'none',
           '-khtml-user-select':'none', 
           '-webkit-user-select':'none',
           '-ms-user-select':'none',
           'user-select':'none'
     }).bind('selectstart', function(){ return false; });

Javascript

我尝试了以下

$( "#my_field" ).select(function(e) {
        console.log("Select called");
        e.preventDefault();
});

结果:控制台打印了消息,但是选择仍然有效

感谢您的帮助

【问题讨论】:

  • 并非如此,这些解决方案不适用于输入
  • @Joel 该解决方案使它看起来没有被选中,但是选择仍然发生,我可以将该选择拖到另一个字段

标签: javascript css


【解决方案1】:

可以通过在select事件上将元素的selectionStart设置为selectionEnd来完成:

var inp = document.getElementById('my_input');

inp.addEventListener('select', function() {
  this.selectionStart = this.selectionEnd;
}, false);
<input id="my_input" type="text" value="Try to select me!" />

【讨论】:

  • 防止使用键盘选择——以上不符合这个标准。使用选项卡聚焦该字段,默认情况下会选择整个内容,因此可以复制该值。我不知道为什么有人愿意这样做。
  • @RobG 没错,但是我们可以在 focus 事件上做同样的事情 — jsbin.com/remihecomi/1/edit?js,output
  • @HashemQolami——仍然可以通过从元素外部开始选择来选择内容。在任何相当现代的浏览器中,我都可以检查元素并从检查器中复制内容。真的,这种东西毫无意义。
  • @HashemQolami 从输入内部开始选择并在外部停止时,也可以选择。
  • @OlivierKrull 我无法复制它。你能提供一个在线例子吗?
【解决方案2】:

您可以阻止mousedown 事件以阻止选择input 内的文本。

<input type="text" id="unselectable" value="You can not select this text!"/>
<script>
document.getElementById("unselectable").addEventListener("mousedown", function(event){
  event.preventDefault();
});
</script>

【讨论】:

  • 这可以防止输入被鼠标点击聚焦。
【解决方案3】:

您可以使用绝对位置的任何层覆盖&lt;input&gt;,例如使用div.wrapper::after 或其他包装标签。然后使用user-select: none 作为包装标签(&lt;div&gt;&lt;label&gt; 等),不要在&lt;input&gt; 本身上使用user-select: none

但是,如果您的包装标签是 &lt;label&gt;,我建议另外为 &lt;input&gt; 添加属性 readonly 并将 &lt;label&gt; 转换为块(或 inline-block / flex / inline-flex)。

input { outline: none; margin: 10px 0; width: 200px; }

.wrapper {
  position: relative;
  user-select: none;
}

.wrapper::after {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

label.wrapper { display: block; }
<div class="wrapper">
  <input type="text" value="Any text in the div wrapper"/>
</div>

<label class="wrapper">
  <input type="text" value="Any text in the label wrapper" readonly />
</label>

【讨论】:

  • :D 感谢您的回答,我在 4 年多前问过这个问题。希望能帮助别人
  • 即便如此:遗憾的是它允许使用键盘进行选择(选项卡突出显示输入框,焦点自动选择)
【解决方案4】:

纯 CSS 解决方案:

这将不允许输入文本以视觉方式显示为选中状态。
在某些情况下,如果开发人员不关心输入的文本是否能够被复制粘贴,但只有选择的 视觉 方面是不需要的,那么这种技术就足够了。

input{ color:transparent }
input::selection{ color:transparent }
&lt;input value='invisible selection'&gt;

【讨论】:

  • input::selection {background-color: transparent} 给出了完美的结果
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多