【问题标题】:How to use jQuery objects as parameters for the delegate method如何使用 jQuery 对象作为委托方法的参数
【发布时间】:2011-09-21 18:52:48
【问题描述】:

多个选择器与委托一起使用,使用如下:

$(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 查找结合起来

【问题讨论】:

  • @Rocket:有点幽默有什么问题? :) 参考您的编辑,删除“Thanks 256k”

标签: javascript jquery events dom selector


【解决方案1】:

jQuery 对象有一个 .selector 属性,它将引用您的原始选择器。

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

          //blabla 

    });

请注意,它适用于:

DOMasProperty1 = $('selector1'),

...但如果您包含 DOM 遍历方法,则可能不会:

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

【讨论】:

  • 谢谢 patrick dw,我必须评论一下我为 Sidncious 所做的事情。它看起来非常好,感谢你教我这个选择器方法(对未来很有用),但是这样你就可以在代码中再次带回 DOM 查找。我需要他们一次又一次地分开。
  • @XGreen:不,它不会再执行任何 DOM 查找。但是如果你要使用.delegate(),那么由于它完全是基于选择器的事件委托,它依赖于选择器来针对接收到事件的上下文中的元素运行。您不能使用元素或 jQuery 对象来做到这一点。为此,您需要组合自己的事件委托方法来与元素进行比较。
【解决方案2】:

我不是完全清楚你的问题,但我可能会这样做:

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

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

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

{
    key: value
}

不是这样的:

{
    key = value
}

【讨论】:

  • 您的回答非常好,但您知道,将 jQuery 对象存储为属性值的根本原因是为了减少 jQuery 查找 DOM 的次数。因此,如果我开始只存储选择器的字符串值,那么它就违背了为什么这样做的目的,因为它不会提高性能。
  • @XGreen:实际上,为 .delegate() 选择器创建 jQuery 对象不会给您带来任何的性能提升——每次 click 发生在 contextElement 中时,@ 987654327@ 针对选择器(作为字符串)测试点击的目标。它永远不会使用您预先创建的 jQuery 对象(contextElement 除外)。
  • 我以为我可以将它缓存在具有全局范围的对象中。通过使用 jQuery 结果定义一个全局容器,这样我就可以从其他函数中引用它们以减少查找
  • 为只用于.delegate() 的选择器创建jQuery 对象实际上更慢,因为.delegate() 从不查找它们。相反,它每次触发事件时针对事件的目标元素(及其父元素)测试它们。这就是为什么它只需要一个字符串,而不是一组元素或一个 jQuery 对象。如果您想在其他 jQuery 函数中使用 DOMasProperty1DOMasProperty1,请随意缓存它们,但您必须传递 .delegate() 一个选择器。
  • P.S.这也是为什么 .delegate() 即使在您调用它后将匹配的元素添加到文档中也能正常工作的原因。它不依赖于预先评估/缓存选择器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多