JavaScript自定义点击事件

JavaScript自定义点击事件,javascript,jquery,events,Javascript,Jquery,Events,我想创建一个自定义事件,比如点击,它既可以用于鼠标点击,也可以用于触摸点击元素,所以它可以像任何其他事件一样被附加。现在,我创建了一个mousedown/touchtstart/pointerdown处理程序的函数,并将实际的处理程序传递给数据对象,它可以工作,但并不优雅。这是: var tap = function(e) { var handler=e.data.handler; //handler is passed in data object var eventType=e.

我想创建一个自定义事件,比如点击,它既可以用于鼠标点击,也可以用于触摸点击元素,所以它可以像任何其他事件一样被附加。现在,我创建了一个mousedown/touchtstart/pointerdown处理程序的函数,并将实际的处理程序传递给数据对象,它可以工作,但并不优雅。这是:

var tap = function(e) {

  var handler=e.data.handler; //handler is passed in data object

  var eventType=e.originalEvent.type.replace('down','').replace('start',''); //touch, mouse or pointer
  var inputDevice=((eventType === 'pointer' && e.originalEvent.pointerType === 'mouse') || eventType === 'mouse') ? 'mouse' : 'touch';
  var endEvent=(eventType === 'touch') ? eventType+'end' : eventType+'up';
  var targetElement=this;

  e.preventDefault();

  $(document).on(endEvent+'.customTap', function(e) {

    var x,y;

    if (eventType === 'touch') {
        x=e.originalEvent.changedTouches[0].clientX;
        y=e.originalEvent.changedTouches[0].clientY;
    }
    else {
        x=e.clientX;
        y=e.clientY;
    }

    //this won't work, if the element has children, to do: iterate over parent elements
    if (document.elementFromPoint(x,y).isSameNode(targetElement)) handler(e); //execute the actual handler

    $(document).off(endEvent+'.customTap');
    e.preventDefault();

  });
}

var attachCustomTap = function($element, handler) {

    var startEvent;
    if (window.PointerEvent) startEvent='pointerdown';
    else startEvent='touchstart mousedown';

    $element.on(startEvent, { handler: handler }, tap);

}
所以我的问题是,有没有可能使用这样的方法:

$('button').on('customTap', doSomething);
而不是

attachCustomTap($('button'), doSomething);

我读过,但我看不出这对我有什么帮助,使用这种技术,我仍然需要为pointerdown/touchstart附加处理程序来触发我的自定义事件。我的问题更像是在用.on()附加处理程序时是否可以调用attachCustomTap函数。我想我将创建一个jQuery插件,并像$('button')那样调用它。customTap()想想看:您的自定义事件现在不存在。您可以在上使用
,让它监听您想要的任何事件,但除非您先创建事件,否则您的事件永远不会被触发。