9 votes

jQuery déclenche un événement, mais event.isTrigger reste faux

JQuery fournit un isTrigger qui nous permet de savoir si l'événement était un "événement réel" ou s'il était seulement "déclenché".

$(ele).on("click", function(e){
    if(e.isTrigger){
       // this event was only triggered, not a real event 
    }else{
      // this was a real event 
    }
}) 

À des fins de test unitaire, existe-t-il un moyen de trigger un événement et écraser en quelque sorte le isTrigger et dans le callback de l'événement se comporte toujours (en ayant isTrigger === false ) comme s'il s'agissait d'un véritable événement de clic.. J'ai essayé le code suivant :

var triggerClick = jQuery.Event("click", {
    isTrigger:false,
    data:{
        isTrigger:false
    }

mais il ne semble pas le passer correctement

5voto

adeneo Points 135949

Pourquoi ne pas utiliser la méthode native, en évitant complètement le déclencheur isTrigger de jQuery ?

function simulateClick(elem) {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, elem,
          0, 0, 0, 0, 0, false, false, false, false, 0, null);
  if (document.createEvent) {
     elem.dispatchEvent(evt);
  } else {
     elem.fireEvent("on" + evt.eventType, evt); // support for IE crap
  }
}

Pour l'utiliser, il suffit de faire :

$(ele).on("click", function(e){
    if(e.isTrigger){
       // this event was only triggered, not a real event 
       console.log('triggered');
    }else{
       // this was a real event 
       console.log('clicked');
    }
});

simulateClick(ele);

FIDDLE

1voto

cadrell0 Points 9152

Si vous vous préoccupez de savoir si un événement a été déclenché par l'utilisateur ou par le code, vous devriez peut-être extraire une méthode et appeler cette méthode directement. Vous pouvez ensuite ajouter un userTriggered et passer le paramètre true ou false.

$(ele).on("click", function(e){
    doWork($(this), e, true);
}

doWork($(ele), null, false);

function doWork(item, e, userTriggered)
{
    if(userTriggered) {
    }
    else {
    }
}

Ensuite, quand vous testez votre méthode doWork, vous pouvez passer dans userTriggered comme vrai ou faux pour tester le comportement souhaité. Cela élimine également la dépendance du comportement du navigateur de votre test, ce qui est une bonne chose.

1voto

pythagoras1357 Points 21

La réponse de @adeneo m'a donné des erreurs (Uncaught TypeError : Failed to execute 'initMouseEvent' on 'MouseEvent' : parameter 4 is not of type 'Window'.)

Cette méthode a fonctionné pour moi (bien que isTriggered soit indéfini, et non faux)

$('#myBtn').on('click', function(e){
  alert('isTrigger: ' + e.isTrigger)
});

 var event = new Event('click');
$( "#myBtn" )[0].dispatchEvent(event);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#" id="myBtn">dude</a>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X