禁止将文本粘贴到HTML表单中

jus*_*inl 87 html javascript copy-paste

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

例如,我有一个简单的注册表单,用户需要输入两次电子邮件.第二个电子邮件条目是验证第一个电子邮件条目中没有拼写错误.但是,如果用户复制/粘贴他们的电子邮件然后失败了,我一直遇到用户遇到问题,因为他们输入了错误的电子邮件并复制/粘贴了它.

也许我不清楚我的问题,但我并不是想阻止人们在他们的浏览器上复制(或拖动选择)文本.我只是想阻止他们输入粘贴到文本字段中以最小化用户错误.

也许不是使用这个"黑客",你可以建议另一个解决我正在努力解决的核心问题的解决方案?我做了不到六个用户测试,这已经发生了两次.我的观众没有高水平的计算机熟练程度.

Pek*_*ica 129

不要这样做.不要弄乱用户的浏览器.通过复制+粘贴到电子邮件确认字段,用户对他们键入的内容承担责任.如果他们愚蠢到复制+粘贴错误的地址(它发生在我身上)那么这就是他们自己的该死的错.

如果您想确保电子邮件确认工作正常,请让用户在您的网站等待时检查他们的电子邮件("请在新窗口中打开您的网络邮件程序").用大胖子信件显示电子邮件地址("确认电子邮件发送给......发了错误?请点击此处更改).

更好的是,如果可以的话,让用户在没有确认的情况下获得某种有限的访问权限.这样,即使确认邮件因其他原因(例如垃圾邮件过滤器)被阻止,他们也可以立即登录并提高与访问者保持联系的机会.

  • 还有一种常见的情况是,查看此问题的开发人员很少或根本无法控制他们正在处理的项目的要求.这不是这里提出的问题的答案,所以-1. (11认同)
  • 如果您有这样的要求,那么作为专业人士的工作就是推迟它.你不仅仅是一双可以编写代码的人. (10认同)
  • f*ck要求,争夺权力 - 只有愚蠢的PM和muckety mucks才需要开发人员禁止复制/粘贴 (8认同)
  • 当用户自己输入数据时,我同意您的答案.但是,当用户代表其他人(例如,CRM系统或类似系统)输入电子邮件地址时,实施您的解决方案是不可行的.在这些情况下,用户不是他们输入自己的电子邮件地址,因此他们可能会拼错它.如果您允许粘贴到电子邮件确认框,那么您将获得大量不正确的数据,因此防止粘贴没有任何问题.作为开发人员,您必须减少"愚蠢"用户以保护业务数据. (6认同)
  • 但几乎任何事情都有正当理由,不回答某人的问题,因为你认为他们的理由不合理是令人恼火的。假设你有一个测验,你试图用复杂的答案来实现。禁用粘贴并强迫学生输入整个答案而不是复制粘贴会使他们将答案提交到记忆中,而仅复制粘贴可能毫无价值。这样做是有正当理由的。警告某人在大多数情况下他们尝试做的事情不是一个好主意,但请给出答案……或者最好不要费心回复。 (6认同)
  • 这并不能回答任何问题。“我该怎么做 XYZ?” “我建议你不要做 XYZ” (3认同)
  • 说不做就不回答这个问题.我目前要求禁用粘贴. (2认同)
  • “那么?” - 嗯,很简单,这是一个回答问题的论坛 (2认同)
  • 在某些情况下,我们必须拒绝将信息粘贴到表单字段中。就像当您要求用户确认电子邮件或密码时一样。 (2认同)
  • 不回答问题并假设没有充分的理由这样做,这是错误的。 (2认同)

Boy*_*ycs 64

向要禁用复制粘贴功能的输入添加一类'disablecopypaste'并添加此jQuery脚本

  $(document).ready(function () {
    $('input.disablecopypaste').bind('copy paste', function (e) {
       e.preventDefault();
    });
  });
Run Code Online (Sandbox Code Playgroud)


Chr*_*ker 50

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

这就是我想出来的.它不会完全禁用粘贴(例如,用户可以一次粘贴一个字符),但它符合我的需要并避免必须处理keyCodes等.

// 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);
                }
            }
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

要使用它来禁用粘贴:

<input type="text" onpaste="return false;" />
Run Code Online (Sandbox Code Playgroud)

*我知道oninput不是W3C DOM规范的一部分,但是我已经用Chrome-2,Safari 4,Firefox 3,Opera 10,IE6,IE7测试这些代码的所有浏览器都支持oninput或onpaste.在所有这些浏览器中,只有Opera不支持onpaste,但它确实支持oninput.

