2013-05-14 47 views
9

jQuery提供了一個isTrigger屬性,它允許我們知道事件是「真實事件」還是隻是「觸發」。jQuery觸發器事件,但仍然event.isTrigger假

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

對於單元測試的目的,是有辦法trigger一個事件,並以某種方式覆蓋isTrigger屬性..並在事件回調仍表現(具有isTrigger === false),就好像它是一個真正的單擊事件。 。 試圖下面的代碼:

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

,但它似乎並沒有正確地傳遞..

回答

5

怎麼樣原生的方式,避免了jQuery isTrigger乾脆:

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

要使用它,你只是做:

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

如果你關心的事件是否是由用戶或代碼觸發,也許你應該提取一個方法並直接調用該方法。然後,您可以添加userTriggered參數並傳遞true或false。

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

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

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

然後當你測試你的doWork方法,你可以在userTriggered爲真或假傳遞到測試所需的行爲。這也消除了瀏覽器行爲與測試的依賴關係,這是一件好事。

+0

總的來說這是一個不錯的主意,但爲什麼在只是用於測試模塊化的代碼,如果它能夠以更好的方式來完成這個唯一的目的.. – adardesign 2013-05-19 15:29:29

+1

我會爭辯說這種方法比模擬用戶點擊更清晰。這消除了不必要的事件處理程序觸發,並允許您直接調用所需的功能。它不僅可能更高效,而且更易於閱讀。 – cadrell0 2013-05-20 13:21:54

+0

我聽到你!不管怎麼說,還是要謝謝你! – adardesign 2013-05-20 14:36:37

1

@ adeneo的回答給我的錯誤。(遺漏的類型錯誤:未能執行「initMouseEvent」上'MouseEvent的:參數4類型是「窗口」的沒有)

這種方法很適合我(雖然isTriggered是不確定,沒有虛假)

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