我正在使用xui js作为移动web应用程序。Xui js不支持像jquery $("#selector").live()那样的实时事件。我想在jquery live上写一些东西。
jquery如何处理事件委托?
谢谢您抽时间见我
Mac
发布于 2011-07-27 16:54:52
您可以只在document上设置事件处理(如live所做的),或者更好地找到要处理的元素的父元素并绑定到该父元素(如delegate所做的)。
这是一个用来模拟jquery的delegate函数的插件。
xui.extend({
is: function (selector) {
var matchedNodes = x$(selector), i=0;
for (i; i<matchedNodes.length; i++)
if (this[0] == matchedNodes[i]) return true;
return false;
},
delegate: function(selector, event, handler){
this.on(event, function(evt){
var elem = evt.target;
if ( x$(elem).is(selector) ){
handler.apply(x$(elem), arguments);
}
});
}
});使用
x$('ul').delegate('li','click', function(){ this.attr('style','color:red'); });这将把一个侦听器绑定到ul元素,后者将处理由其后代li元素发起的click事件。(它会将单击的元素颜色更改为红色)
在http://jsfiddle.net/gaby/vhsPU/上演示
发布于 2011-10-02 07:18:40
为了扩展Gaby的答案..。
我还需要查看是否单击了紧邻的子对象。这可以进一步扩展,像我们在jQuery中一样拥有更多真正的委托。然而,这段代码满足了我的需求。
xui.extend({
is: function (selector) {
var matchedNodes = x$(selector), i=0;
for (i; i<matchedNodes.length; i++)
if (this[0] == matchedNodes[i]) return true;
return false;
},
delegate: function(selector, event, handler){
this.on(event, function(evt){
var elem = evt.target;
if ( x$(elem).is(selector) ){
handler.apply(x$(elem), arguments);
} else{
if ( x$(elem.parentElement).is(selector) ){
handler.apply(x$(elem.parentElement), arguments);
}
}
});
}
});发布于 2011-07-27 16:48:44
作为每个事件委托系统,它利用了浏览器事件“自下而上”冒泡的事实。也就是说,如果我们有一个像这样的结构
<body>
<div>
<span>foobar 1</span>
<span>foobar 2</span>
<span>foobar 3</span>
</div>
</body>当有人单击内部foobar跨度时,浏览器会检查是否有任何事件处理程序绑定到该单击事件的跨度。如果是这样的话,执行它们。现在,事件“冒泡”到它的父级(div)。同样,浏览器检查是否有任何单击事件处理程序绑定到它,如果绑定,则执行,依此类推,直到document.documentElement。
在上面的示例中,我们需要为每个<span>元素绑定三个事件处理程序。了解了上述概念后,我们现在只需将一个事件处理程序绑定到<div>父节点,并在event object中检查target。该目标始终是事件发生的原始元素。
还有几件事要知道。您可以停止事件的传播,例如,显式地不允许事件进一步冒泡。这可以通过调用.stopPropagation()来完成,这是来自事件对象的方法。
https://stackoverflow.com/questions/6841580
复制相似问题