Отключить вставку текста в HTML-форму - PullRequest
88 голосов
/ 04 августа 2009

Есть ли способ с помощью JavaScript отключить возможность вставки текста в текстовое поле в форме HTML?

например. У меня есть простая форма регистрации, где пользователь должен ввести свой адрес электронной почты дважды. Вторая запись электронной почты должна подтвердить, что в первой записи электронной почты нет опечаток. Однако, если пользователь копирует / вставляет свою электронную почту, то это противоречит цели, и у меня возникают проблемы с пользователями, потому что они ввели неправильную электронную почту и скопировали / вставили ее.

Возможно, я не совсем понял свой вопрос, но я не пытаюсь помешать людям копировать (или перетаскивать выделение) текст в своем браузере. Я просто хочу остановить их от вставки ввода в текстовое поле, чтобы минимизировать ошибку пользователя.

Возможно, вместо использования этого "хака", вы можете предложить другое решение основной проблемы, которую я пытаюсь решить здесь? Я провел менее полдюжины пользовательских тестов, и это уже происходило дважды. Моя аудитория не имеет высокого уровня владения компьютером.

Ответы [ 22 ]

119 голосов
/ 13 ноября 2009

Не делай этого. Не связывайтесь с браузером пользователя. Скопировав + вставив в поле подтверждения электронной почты, пользователь принимает на себя ответственность за то, что он печатает. Если они достаточно глупы, чтобы скопировать + вставить неверный адрес (это случилось со мной), то это их собственная чертова ошибка.

Если вы хотите убедиться, что подтверждение электронной почты работает, попросите пользователя проверить свою электронную почту, пока ваш сайт ожидает («Пожалуйста, откройте свою программу веб-почты в новом окне»). Показывать адрес электронной почты большими жирными буквами («Письмо с подтверждением было отправлено на адрес ... произошла ошибка? Нажмите здесь, чтобы изменить его).

Еще лучше, если вы можете, позволить пользователю иметь какой-то ограниченный доступ без подтверждения. Таким образом, они могут сразу войти в систему, и вы повысите свои шансы оставаться на связи с посетителем, даже если письмо с подтверждением заблокировано по другим причинам (например, спам-фильтры).

64 голосов
/ 10 января 2012

Добавьте класс 'disablecopypaste' к входам, для которых вы хотите отключить функцию копирования и вставки, и добавьте этот скрипт jQuery

  $(document).ready(function () {
    $('input.disablecopypaste').bind('copy paste', function (e) {
       e.preventDefault();
    });
  });
51 голосов
/ 12 ноября 2009

Мне недавно пришлось неохотно отключать вставку в элементе формы. Для этого я написал кросс-браузерную * реализацию обработчика событий onpaste Internet Explorer (и других). Мое решение должно было быть независимым от любых сторонних библиотек 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;" />

* Я знаю, что oninput не является частью спецификации W3C DOM, но все браузеры, в которых я тестировал этот код, - Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 - поддерживают либо oninput, либо onpaste. Из всех этих браузеров только Opera не поддерживает onpaste, но поддерживает oninput.

Примечание. Это не будет работать в консоли или другой системе, в которой используется экранная клавиатура (при условии, что экранная клавиатура не отправляет ключи в браузер при выборе каждой клавиши). Если возможно, что ваша страница / приложение может использоваться кем-то с экранной клавиатурой и Opera (например, Nintendo Wii, некоторые мобильные телефоны), не используйте этот скрипт, если вы не проверили, чтобы убедиться, что экранная клавиатура отправляет ключи в браузер после каждого выбора ключа.

20 голосов
/ 08 октября 2014

Только что получил, мы можем достичь этого, используя 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>
16 голосов
/ 04 августа 2009

Вы можете ..... но не можете.

Вы не должны изменять поведение браузера по умолчанию. Это действительно плохое удобство использования для вашего веб-приложения. Также, если пользователь хочет отключить этот хак, он может просто отключить JavaScript в своем браузере.

Просто добавьте эти атрибуты в текстовое поле

ondragstart=”return false” onselectstart=”return false”
9 голосов
/ 13 ноября 2009

Сумасшедшая идея: потребуйте, чтобы пользователь отправил вам электронное письмо как часть процесса регистрации. Это, очевидно, было бы неудобно, когда нажатие на ссылку mailto не работает (например, если они используют веб-почту), но я вижу в этом способ одновременной гарантии от опечаток и подтверждения адреса электронной почты.

Это будет выглядеть так: они заполняют большую часть формы, вводя свое имя, пароль и еще много чего. Когда они нажимают кнопку отправки, они фактически нажимают на ссылку, чтобы отправить почту на ваш сервер. Вы уже сохранили их другую информацию, поэтому в сообщении просто содержится токен, указывающий, для какой учетной записи он предназначен.

7 голосов
/ 04 августа 2009

Как насчет отправки электронного письма с подтверждением на адрес электронной почты, который пользователь только что дважды вводил, в котором есть ссылка на URL подтверждения на вашем сайте, тогда вы знаете, что он получил сообщение?

Любой, кто не нажимает, чтобы подтвердить получение электронного письма, возможно, неправильно указал свой адрес электронной почты.

Не идеальное решение, но только некоторые идеи.

5 голосов
/ 05 ноября 2015

Вы можете использовать jquery

HTML-файл

<input id="email" name="email">

Код запроса

$('#email').bind('copy paste', function (e) {
        e.preventDefault();
    });
5 голосов
/ 09 сентября 2014

Расширение @ boycs ответа, я бы также рекомендовал использовать "on".

$('body').on('copy paste', 'input', function (e) { e.preventDefault(); });
3 голосов
/ 24 августа 2016

если вам нужно использовать 2 поля электронной почты и вы обеспокоены тем, что пользователь неправильно вставляет одно и то же опечатку из поля 1 в поле 2, я бы сказал, показать предупреждение (или что-то более тонкое), если пользователь вставит что-то в второе поле электронной почты

document.querySelector('input.email-confirm').onpaste = function(e) {
    alert('Are you sure the email you\'ve entered is correct?');
}

таким образом, вы не отключаете вставку, вы просто даете им дружеское напоминание, чтобы проверить, что они предположительно набрали в первом поле, а затем вставили во второе поле, правильно.

однако, возможно, единственное поле электронной почты с автозаполнением - это все, что нужно. скорее всего, в какой-то момент они правильно заполнили свою электронную почту на другом сайте, и браузер предложит заполнить поле этой электронной почтой

<input type="email" name="email" required autocomplete="email">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...