7
votes

Définir la mise au point sur la prochaine entrée de JQuery?

J'ai actuellement un script qui va vérifier la valeur d'une zone de sélection, puis activez un champ de texte juste à côté de celui-ci, puis de définir la mise au point.

J'ai ceci pour le moment qui fonctionne Bien pour permettre au champ d'entrée ... p> xxx pré>

Je suis un peu coincé sur le "Focus" pour être honnête, j'ai essayé "$ (ceci). "entrée"). Focus (); " Mais cela n'a pas été concentré du tout, bien que cela n'ait pas apporté une erreur JavaScript ... P>

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

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

});


1 commentaires

Pourriez-vous publier votre HTML aussi?


3 Réponses :


1
votes

Je pense que votre problème peut être qu'il n'est pas possible de mettre l'accent sur une commande d'entrée désactivée (au moins dans certains navigateurs / systèmes d'exploitation).

Votre Focus () code> L'appel est Fondamentalement dans le mauvais bloc - il devrait être dans le bloc sinon code>, pas le bloc si code> bloc. p>

Comme ceci: p>

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

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


2 commentaires

Hah! Merci beaucoup Rob ... Je viens de comprendre que je me suis concentré sur le «si» et pas le «autre»! Erreur d'écoliers absolue, désolé et merci beaucoup - n'était pas avant de poster que je me suis rendu compte :)


N'oubliez pas de cacher le $ (ceci) plutôt que de l'appeler plusieurs fois



5
votes

modifié de la réponse ci-dessus avec cached cet objet JQ. De plus, le filtre à l'intérieur suivant n'est pas nécessaire. suivant () ne retournera jamais que le prochain frère. Le filtre dit essentiellement de me faire passer le prochain uniquement s'il s'agit d'une entrée ou du filtre que vous donnez. Si vous êtes sûr que le prochain est l'objet souhaité, 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();
    }
});


1 commentaires

Absolument parfait, et une solution bien meilleure que ce que j'utilisais, merci!



15
votes

a également trouvé un joli petit plugin pour obtenir la prochaine entrée: http://jqueryminute.com/set-focus-a-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;
    });
};


5 commentaires

J'ajouterais .not (': caché') dans la déclaration champs, alors seuls les éléments visibles sont sélectionnés. En outre, ajoutez else {champs.first (). Focus ();} Pour mettre l'accent sur le premier élément.


Pourquoi recherchez-vous des parents: EQ (0) d'abord?


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


Bonne idée @collink - je l'ai ajouté dans


J'ajouterais également un .not (': désactivé ») dans la déclaration champs, seuls les éléments non désactivés sont sélectionnés.