Отключите текст вставки в HTML-форму

Выделите строку достаточной длины, затем используйте snprintf.

87
задан Michał Perłakowski 25 March 2016 в 15:35
поделиться

8 ответов

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

Из всех этих браузеров только Opera не поддерживает onpaste, но поддерживает oninput.

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

Из всех этих браузеров только Opera не поддерживает onpaste, но поддерживает oninput.

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

50
ответ дан 24 November 2019 в 07:38
поделиться

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

Кто не знает

7
ответ дан 24 November 2019 в 07:38
поделиться

Вы можете ... но не делайте этого.

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

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

ondragstart=”return false” onselectstart=”return false”
16
ответ дан 24 November 2019 в 07:38
поделиться

Добавьте второй шаг к процессу регистрации. Первая страница, как обычно, но при перезагрузке отобразите вторую страницу и снова спросите адрес электронной почты. Если это так важно, пользователь может с этим справиться.

2
ответ дан 24 November 2019 в 07:38
поделиться

Вы можете прикрепить прослушиватель "keydown" в поле ввода, чтобы определить, нажаты ли клавиши Ctrl + V, и, если да, остановить событие или установить значение поля ввода на "".

Это не обрабатывает щелчок правой кнопкой мыши и вставку или вставку из в меню «Правка» браузера. Возможно, вам потребуется добавить «последнюю длину» счетчик нажатия клавиш и используйте интервал, чтобы проверить текущую длину поля, чтобы увидеть, увеличилась ли она с момента последнего нажатия клавиши

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

2
ответ дан 24 November 2019 в 07:38
поделиться

Crazy idea: Require the user to send you an email as part of the signup process. This would obviously be inconvenient when clicking on a mailto link doesn't work (if they're using webmail, for example), but I see it as a way to simultaneously guarantee against typos and confirm the email address.

It would go like this: They fill out most of the form, entering their name, password, and whatnot. When they push submit, they're actually clicking a link to send mail to your server. You've already saved their other information, so the message just includes a token saying which account this is for.

9
ответ дан 24 November 2019 в 07:38
поделиться

Don't do it. Don't mess with the user's browser. By Copy + Pasting into an E-Mail confirmation field, the user accepts responsibility over what they type. If they are dumb enough to copy + paste a faulty address (it has happened to me) then it's their own damn fault.

If you want to make sure that the E-Mail confirmation works out, have the user check their E-Mail while your site waits ("Please open your webmail program in a new window"). Show the E-Mail address in big fat letters ("The confirmation E-Mail was sent to.... made an error? CLick here to change).

Even better, if you can, let the user have some kind of limited access without confirming. That way, they can log in straight away and you improve your chances to keep in touch with the visitor even if the confirmation mail is blocked due to other reasons (e.g. spam filters).

127
ответ дан 24 November 2019 в 07:38
поделиться

как насчет использования CSS в UIWebView? что-то вроде

<style type="text/css">
<!—-
    * {
        -webkit-user-select: none;
    }
-->
</style>

также вы можете прочитать подробную информацию о копировании и вставке блоков с помощью CSS http://rakaz.nl/2009/09/iphone-webapps-101-getting-safari-out-of -the-way.html

0
ответ дан 24 November 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: