J'ai récemment dû, à contrecœur, désactiver le collage dans un élément de formulaire. Pour ce faire, j'ai écrit une implémentation inter-navigateurs* du gestionnaire d'événement onpaste d'Internet Explorer (et d'autres). Ma solution devait être indépendante de toute bibliothèque JavaScript tierce.
Voici ce que j'ai trouvé. Elle ne désactive pas complètement le collage (l'utilisateur peut coller un seul caractère à la fois, par exemple), mais elle répond à mes besoins et évite d'avoir à gérer les keyCodes, etc.
// 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);
}
}
}
}
})();
S'en servir pour désactiver le collage :
<input type="text" onpaste="return false;" />
* Je sais que oninput ne fait pas partie de la spécification DOM du W3C, mais tous les navigateurs avec lesquels j'ai testé ce code - Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 - supportent soit oninput soit onpaste. De tous ces navigateurs, seul Opera ne supporte pas le onpaste, mais il supporte le oninput.
Remarque : Cela ne fonctionnera pas sur une console ou un autre système qui utilise un clavier à l'écran (en supposant que le clavier à l'écran n'envoie pas les touches au navigateur lorsque chaque touche est sélectionnée). S'il est possible que votre page/application soit utilisée par une personne disposant d'un clavier à l'écran et d'Opera (par exemple : Nintendo Wii, certains téléphones portables), n'utilisez pas ce script à moins que vous n'ayez testé pour vous assurer que le clavier à l'écran envoie des touches au navigateur après chaque sélection de touche.
118 votes
Empêcher les gens de copier/coller leur adresse électronique de leur carnet d'adresses vers leur navigateur. Ça va bien se passer.
29 votes
On ne peut pas faire grand-chose quand c'est un client qui insiste pour qu'on change.)
15 votes
Il pourrait être tout à fait correct de désactiver le collage dans le champ de vérification uniquement lorsque l'e-mail n'a PAS été collé dans le champ d'origine. En d'autres termes, l'utilisateur devra soit coller l'e-mail dans les deux champs, soit dans aucun.
27 votes
Si un client vous le demande, dites-lui que c'est une mauvaise idée. C'est un excellent moyen d'énerver un client juste au moment où il est le plus susceptible de s'en aller (au moment de l'inscription). Vous ne voulez pas qu'une relation client commence par une aliénation du client. Cette pratique est à la fois de plus en plus courante et de plus en plus répréhensible, car de plus en plus de personnes utilisent des gestionnaires de mots de passe. Voir aussi : ux.stackexchange.com/q/21062/9529 et ob. xkcd : xkcd.com/970
0 votes
J'ai trouvé cette question en cherchant comment vaincre cette "fonctionnalité" avec l'inspecteur d'éléments. Et ça a marché !