8
votes

Comment désactiver le backpace si quelque chose d'autre que le champ de saisie est axé sur l'utilisation de jQuery

Comment puis-je désactiver la touche de backstStroke si quelque chose à autre chose que 2 champs d'entrée spécifiques sont axés sur l'utilisation de jQuery?

Voici mon code actuel (maintenant 2 Textboxes): P>

$(document).keypress(function(e){
  var elid = $(document.activeElement).attr('id');
  if(e.keyCode === 8 && elid != 'textbox1' || elid != 'textbox2'){
      return false;
  };
});


0 commentaires

9 Réponses :


12
votes

Je pense que cela ferait l'affaire: xxx

supposant que les boîtes de texte ont la classe "TextInput".

Voici un exemple de travail


6 commentaires

L'événement ne tire pas ici pour le retour arrière


Vous avez raison, le keypress ne tire pas sur l'espace de retour. IV'e mise à jour à Keydown et maintenant ça marche. Merci pour la remarque


Génial, cela fonctionne. J'ai changé la vérification de la condition en $ (document.activeLement) .is ("entrée [type = text]") car je n'utilise pas une telle classe. Pourrait ajouter d'autres types si nécessaire.


À mon avis, la réponse de @ rybo111 est meilleure car elle n'a pas besoin d'appliquer une classe sur tout, car elle ne regarde pas: Focus mais ActiveLement (qui a déjà lieu), et parce qu'il comprend des intrants et des textaes . Stackoverflow.com/a/17278620/105539


Backspace ne s'inscrit pas comme un événement de clavier sur chrome, mais il fait sur Firefox


@Volomike dans la question originale L'astucieux voulait désactiver l'espace de retour dans chaque champ d'entrée sauf deux. C'est pourquoi ma réponse a besoin d'une classe spéciale, de lui permettre de choisir les entrées qui accepteront l'espace de retour.



2
votes

@Nick cravraver, réponse honteuse pour quelques raisons. Répondez à la question ou au moins fréquenter pensivement.

Voici une solution basée sur les prototypes que j'ai fini par utiliser pour mes formulaires, car les utilisateurs se sont plaints que le backpace les retirait de la forme (qui est une chose tellement contre-intuitive à faire, une merveille Pourquoi tous les navigateurs utilisent la touche de backspace comme bouton arrière). P>



        // event handlers must be attached after the DOM is completely loaded
        Event.observe(window, 'load', function() {
          // keypress won't fire for backspace so we observe 'keydown'
          Event.observe(window, 'keydown', function(event){
            // 8 == backspace
            if( event.keyCode == 8) {
                // with no field focused, the target will be HTMLBodyElement
               if( event.target == document.body) {
                  // stop this event from propagating further which prevents                      
                  // the browser from doing the 'back' action
                  event.stop();
               }
             }
          });
        });


2 commentaires

A l'air génial, mais ne fonctionne pas sur chrome car il n'a pas d'événement. Je l'ai aussi collé à l'intérieur de $ (document) .Ready (fonction (fonction () {... bloquée ici ...} Parce que vous avez dit "doit être jointe après que le DOM soit complètement chargé".


@Volomike Désolé, j'aurais dû préciser que ceci est une solution basée sur le prototype JavaScript Framework ( prototypejs.org ). C'est semblable à JQuery, juste pire.



8
votes

Cela désactivera l'espace de retour sur votre site sans avoir à ajouter des classes spécifiques aux boîtes de saisie. Pour désactiver l'espace de retour, sauf lorsque vous utilisez des cases d'entrée, utilisez .is ("Entrée: Focus") FORT> Si vous souhaitez désactiver le backpace, sauf si vous utilisez des cases Textarea, utilisez .is ("Entrée: Focus, Textarea: Focus ") STRUT>

$(document).keypress(function(e){ 
    var elid = $(document.activeElement).is("input:focus"); 
    if(e.keyCode === 8 && !elid){ 
       return false; 
    }; 
});


