web-dev-qa-db-fra.com

Définissez le focus de la souris et déplacez le curseur à la fin de la saisie à l'aide de jQuery

Cette question a été posée sous différents formats, mais je ne parviens pas à obtenir la moindre réponse dans mon scénario.

J'utilise jQuery pour implémenter l'historique des commandes lorsque l'utilisateur appuie sur les flèches haut/bas. Lorsque la flèche vers le haut est atteinte, je remplace la valeur d'entrée par la commande précédente et active le champ de saisie, mais je souhaite que le curseur soit toujours positionné à la fin de la chaîne d'entrée.

Mon code, tel quel:

$(document).keydown(function(e) {
  var key   = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
  var input = self.Shell.find('input.current:last');

  switch(key) {
    case 38: // up
      lastQuery = self.queries[self.historyCounter-1];
      self.historyCounter--;
      input.val(lastQuery).focus();
// and it continues on from there

Comment puis-je forcer le curseur à être placé à la fin de 'entrée' après la mise au point?

80
jerodsanto

On dirait que la valeur est effacée après la mise au point, puis la réinitialisation des travaux.

input.focus();
var tmpStr = input.val();
input.val('');
input.val(tmpStr);
128
scorpion9

Cela semble un peu bizarre, voire idiot, mais cela fonctionne pour moi:

input.val(lastQuery);
input.focus().val(input.val());

Maintenant, je ne suis pas sûr d'avoir répliqué votre configuration. Je suppose que input est un élément <input>.

En réinitialisant la valeur (sur lui-même), je pense que le curseur se met à la fin de l'entrée. Testé dans Firefox 3 et MSIE7.

53
artlung

J'espère que cela vous aidera:

var fieldInput = $('#fieldName');
var fldLength= fieldInput.val().length;
fieldInput.focus();
fieldInput[0].setSelectionRange(fldLength, fldLength);
27
harsh4u

Qu'en est-il en une seule ligne ...

$('#txtSample').focus().val($('#txtSample').val());

Cette ligne fonctionne pour moi.

9
Chris Rosete

2 artlung 's' answer: Cela fonctionne avec la deuxième ligne uniquement dans mon code (IE7, IE8; Jquery v1.6):

var input = $('#some_elem');
input.focus().val(input.val());

Addition: Si l'élément input a été ajouté à DOM à l'aide de JQuery, la focalisation n'est pas définie dans IE. J'ai utilisé un petit truc:

input.blur().focus().val(input.val());
8
SergO

Chris Coyier a pour cela un mini plugin jQuery qui fonctionne parfaitement: http://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input /

Il utilise setSelectionRange si pris en charge, sinon a un repli solide.

jQuery.fn.putCursorAtEnd = function() {
  return this.each(function() {
    $(this).focus()
    // If this function exists...
    if (this.setSelectionRange) {
      // ... then use it (Doesn't work in IE)
      // Double the length because Opera is inconsistent about whether a carriage return is one character or two. Sigh.
      var len = $(this).val().length * 2;
      this.setSelectionRange(len, len);
    } else {
      // ... otherwise replace the contents with itself
      // (Doesn't work in Google Chrome)
      $(this).val($(this).val());
    }
    // Scroll to the bottom, in case we're in a tall textarea
    // (Necessary for Firefox and Google Chrome)
    this.scrollTop = 999999;
  });
};

Ensuite, vous pouvez simplement faire:

input.putCursorAtEnd();
8
jackocnr

Je sais que cette réponse arrive en retard, mais je peux voir que les gens n’ont pas trouvé de réponse. Pour empêcher la touche haut de mettre le curseur au début, il suffit de return false de la méthode qui gère l'événement. Cela arrête la chaîne d'événements qui mène au mouvement du curseur. Coller le code révisé de l'OP ci-dessous:

$(document).keydown(function(e) {
  var key   = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
  var input = self.Shell.find('input.current:last');

  switch(key) {
    case 38: // up
      lastQuery = self.queries[self.historyCounter-1];
      self.historyCounter--;
      input.val(lastQuery).focus();
      // HERE IS THE FIX:
      return false; 
// and it continues on from there
6
pederOverland

Ref: @ will824 Commentaire, cette solution a fonctionné pour moi sans aucun problème de compatibilité. Le reste des solutions a échoué dans IE9.

var input = $("#inputID"); 
tmp = input.val(); input.focus().val("").blur().focus().val(tmp);

Testé et trouvé travaillant dans:

Firefox 33
Chrome 34
Safari 5.1.7
IE 9
6
Aamir Shahzad

J'utilise le code ci-dessous et cela fonctionne bien

function to_end(el) {
            var len = el.value.length || 0;
            if (len) {
                if ('setSelectionRange' in el) el.setSelectionRange(len, len);
                else if ('createTextRange' in el) {// for IE
                    var range = el.createTextRange();
                    range.moveStart('character', len);
                    range.select();
                }
            }
        }
6
Tomas

Ce sera différent pour différents navigateurs:

Cela fonctionne dans ff:

    var t =$("#INPUT");
    var l=$("#INPUT").val().length;
    $(t).focus();

    var r = $("#INPUT").get(0).createTextRange();
    r.moveStart("character", l); 
    r.moveEnd("character", l);      
    r.select();

Plus de détails sont dans ces articles ici SitePoint , AspAlliance .

5
TheVillageIdiot

comme d’autres dit, clear and fill a fonctionné pour moi:

    var elem = $('#input_field');
    var val = elem.val();
    elem.focus().val('').val(val);
3
Fabrizio

Au début, vous devez définir le focus sur l'objet de zone de texte sélectionné, puis la valeur.

$('#inputID').focus();
$('#inputID').val('someValue')
2
hladas

définir la valeur en premier. puis définissez le focus. lorsqu’il effectue la mise au point, il utilisera la valeur existante au moment de la mise au point; votre valeur doit donc être définie en premier.

cette logique fonctionne pour moi avec une application qui remplit un <input> avec la valeur d'un <button> cliqué. val() est défini en premier. alors focus()

$('button').on('click','',function(){
    var value = $(this).attr('value');
    $('input[name=item1]').val(value);
    $('input[name=item1]').focus();
});
2
gorillagoat

J'ai trouvé la même chose que suggéré ci-dessus par quelques personnes. Si vous commencez par focus(), appuyez ensuite sur val() dans l'entrée, le curseur se positionnera à la fin de la valeur d'entrée dans Firefox, Chrome et IE. Si vous appuyez d'abord sur val() dans le champ de saisie, Firefox et Chrome positionnent le curseur à la fin, mais IE le positionne au premier plan lorsque vous focus().

$('element_identifier').focus().val('some_value') 

devrait faire l'affaire (il a toujours pour moi de toute façon).

2
Travis Beatty
    function focusCampo(id){
        var inputField = document.getElementById(id);
        if (inputField != null && inputField.value.length != 0){
            if (inputField.createTextRange){
                var FieldRange = inputField.createTextRange();
                FieldRange.moveStart('character',inputField.value.length);
                FieldRange.collapse();
                FieldRange.select();
            }else if (inputField.selectionStart || inputField.selectionStart == '0') {
                var elemLen = inputField.value.length;
                inputField.selectionStart = elemLen;
                inputField.selectionEnd = elemLen;
                inputField.focus();
            }
        }else{
            inputField.focus();
        }
    }

$('#urlCompany').focus(focusCampo('urlCompany'));

fonctionne pour tous les navigateurs, c.-à-d. 

1
madhu

En voici une autre, une ligne qui ne réaffecte pas la valeur:

$("#inp").focus()[0].setSelectionRange(99999, 99999);
1
Chong Lip Phang
function CurFocus()
{
    $('.txtEmail').focus(); 
}

function pageLoad()
{
   setTimeout(CurFocus(),3000);
}

window.onload = pageLoad;
0
abbijohn

La réponse de scorpion9 fonctionne. Pour que ce soit plus clair, voir mon code ci-dessous,

<script src="~/js/jquery.js"></script> 
<script type="text/javascript">
    $(function () {
        var input = $("#SomeId");
        input.focus();
        var tmpStr = input.val();
        input.val('');
        input.val(tmpStr);
    });
</script>
0
Diganta Kumar