是否可以使用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
事件捕获) cut
属性在语义上是可行的方式,但是如果将字段设置为readonly
(或者使用额外的JS逻辑,则不能使用内置表单验证)。
捕获required
事件并立即触发focus
会阻止选择和复制文本。
将输入的值存储在blur
上并在每个focus
事件之后进行设置将可以完成一些工作,但是内容会闪烁片刻。
有什么想法吗?
编辑:有些人问为什么我需要这样做,而且这没有任何意义。首先,我知道可以通过浏览器开发人员工具设置该值,并且我也知道需要适当的后端验证。
问题背后的想法是:
我有一个文件输入字段。为了正确设置样式,隐藏了实际的change
并使用了Bootstrap输入组,并在其中输入了文本字段和浏览按钮(该按钮是隐藏文件字段的标签,因此单击它实际上会打开选择文件对话框。 ,可在所有经过测试的浏览器中使用)。用户选择文件后,文本字段将立即更新以显示文件名。显示文件名的文本字段的HTML5属性设置为<input type="file">
,因此任何提交表单的浏览器都会检查文本字段是否为空,如果显示为空,则显示错误。如果我将文本字段设置为required
或readonly
,则浏览器在提交时不会验证该字段。我希望浏览器执行验证而不是自定义JS代码,以便按照字段在页面上显示的顺序执行字段的验证,以便所有提交前的错误都具有相同的外观。>
编辑2:还有一件事,由于实际文件输入字段是隐藏的,因此将其设置为disabled
而不是显示文件名的文本字段会导致以下错误通过Chrome浏览器:“名称='myfancyname'的无效表单控件无法聚焦。”
答案 0 :(得分:0)
您可以在输入元素的event.preventDefault
上尝试keydown
(如果需要,也可以尝试copy
,paste
,cut
)。检查此链接以获取文档https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault。
我这里有一个示例实现 https://jsfiddle.net/ytx192ca/
我对用例感到好奇,因为如果您需要一个用户不能更改任何内容的字段,那么为什么不使用span
,p
或input
元素之外的任何内容< / p>
答案 1 :(得分:0)
似乎没有一个完整的方法来处理原始问题。
在编辑中描述的特定情况下,我可以通过不使用display: none
进行文件输入但通过opacity: 0
使其不可见来解决该问题。通过此更改,可以使文件输入元素本身具有我想要进行表单验证的required
属性集。我想要伪造只读的文本字段现在实际上可以是只读的,因为我不再需要它来进行表单验证。
答案 2 :(得分:-2)
在您的js中执行以下操作:
$('#test').attr('readonly', true);