9

jQuery provides a isTrigger property which allows us to know if the event was a "real event" or was it only "triggered".

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

For unit-testing purposes, is there a way to trigger a event and somehow overwrite the isTrigger property.. and in the event callback still behave (by having isTrigger === false) as if it was a real click event.. Was trying the following code:

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

but it doesn't seem to pass it correctly..

4

3 に答える 3

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);

フィドル

于 2013-05-14T15:52:20.250 に答える
1

イベントがユーザーによってトリガーされたのか、コードによってトリガーされたのかが気になる場合は、おそらくメソッドを抽出して、そのメソッドを直接呼び出す必要があります。その後、パラメーターを追加して、userTriggeredtrue または false を渡すことができます。

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

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

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

その後、doWork メソッドをテストするときにuserTriggered、true または false として渡して、目的の動作をテストできます。これにより、テストからブラウザーの動作の依存関係も排除されます。これは良いことです。

于 2013-05-14T16:01:46.433 に答える