2 commentaires

L'entrée et la textarea devraient supporter l'espace de retour


Si c'est déjà l'élément actif, pourquoi vérifier l'événement de la mise au point aussi?



2
votes

La réponse de Hudson-Peralta a fonctionné bien pour moi, mais j'ai fait une petite modification depuis que j'utilise de nombreux événements de clés: xxx


1 commentaires

Ne supporte pas textarea.



5
votes

Je pense qu'une légère modification est nécessaire pour gérer textaes: xxx


0 commentaires


6
votes

La solution de Hudson-Peralta + QF_Developer est géniale, mais elle a une faille: Si votre mise au point est sur un bouton radio ou la case à cocher, le bouton Retour arrière vous jette toujours de la page. Voici une modification pour éviter cet écart: xxx

edit 20130204:

keypress () remplacé par clé () ! de
Le code ci-dessus fonctionne maintenant correctement.

EDIT 20151208:

Comme mentionné dans le commentaire de @outofmind, il y a plus de types d'entrée qui pourraient vous remettre lorsque vous appuyez sur le dos. Veuillez ajouter à la liste sélecteur séparée des virgules de la méthode IS () Tout type de champs d'entrée permettant une entrée de caractères directs et qui sont vraiment utilisés dans votre code HTML, comme entrée [type = "mot de passe"]: Focus , entrée [TYPE = "Numéro"]: Focus ou entrée [TYPE = "EMAIL"]: Focus


4 commentaires

Vous êtes absolument correct, Thomas! J'ai corrigé ma réponse en conséquence. Dans un projet où j'utilise le code moi-même, j'utilise également la clé, mais pour rester en ligne avec la discussion ici, j'ai copié et modifié les blocs existants de cette discussion et introduisez l'erreur. Désolé.


Pourquoi se concentrer uniquement sur l'entrée [TYPE = "Texte"] uniquement et toutes les entrées ne sont-elles pas disponibles? Si c'est déjà l'élément actif, pourquoi ne recherchez que sur les éléments de la mise au point?


Vous devez également autoriser entrée [type = "numéro"]] et entrée [type = "mot de passe"]


Entièrement d'accord, @outofmind. J'ai édité la réponse. Merci!



0
votes

J'ai modifié la réponse un peu plus pour combiner la bonne réponse de chacun de
1. Sélecteur d'occasion "Entrée [TYPE = Texte]: Focus, Textarea: Focus" Pour maintenir le comportement par défaut pour ces éléments et, comme indiqué JPsy, d'empêcher le comportement par défaut sur les entrées telles que la case à cocher
2. Utilisé E.Target plutôt que pour rendre le code dépend plus exclusivement sur jQuery, car je ne suis pas sûr si chaque navigateur prend en charge le document.ActiveElement bien

Modifier strong>
3. Inclure le champ strong> Mot de passe strong> En ajoutant l'entrée "[TYPE = MOT DE PASSE]: FOCUS" FORT>, P>

     $(document).keydown(function(e){

          var code=e.keyCode;
          var is_to_stop= (!$(e.target).is("input[type=text]:focus, input[type=password]:focus, textarea:focus")) && (code==8);
          if(is_to_stop){
            return false;
          }

    });


0 commentaires

4
votes

J'ai fait une légère modification de la réponse acceptée, qui peut être utile à une personne: xxx

avec cette méthode, l'utilisateur peut toujours naviguer à l'aide d'un backpace en maintenant Ctrl, mais aussi prend en compte textarea ainsi que toute entrée .

Bien sûr, l'alternative consiste à utiliser quelque chose comme Ce à la place, qui ne permet pas à l'utilisateur de quitter la page s'il a entré quelque chose.


1 commentaires

Cela aurait dû être sélectionné comme meilleure réponse car c'est le plus complet. Merci pour cela - je l'ai utilisé avec succès avec QWebeview Widget dans une application QT / C ++.