2013-05-14 19 views
9

jQuery zapewnia właściwość isTrigger, która pozwala nam sprawdzić, czy wydarzenie było "prawdziwym zdarzeniem", czy zostało tylko "wyzwolone".Zdarzenie jQuery Trigger, ale nadal występuje event.isTrigger false

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

Dla celów testowania jednostek, czy jest jakiś sposób aby trigger wydarzenie i jakoś zastąpić własność isTrigger .. aw przypadku oddzwaniania nadal zachowują (poprzez isTrigger === false), tak jakby to było prawdziwe zdarzenia kliknięcia. . próbował następujący kod:

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

ale nie wydaje się, aby przekazać je poprawnie ..

Odpowiedz

5

Jak o natywnej sposób, unikając jQuery isTrigger sumie:

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 
    } 
} 

Aby go użyć po prostu chcesz zrobić:

$(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

1

Jeśli chodzi o to, czy zdarzenie było wyzwalane przez użytkownika lub za pomocą kodu, być może powinieneś wyodrębnij metodę i wywołaj tę metodę bezpośrednio. Następnie możesz dodać parametr userTriggered i podać true lub false.

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

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

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

Wtedy, kiedy przetestować metodę DoWork, można przekazać w userTriggered jako prawdziwą lub fałszywą przetestować pożądanego zachowania. Eliminuje to również zależność zachowania przeglądarki od testu, co jest dobrą rzeczą.

+0

ogólnie jest to dobry pomysł, ale dlaczego na zmodularyzowanie kod tylko do testów, jeśli można to zrobić w lepszy sposób dla tego jedynego celu .. – adardesign

+1

I twierdził, że ta metoda jest bardziej przejrzysta niż symulacja kliknięcia użytkownika. Spowoduje to usunięcie niepotrzebnego wyzwalania funkcji obsługi zdarzenia i umożliwi bezpośrednie wywołanie wymaganej funkcjonalności. Nie tylko jest to prawdopodobnie bardziej wydajne, ale łatwiejsze do odczytania. – cadrell0

+0

Słyszę Cię! Dzięki i tak! – adardesign

1

@ odpowiedź adeneo dał mi błędy. (Uncaught TypeError: nie można wykonać 'initMouseEvent' na 'MouseEvent':. Parametr 4 nie jest typu 'okno')

Metoda ta pracował dla mnie (chociaż isTriggered jest niezdefiniowany, nie fałszywy)

$('#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>

Powiązane problemy