2009-08-05 6 views
7

J'ai actuellement un script qui va vérifier la valeur d'une boîte de sélection, puis activer un champ de texte juste à côté de lui, puis j'espère mettre le focus.Définir le focus sur l'entrée suivante dans jQuery?

J'ai ce au moment qui fonctionne très bien à permettre le champ d'entrée ...

$("#assessed select").change(function() { 

    if($(this).val() == 'null') { $(this).next('input').attr("disabled", true); } 
    else { $(this).next('input').removeAttr("disabled"); } 

}); 

Je suis un peu coincé sur le « focus » peu pour être honnête, j'ai essayé « $ (ce) .next ('input'). focus(); " mais cela ne s'est pas focalisé du tout, même si cela n'a pas fait apparaître une erreur Javascript non plus ...

$("#assessed select").change(function() { 

    if($(this).val() == 'null') { $(this).next('input').attr("disabled", true); $(this).next('input').focus(); } 
    else { $(this).next('input').removeAttr("disabled"); } 

}); 

Des idées s'il vous plaît les gars? Je suis vraiment coincé là-dessus et ce serait un ajout très simple, mais très utile à la page que je construis!

Merci

+0

Pouvez-vous publier votre HTML aussi bien? – RaYell

Répondre

5

modifiée de la réponse ci-dessus avec cache cet objet JQ. Aussi le filtre à l'intérieur n'est pas nécessaire. next() ne retournera jamais que le prochain frère. Le filtre est en train de dire que vous me donnez le suivant seulement s'il s'agit d'une entrée ou de n'importe quel filtre que vous donnez. Si vous êtes sûr que le prochain est l'objet désiré, il n'est pas nécessaire d'inclure le filtre.

$("#assessed select").change(function() { 
    var $this = $(this); 
    if($this.val() === 'null') { 
     $this.next() 
      .attr("disabled", true); 
    } 
    else { 
     $this.next() 
      .removeAttr("disabled") 
      .focus(); 
    } 
}); 
+0

Absolument parfait, et beaucoup meilleure solution que ce que j'utilisais, merci! – Nick

1

je pense que votre problème est peut-être qu'il est impossible de définir le focus à un contrôle d'entrée désactivé (au moins dans certains navigateurs/systèmes d'exploitation).

Votre appel focus() est fondamentalement dans le mauvais bloc - il devrait être dans le bloc else, pas le bloc if.

Comme ceci:

$("#assessed select").change(function() { 

    if($(this).val() == 'null') { $(this).next('input').attr("disabled", true); } 
    else { $(this).next('input').removeAttr("disabled"); $(this).next('input').focus(); } 
}); 
+0

Hah! Merci beaucoup Rob ... Je viens de réaliser que je mettais l'accent sur le 'si' et non le 'else'! Erreur écolier absolue, désolé et merci beaucoup - n'était pas jusqu'à ce que vous avez posté que j'ai réalisé :) – Nick

+0

Rappelez-vous de mettre en cache le $ (ceci) plutôt que de l'appeler plusieurs fois – redsquare

+0

Fait, merci :) – Nick

14

On trouve également un joli petit plug-in pour obtenir l'entrée suivante: http://jqueryminute.com/set-focus-to-the-next-input-field-with-jquery/

$.fn.focusNextInputField = function() { 
    return this.each(function() { 
     var fields = $(this).parents('form:eq(0),body').find('button,input,textarea,select').not(':hidden'); 
     var index = fields.index(this); 
     if (index > -1 && (index + 1) < fields.length) { 
      fields.eq(index + 1).focus(); 
     } 
     else {fields.first().focus();} 
     return false; 
    }); 
}; 
+4

J'ajouterais '.not (': hidden')' à la déclaration des champs, donc seuls les éléments visibles sont sélectionnés. Ajoutez également 'else {fields.first(). Focus();}' pour obtenir le focus sur le premier élément. –

+0

Pourquoi cherchez-vous les parents: eq (0) en premier? – Serge

+0

@Serge il sélectionne la forme parent que l'élément d'entrée est. Je ne sais pas si le "eq (0)" est nécessaire, pas mon code tho, donc je ne suis pas sûr. – TimoSolo

Questions connexes