2011-09-21 45 views
3

多个选择与代表使用与用于执行以下操作:如何使用jQuery对象作为参数委托方法

$(contextElement).delegate('selector1, selector2' , 'eventName', function(){ //blabla }); 

在管理DOM元素变得至关重要较大的项目,存储被绑定到变量中的元素窗户对象成为一种有吸引力的工作方式。

但是我不能加入与使用的委托方法多选择这种工作方式:

window.someControl = { 
    contextElement = $('selector0'), 
    DOMasProperty1 = $('selector1'), 
    DOMasProperty2 = $('selector2') 
} 

someControl.contextElement.delegate(
'you magic answer for using DOMasProperty1 
and DOMasProperty2', 
'click', 
function(){ 

    //blabla 

}); 

注:我知道选择为的字符串值反对它的jQuery对象可以存储在someControl对象中。然而,我存储jQuery对象以提高代码的性能,并且一次又一次地调用字符串值将使这种工作方式与简单地使用方法的选择器名称不同。

我需要一个答案以某种方式使用委托的具有减少DOM结合查找

+1

@Rocket:这有什么错一点点幽默? :)参考你的编辑,删除“Thanks 256k” – XGreen

回答

2

jQuery的对象都有一个.selector属性,会参考你原来的选择。

someControl.contextElement.delegate(
    window.someControl.DOMasProperty1.selector + ',' + 
    window.someControl.DOMasProperty2.selector, 
    'click', 
    function(){ 

      //blabla 

    }); 

注意,它会为工作:

DOMasProperty1 = $('selector1'), 

...但可能不是如果包括DOM遍历方法,如:

DOMasProperty1 = $('selector1').parent(), 
+0

谢谢帕特里克dw,我必须评论同样的事情,就像我为Sidnicious所做的一样。它看起来非常好,并感谢我教这个选择器方法(对未来有用),但这种方式可以使DOM查找再次回到代码中。我需要他们都是一次又分开。 – XGreen

+1

@XGreen:不,它不会执行更多的DOM查找。但是如果你打算使用'.delegate()',那么因为它完全是基于选择器的事件委托,所以它依赖于一个选择器在接收事件的上下文中运行元素。你不能用元素或jQuery对象来做到这一点。为此,您需要将自己的事件委托方法放在一起,以便与元素进行比较。 – user113716

1

我不完全清楚你的问题,但我会做这样的事情:

window.someControl = { 
    contextElement: $('selector0'), 
    selectors: ['selector1', 'selector2'] 
} 

someControl.contextElement.delegate(someControl.selectors.join(','), 'click', function(){ 
    // … 
}); 

请注意,创建对象JavaScript的语法如下所示:

{ 
    key: value 
} 

这样的:

{ 
    key = value 
} 
+0

你的回答非常好,但你会发现,将jQuery对象存储为属性值的根本原因是通过jQuery减少了DOM查找的数量。因此,如果我开始只存储选择器的字符串值,那么它就会失败它为什么不能提高性能的目的。 – XGreen

+0

@XGreen:实际上,为'.delegate()'选择器创建jQuery对象不会给你任何*性能增益 - 每次'contextElement'内发生'click'时,'.delegate()'测试点击选择器(作为字符串)。它永远不会使用你预先创建的jQuery对象(除了'contextElement')。 – s4y

+0

我想我可以缓存在一个全球范围的对象。通过定义一个带有jQuery结果的全局容器,所以我可以从其他函数中引用它们来减少查找 – XGreen

相关问题