有没有办法使用JavaScript禁用将文本粘贴到HTML表单的文本字段中的功能?

例如. 我有一个简单的注册表,用户需要输入他们的邮箱两次.第二个邮箱条目用于验证第一个邮箱条目中是否没有打字错误.然而,如果用户复制/粘贴他们的邮箱,那么这就违背了目的,而且我一直遇到用户有问题,因为他们输入了错误的邮箱并复制/粘贴了它.

也许我的问题不清楚,但我并不是要阻止人们在他们的浏览器上复制(或拖动 Select )文本.我只想阻止他们在文本字段中输入pasting个内容,以最大限度地减少用户错误.

也许您可以提出另一个解决方案来解决我在这里试图解决的核心问题,而不是使用这个"黑客"?我只做了不到六次用户测试,而且这种情况已经发生了两次.我的听众的计算机水平不是很高.

推荐答案

我最近不得不勉强禁用表单元素中的粘贴.为此,我编写了Internet Explorer(和其他浏览器)的onpaste事件处理程序的跨浏览器*实现.我的解决方案必须独立于任何第三方JavaScript库.

这是我想出来的.它不会完全禁用粘贴(例如,用户一次可以粘贴一个字符),但它满足了我的需求,并避免了必须处理键代码等问题.

// Register onpaste on inputs and textareas in browsers that don't
// natively support it.
(function () {
    var onload = window.onload;

    window.onload = function () {
        if (typeof onload == "function") {
            onload.apply(this, arguments);
        }

        var fields = [];
        var inputs = document.getElementsByTagName("input");
        var textareas = document.getElementsByTagName("textarea");

        for (var i = 0; i < inputs.length; i++) {
            fields.push(inputs[i]);
        }

        for (var i = 0; i < textareas.length; i++) {
            fields.push(textareas[i]);
        }

        for (var i = 0; i < fields.length; i++) {
            var field = fields[i];

            if (typeof field.onpaste != "function" && !!field.getAttribute("onpaste")) {
                field.onpaste = eval("(function () { " + field.getAttribute("onpaste") + " })");
            }

            if (typeof field.onpaste == "function") {
                var oninput = field.oninput;

                field.oninput = function () {
                    if (typeof oninput == "function") {
                        oninput.apply(this, arguments);
                    }

                    if (typeof this.previousValue == "undefined") {
                        this.previousValue = this.value;
                    }

                    var pasted = (Math.abs(this.previousValue.length - this.value.length) > 1 && this.value != "");

                    if (pasted && !this.onpaste.apply(this, arguments)) {
                        this.value = this.previousValue;
                    }

                    this.previousValue = this.value;
                };

                if (field.addEventListener) {
                    field.addEventListener("input", field.oninput, false);
                } else if (field.attachEvent) {
                    field.attachEvent("oninput", field.oninput);
                }
            }
        }
    }
})();

要使用此选项以禁用粘贴,请执行以下操作:

<input type="text" onpaste="return false;" />

* I know oninput isn't part of the W3C DOM spec, but all of the browsers I've tested this code with—Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7—support either oninput or onpaste. Out of all these browsers, only Opera doesn't support onpaste, but it does support oninput.

注意:这在使用屏幕键盘的控制台或其他系统上不起作用(假设屏幕键盘在 Select 每个键时不向浏览器发送键).如果你的页面/应用可能会被屏幕上有键盘和Opera的人使用(例如任天堂Wii,一些手机),不要使用这个脚本,除非你已经测试过确保屏幕上的键盘在每次按键 Select 后将按键发送到浏览器.

Html相关问答推荐

如何获得一个背景图像,不是模糊的内部容器,但模糊的外部'

每次在视口中运行动画

在NzMessageService中传递动态TemplateRef- Angular 15

MatSnackBar: colored颜色 不起作用

静态DIV的标签,显示从窗体输入的值

如何使用css在响应图像后面添加形状?

在 WooCommerce 存档产品类别描述上添加阅读更多/阅读更少按钮

我的 *ngFor 中的 array.reverse() 在生产中不起作用

如何使粘性导航栏能够跨其他组件工作?

为什么溢出时overflow: auto框的底部有一个小间隙?

在Firefox中使用keySplines时,SVG: <animateMotion>不起作用

拨动switch 在重新加载时未重置

CSS 网格跨度行到所有行

从垫分页器中删除输入边框

我如何使用 CSS nth-child(odd) nth-child(even) 来对齐 CSS 网格中的列?

如何删除输入中输入类型数字中的箭头?

如何在 blazor 中单击单个按钮调用 2 个等待任务

发光效果html动画

如何创建带有偏移边框线的双色边框?

在中心而不是边界处填充 svg 的背景