le curseur saute lorsque vous appuyez sur les touches fléchées

J’ai une zone de texte, où un caractère interdit ne peut pas être tapé. #.

Cela fonctionne, cependant, lorsque la zone de texte est remplie avec des données et que je mets l’accent sur le milieu de la zone de texte, puis que j’utilise les touches de direction pour aller à gauche et à droite, puis qu’il saute à la fin de la zone de texte.

Si je tape un caractère également au milieu de la zone de texte, il va à la fin

$('[id$=txtClient]').keyup(function () { EnableClientValidateButton(); // When the textbox changes, the user has the ability to validate the client ChangeColorClient("0"); // The color is changed to white, to notify the user the client is not validated yet. var $el = $('[id$=txtClient]'); // the text element to seach for forbidden characters. var text = $el.val(); // The value of the textbox text = text.split("#").join("");//remove occurances of forbidden characters, in this case # $el.val(text);//set it back on the element }); 

C’est un peu désagréable et je ne suis pas content à 100%, mais cela résout tous les problèmes que vous avez rencontrés …

 $("[id$=txtClient]").keyup(function (e) { var text = $(this).val(); if (text.indexOf("#") > -1) { text = text.replace("#", ""); $(this).val(text); } }); 

Voici un exemple jsFiddle …

http://jsfiddle.net/E4cBK/

Javascript vous permet de définir la position du curseur pour les entrées.

J’ai trouvé deux fonctions utiles:

Et la solution pourrait ressembler à ceci:

  function getCaretPosition (elem) { // Initialize var iCaretPos = 0; // IE Support if (document.selection) { // Set focus on the element elem.focus (); // To get cursor position, get empty selection range var oSel = document.selection.createRange (); // Move selection start to 0 position oSel.moveStart ('character', -elem.value.length); // The caret position is selection length iCaretPos = oSel.text.length; } // Firefox support else if (elem.selectionStart || elem.selectionStart == '0') iCaretPos = elem.selectionStart; // Return results return (iCaretPos); } function setCaretPosition(elem, caretPos) { if(elem != null) { if(elem.createTextRange) { var range = elem.createTextRange(); range.move('character', caretPos); range.select(); } else { if(elem.selectionStart) { elem.focus(); elem.setSelectionRange(caretPos, caretPos); } else elem.focus(); } } } $('[id$=txtClient]').keyup(function () { EnableClientValidateButton(); // When the textbox changes, the user has the ability to validate the client ChangeColorClient("0"); // The color is changed to white, to notify the user the client is not validated yet. var $el = $('[id$=txtClient]'); // the text element to seach for forbidden characters. var text = $el.val(); // The value of the textbox text = text.split("#").join("");//remove occurances of forbidden characters, in this case # var pos = getCaretPosition(this); $el.val(text);//set it back on the element setCaretPosition(this, pos); }); 

Avez-vous essayé d’utiliser l’événement de keypress ?

La documentation met en garde contre d’éventuelles différences de comportement entre les plates-formes.

Dans Firefox au moins, e.which correspond au code e.which du caractère saisi après transformation:

 $('#txtClient').keypress(function (e) { console.log('keypress:', e.which); if (e.which == 35) { return false; } }); 

violon mis à jour

Vous pouvez empêcher l’exécution de votre code si l’utilisateur appuie sur une flèche droite ou gauche. Pour ce faire, il vous suffit d’append cette condition:

 if(e.which != 37 && e.which != 39){ 

Vous pouvez trouver les codes de clé ici .

Votre code complet serait:

 $('[id$=txtClient]').keyup(function () { if(e.which != 37 && e.which != 39){ EnableClientValidateButton(); ChangeColorClient("0"); var $el = $('[id$=txtClient]'); var text = $el.val(); text = text.split("#").join(""); $el.val(text);//set it back on the element } }); 

EXEMPLE VIVANT

Il suffit d’empêcher l’action par défaut lors d’une pression sur une touche (keydown ne donne pas des charcode cohérents):

 $('[id$=txtClient]').keypress(function (e) { if (Ssortingng.fromCharCode(e.which) == '#'){ e.preventDefault(); } }); 

Cela empêche juste # et laisse le rest tel quel.

Voici;)