2010-12-03 20 views
4

J'ai un champ de texte qui est enveloppé dans un div d'erreur lorsque l'utilisateur soumet ou met au point une entrée invalide. Je voudrais supprimer le wrapper si l'utilisateur corrige son erreur, cependant, la méthode unwrap() provoque la perte de focus du champ.jQuery: Textfield perd son focus sur unwrap()

$(special_input).live('keyup', function() { 
    if (input_okay && input_had_errors) { 
     $(this).unwrap(); 
    } 
}); 

Pas grand-chose, je peux réinitialiser la mise au point et il fonctionne très bien ...

$(this).unwrap().focus(); 

... partout, mais dans IE! J'ai essayé d'insérer une fonction setTimeOut() dans la fonction ci-dessus pour contourner le manque de support d'IE pour le bouillonnement de l'événement focus(), et cela fonctionne ... un peu. Le seul problème est qu'il place le curseur au début de tout ce qui est tapé plutôt que de la fin. (QUOI ?!)

Réinitialiser le focus semble un peu moche de toute façon. Y at-il un moyen de garder unwrap() de le désamorcer en premier lieu?

Merci.

Kinda solution:

Pour les raisons Ender et insaisissable a fait remarquer, je viens décidé de résoudre le problème du curseur déplacé, ce qui peut être fait en remettant à zéro la valeur du champ de texte après se concentrant sur encore une fois. Le code ressemble à ceci maintenant.

$(this).unwrap(); 
setTimeout(function() { $(this).focus().val($(this).val()); }, 5); 

Répondre

3

Je ne pense pas que vous pouvez .unwrap() sans perdre le focus, car il supprime le nœud parent du DOM, et les enfants où ajoute le parent était par la suite. Vous pouvez taper des champs d'entrée non attachés si le navigateur ne supprime pas le focus lors du détachement.

+0

Gar. Merci pour l'information. Je n'avais pas réalisé que c'était comme ça que ça fonctionnait, mais je suppose que ça aurait pu marcher autrement? Je suppose comme une alternative, je vais essayer d'obtenir ce curseur à la fin du champ de texte dans IE ... – hellodally

0

Je suis d'accord avec insaisissable qu'il est peu probable que vous pouvez .unwrap() sans perdre le focus, pour les raisons citées. Vous pourriez considérer la raison pour laquelle vous enveloppez le champ de texte en premier lieu. Est-il possible que vous puissiez obtenir le même effet en appliquant simplement une classe sur le terrain, ou avec un div placé avant ou après le champ? Cela vous permettrait de contourner complètement le problème.

+0

Merci ender. J'utilise des rails form_helpers et je voulais répliquer l'apparence par défaut avec mon code jQuery, car je pensais que ce serait plus facile que de truquer avec les erreurs par défaut ... Peut-être que j'avais tort :) – hellodally