当前位置: 首页 > 面试题库 >

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

姚棋
2023-03-14
问题内容

有没有一种方法可以使用JavaScript禁用将文本粘贴到HTML表单上的文本字段的功能?

例如,我有一个简单的注册表格,要求用户输入两次电子邮件。第二个电子邮件条目是为了验证第一个电子邮件条目中没有错别字。但是,如果用户复制/粘贴他们的电子邮件,那么这将无法达到目的,并且我一直在遇到用户的问题,因为他们输入了错误的电子邮件并复制/粘贴了它。

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

也许您可以使用另一种解决方案来解决我要在此处解决的核心问题,而不是使用这种“
hack”?我已经完成了不到六个用户测试,而且已经发生了两次。我的听众没有很高的计算机水平。


问题答案:

我最近不得不勉强地禁用在表单元素中的粘贴。为此,我编写了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);
                }
            }
        }
    }
})();

要使用此功能来禁用粘贴:

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

*我知道oninput并不是W3C DOM规范的一部分,但是我测试过此代码的所有浏览器(Chrome 2,Safari 4,Firefox 3,Opera 10,IE6,IE7)都支持oninput或onpaste。在所有这些浏览器中,只有Opera不支持onpaste,但支持oninput。

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



 类似资料:
  • 问题内容: 我正在寻找一个如何将文本复制到iOS剪贴板的干净示例,然后可以在其他应用程序中使用/粘贴该文本。 此功能的优点是可以快速复制文本,而无需传统文本复制的标准文本突出显示功能。 我假设键类在其中,但是在它们提供的代码示例中找不到相关的区域。 问题答案: 如果您只需要纯文本,则可以使用属性。它既可读又可写: (从剪贴板中 读取数据时 ,UIPasteboard文档还建议您首先检查一下,“以避

  • 问题内容: 我继承了一些使用Hibernate的Java代码。现在,使用此代码的一些人报告他们到处都在获取NullPointerExceptions。 我已经找到了答案,发现执行查询从数据库中拉出一个对象列表时,该查询具有一个对象列表(从另一个表中拉出),Hibernate似乎在列表(NULL值)。因此,列表可能类似于: 我们用于从数据库中提取信息的代码是: 然后,在每个PrinterGroup内

  • 我们试图完成的是:从数据库应用程序复制一个简单的两列表(ECTS,grade),将内容粘贴到HTML表单中,将其转换为HTML并提交以执行一些PHP处理(仅供参考:在每个tr中,将TD[1]与TD[2]相乘,求和所有TD[1],求和所有TD[2]-我想我知道如何用PHP完成这一操作;然后,通过使用tcpdf,自动创建证书,已经创建了该部分)。 我希望我能以一种理解的方式解释我们的问题--我将很高兴

  • 问题内容: 这是Web上RTE的常见问题之一。您能否指导我完成以下步骤: 粘贴为纯文本 保留HTML,但删除WORD / HTML样式 我想直接在粘贴(paste_preprocess回调)上执行此操作,而无需打开粘贴插件提供的对话框。 有什么想法/经验吗? 谢谢, 问题答案: 这就是我要做的粘贴纯文本。 1. paste_preprocess设置(在tinymce init中) 2.函数stri

  • 我有一些html代码,例如, <代码> 我想将代码复制并粘贴到富文本格式,这样可以将html代码解析为真正的DOM。 我知道有js clipBoardData、zeroClipBoard、clipBoard polyfill,但它们都存在兼容性问题。我想写一个,它可以适用于大多数浏览器,我如何才能做到这一点?有什么想法吗? 在我看来,每个浏览器都可以解析html代码,而我复制的东西也是用html写