注意:这不适用于使用屏幕键盘的控制台或其他系统(假设在选择每个键时屏幕键盘不会向浏览器发送键).如果您的页面/应用程序可能被屏幕键盘和Opera(例如:Nintendo Wii,某些手机)使用,请不要使用此脚本,除非您已经过测试以确保屏幕键盘在每个键选择后将密钥发送到浏览器.

  • 要防止firefox遵守这个愚蠢的规则,请转到about:config并将dom.event.clipboardevents.enabled更改为false (49认同)
  • 即使我不包含您编写的 js,我也可以通过包含 `onpaste="return false"` 来防止用户粘贴任何内容,如果我采用这种方法会不会有任何问题 (2认同)

Kai*_*las 22

刚刚得到这个,我们可以实现它onpaste:"return false",感谢:http://sumtips.com/2011/11/prevent-copy-cut-paste-text-field.html

我们提供了以下列出的各种其他选项.

<input type="text" onselectstart="return false" onpaste="return false;" onCopy="return false" onCut="return false" onDrag="return false" onDrop="return false" autocomplete=off/><br>
Run Code Online (Sandbox Code Playgroud)


She*_*eff 16

你可以.....但不要.

您不应该更改用户浏览器的默认行为.您的Web应用程序的可用性确实很差.此外,如果用户想要禁用此hack,那么他们可以在他们的浏览器上禁用javascript.

只需将这些属性添加到文本框即可

ondragstart=”return false” onselectstart=”return false”
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于禁用粘贴.这种技术只会使复制变得困难而根本不会影响粘贴. (5认同)

Jos*_*Lee 9

疯狂的想法:要求用户在注册过程中向您发送电子邮件.当点击mailto链接不起作用时(例如,如果他们使用网络邮件),这显然是不方便的,但我认为这是一种同时保证打字错误并确认电子邮件地址的方法.

它会是这样的:他们填写大部分表格,输入他们的名字,密码等等.当他们推送提交时,他们实际上是在点击链接以向您的服务器发送邮件.您已经保存了其他信息,因此该消息只包含一个令牌,说明了这个帐号.


Ric*_*cas 7

如何将确认电子邮件发送到用户刚刚输入两次的电子邮件地址,其中有一个链接指向您网站上的确认网址,那么您知道他们收到了消息吗?

任何未点击确认收到电子邮件的人可能都输入了错误的电子邮件地址.

不是一个完美的解决方案,而是一些想法.

  • 为了继续科林所说的话,你可以假设当有人试图用相同的用户名和不同的电子邮件地址重新注册并且他们没有回复确认消息时,可能会让他们这样做.您可能会发现人们在他们的电子邮件中获取了他们的域名,但拼错了他们的用户名并可以使用它来进一步确定某人何时犯了错误? (8认同)
  • 我目前有这个实现.问题是用户认为他们由于我们的错误而没有收到电子邮件,因为他们检查了他们认为*他们输入的电子邮件地址并且他们没有电子邮件.还会发生的是,当他们再次尝试重新注册时,他们使用的用户名现在不可用,因为它使用了错误的电子邮件地址. (4认同)

Sun*_*arg 6

你可以使用jquery

HTML文件

<input id="email" name="email">
Run Code Online (Sandbox Code Playgroud)

jquery代码

$('#email').bind('copy paste', function (e) {
        e.preventDefault();
    });
Run Code Online (Sandbox Code Playgroud)


e3m*_*eus 5

扩展@boycs答案,我建议也使用"on".

$('body').on('copy paste', 'input', function (e) { e.preventDefault(); });
Run Code Online (Sandbox Code Playgroud)


GMK*_*ain 5

函数式方法VanillaJS

function pasteNotAllowFunc(xid){
 let myInput = document.getElementById(xid);
     myInput.onpaste = (e) => e.preventDefault();
}

function copyNotAllowFunc(xid){
 let myInput = document.getElementById(xid);
     myInput.oncopy = (e) => e.preventDefault();
}


copyNotAllowFunc('copyInput')

pasteNotAllowFunc('pasteInput')
Run Code Online (Sandbox Code Playgroud)
Copy
<input id="copyInput" value="copy not allow" />
<hr/>
Paste
<input id="pasteInput" value="paste not allow"/>
<hr/>
Textarea
<textarea id="test" value="Paste here"></textarea>
Run Code Online (Sandbox Code Playgroud)