10
votes

Action de déclenchement de jQuery sur la mise au point ou cliquez mais pas à la fois

J'ai ce code d'exemple:

$myTrigger
    .click(function(e){
         alert('click');
    })
    .focus(function(e){
         alert('focus');
         $(this).click()
    })


6 commentaires

Pourquoi ne pas simplement se débarrasser de la fonction de clic et ne se concentre que sur la mise au point? Si chaque clic est également concentré et que vous souhaitez que cela fonctionne à la fois sur Clic et Focus, utilisez uniquement la mise au point.


Serait-il plus logique de rendre l'action une fonction externe à la fois clic et appel de la mise au point? Cela permettrait de sauter entièrement ce problème. >> Ignorez cela par le commentaire ci-dessous.


@AJM Il va toujours exécuter cette fonction deux fois parce que lorsque vous cliquez sur la mise au point sur la mise au point.


@Adam: Cela fonctionnerait si je savais certainement que c'était un comportement standard du navigateur. Est-ce? @ajm: Cela ne le résoudrait pas ... La fonction serait appelée deux fois.


Désolé gars, pensait en termes d'une seule fonction en appelant une autre. Un accent serait effectivement présupposera un clic sur l'élément ou quelque chose comme un onglet, en fonction du type d'élément avec lequel vous travaillez. Quel type d'élément (s) en $ mytrigger?


@ajm ... de bonnes questions. J'ai mis à jour mon article pour peut-être poser les meilleures questions.


6 Réponses :


0
votes

J'ai couru dans un problème similaire au dos. Je résolu en répondant au premier événement et en ignorant les événements pour les prochaines 20ms.

Essayez quelque chose comme ceci: xxx


2 commentaires

Je ne dirais pas que c'est tellement une solution que c'est un hack moche autour de la question.


Ouais. C'est un hack. Ne peut pas discuter là-bas. Mais dans mon cas, c'était la solution .



0
votes

Vous ne pouvez utiliser que la méthode Focus () et lire cet article sur les types d'événements (E) sur JavaScript: http://www.quirksmode.org/js/events_properties.html

Pour détecter quel événement vous avez avec votre souris ou votre clavier (pour le tester), U peut utiliser: xxx


4 commentaires

Je suppose que ma question est vraiment "se concentre toujours sur un clic?"


@DA - Ouais, parce que lorsque vous cliquez sur l'élément que vous activez également, c'est aussi votre concentration depuis votre citation dans cet élément. :)


Eh bien, j'ai fait un test et cela ne semble pas être le cas. Vous ne pouvez pas donner à un événement de mise au point divis, par exemple, puis cliquez dessus et faites cuire cet événement. Il semble que cela ne soit que vrais pour les éléments "concentrables".


Vous avez raison. Mais tous les éléments peuvent devenir «sensibles» dans HTML5: il vous suffit d'ajouter une propriété «Tabindex» à votre élément. Comme on le voit dans le brouillon W3C Aria: w3.org/wai/pf/aria-practices . (Je sais que c'est un vieux sujet mais Google m'a envoyé ici en 2013!)



0
votes

Pour empêcher la mise au point d'être appelée deux fois définir une variable pour indiquer si l'élément a la focalisation.

$(#myTrigger).click( function(){ if(!hasFocus){$(#myTrigger).focus()}});


1 commentaires

Bon point. Vous devrez définir une variable pour voir si elle se concentre encore.



12
votes

jQuery a un functon intégré pour cela qui n'est pas utilisé tout ce qui s'appelait souvent .. CODE>

$mytrigger.one('click focus', function() { alert("event"); });


2 commentaires

Cela appelle-t-il "l'un de ces deux événements une fois" ou appelle-t-il "chacun de ces événements une fois"? La documentation ne dit pas. (Évidemment, je peux essayer un testament dès que je peux ...)


Dans la documentation, il est indiqué que, dans le cas de plusieurs événements, elle sera appelée une fois pour chaque type d'événement.



6
votes

Pour déclencher Cliquez sur () pour la mise au point de l'onglet (et évitez de cliquer sur () à partir de l'être déclenché deux fois lorsque la mise au point provient d'un clic de souris), j'ai procédé à ce qui suit:

$('#item').mousedown(function(){
    $(this).data("mouseDown", true);
});

$('#item').mouseup(function(){
    $(this).removeData("mouseDown");
});

$('#item').focus(function(){
    if (!$(this).data("mouseDown"))
        $(this).click();
});


0 commentaires

1
votes

Une autre option est la suivante:

$myTrigger
    .mousedown(function(e) {
        e.preventDefault();  // don't grab focus
    })
    .click(function(e) {
         alert('click');
    })
    .focus(function(e) {
         alert('focus');
         $(this).click()
    });


0 commentaires