2012-05-17 75 views
0

我已经为jQuery编写了一系列插件,它们实际上充当移动浏览器的事件。你可以在这里看到它们>http://ben-major.co.uk/2011/11/jquery-mobile-events/在jQuery中触发用于live的自定义事件()

目前,他们被称为$(ele).tap(handler)等等,但我想添加功能来引发自定义事件,以便可以使用像$(ele).on('tap', handler);这样的东西来利用函数。

我使用下面的代码的权利,但这似乎并没有工作:

$(function() { 
    $('*').tapstart(function() { $(this).trigger('tapstart'); }) 
      .tapend(function() { $(this).trigger('tapend'); }) 
      .tap(function() { $(this).trigger('tap'); }) 
      .doubletap(function() { $(this).trigger('doubletap'); }) 
      .taphold(function() { $(this).trigger('taphold'); }) 
      .swipedown(function() { $(this).trigger('swipedown'); }) 
      .swipeup(function() { $(this).trigger('swipeup'); }) 
      .swipeleft(function() { $(this).trigger('swipeleft'); }) 
      .swiperight(function() { $(this).trigger('swiperight'); }); 
}); 

这里有一个jsFiddle来证明我的问题。很明显,点击第二个div应该模仿第一个的动作,但是因为在解析上面给出的绑定之后它被添加到DOM,所以它不会。

我想我的问题是:什么是实现我想要的最好方法?有没有办法选择DOM中现在和将来存在的所有元素(如果可能,我宁愿不使用类似livequery或外部插件的东西)。

回答

1

在你的情况,我不认为jQuery会正确处理你的自定义事件(因为自定义事件不会冒泡到文档中)。答案是将事件侦听器的一个分支绑定到document。并且不要在这种情况下使用jQuery。 jQuery的实时模式几乎和我的建议一样,但它会尝试将event.target与绑定选择器(在你的问题中说'*')相匹配,这是非常慢的手机)。

如果你想与特定的类型或某个className的元素进行交互,只需通过你自己处理它,然后触发所需的事件处理程序。

一个例子:

function findAncestorOfType(el, type) { 
    while (el && !(el instanceof type)) 
    el = el.parent; 
    return el; 
} 

document.addEventListener('click', function(evt) { 
    var target = findAncestorOfType(evt.target, LIElement); 
    if (target) { 
    // distinguish event type 
    type = 'click'; 
    callbacks[type](target, evt); 
    } 
}, false); 
+0

我结束了重写基于一些对你评论的事件库。你是对的 - 使用jQuery'*'选择器对于移动设备来说是一个不好的判断。 – BenM