如何使用JavaScript阻止文本字段中的任何类型的输入?

时间:2019-09-13 13:17:29

标签: javascript event-handling dom-events jquery-events

是否可以使用JavaScript阻止在文本字段中进行任何类型的输入?特别包括:

  • 在键盘上键入文本(可以通过var videos = [ {id:1 , url:"https://www.youtube.com/embed/dQw4w9WgXcQ?autoplay=1"}, {id:2 , url:"https://www.youtube.com/embed/lJ6osaYFSIA?autoplay=1"} ]; window.onload = function () { var playerDiv = document.getElementById("random_player"); var player = document.createElement("IFRAME"); var previousId = localStorage.getItem('previousId'); if(previousId) { var previousIndex = videos.findIndex(v => v.id === parseInt(previousId)); videos.splice(previousIndex, 1); } var current = Math.floor(Math.random() * videos.length); localStorage.setItem('previousId', videos[current].id); var randomVideoUrl = videos[current].url; player.setAttribute('width', '640'); player.setAttribute('height', '390'); player.setAttribute('src', randomVideoUrl); playerDiv.appendChild(player); };事件捕获)
  • 使用上下文菜单粘贴文本(可以通过keydown事件捕获)
  • 使用上下文菜单剪切文本(可以通过paste事件捕获)
  • 使用上下文菜单删除文本
  • 使用浏览器内置的拼写检查器通过上下文菜单替换文本
  • 例如,在Chrome中使用上下文菜单插入表情符号

cut属性在语义上是可行的方式,但是如果将字段设置为readonly(或者使用额外的JS逻辑,则不能使用内置表单验证)。

捕获required事件并立即触发focus会阻止选择和复制文本。

将输入的值存储在blur上并在每个focus事件之后进行设置将可以完成一些工作,但是内容会闪烁片刻。

有什么想法吗?

编辑:有些人问为什么我需要这样做,而且这没有任何意义。首先,我知道可以通过浏览器开发人员工具设置该值,并且我也知道需要适当的后端验证。 问题背后的想法是: 我有一个文件输入字段。为了正确设置样式,隐藏了实际的change并使用了Bootstrap输入组,并在其中输入了文本字段和浏览按钮(该按钮是隐藏文件字段的标签,因此单击它实际上会打开选择文件对话框。 ,可在所有经过测试的浏览器中使用)。用户选择文件后,文本字段将立即更新以显示文件名。显示文件名的文本字段的HTML5属性设置为<input type="file">,因此任何提交表单的浏览器都会检查文本字段是否为空,如果显示为空,则显示错误。如果我将文本字段设置为requiredreadonly,则浏览器在提交时不会验证该字段。我希望浏览器执行验证而不是自定义JS代码,以便按照字段在页面上显示的顺序执行字段的验证,以便所有提交前的错误都具有相同的外观。

编辑2:还有一件事,由于实际文件输入字段是隐藏的,因此将其设置为disabled而不是显示文件名的文本字段会导致以下错误通过Chrome浏览器:“名称='myfancyname'的无效表单控件无法聚焦。”

3 个答案:

答案 0 :(得分:0)

您可以在输入元素的event.preventDefault上尝试keydown(如果需要,也可以尝试copypastecut)。检查此链接以获取文档https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault

我这里有一个示例实现 https://jsfiddle.net/ytx192ca/

我对用例感到好奇,因为如果您需要一个用户不能更改任何内容的字段,那么为什么不使用spanpinput元素之外的任何内容< / p>

答案 1 :(得分:0)

似乎没有一个完整的方法来处理原始问题。

在编辑中描述的特定情况下,我可以通过不使用display: none进行文件输入但通过opacity: 0使其不可见来解决该问题。通过此更改,可以使文件输入元素本身具有我想要进行表单验证的required属性集。我想要伪造只读的文本字段现在实际上可以是只读的,因为我不再需要它来进行表单验证。

答案 2 :(得分:-2)

在您的js中执行以下操作:

 $('#test').attr('readonly', true);