【问题标题】:jQuery Geniuses - Init Plugins and Event DelegationjQuery Geniuses - 初始化插件和事件委托
【发布时间】:2013-09-27 00:20:15
【问题描述】:

朋友们,

而不是手动初始化每个实例:

$("#MyChildId1").find("ul.sf-menu").superfish({ delay: 100, speed: 'fast' });
$("#MyChildId2").find("ul.sf-menu").superfish({ delay: 100, speed: 'fast' });
$("#MyChildId3").find("ul.sf-menu").superfish({ delay: 100, speed: 'fast' });

我想使用 jQuery 插件(Superfish)的多个(和动态)实例,并使用事件委托对父级进行一次调用来初始化它们:

$("#MyParentId").find("ul.sf-menu").superfish({ delay: 100, speed: 'fast' });

但这不起作用,即使文档说它现在在以下位置使用事件委托: http://users.tpg.com.au/j_birch/plugins/superfish/

最后一个项目: “•使用 v1.5.1 版本的事件委托以获得更高的性能和灵活性。”

任何 jQuery Geniuses 都知道发生了什么?

【问题讨论】:

  • 除非插件使用return this.each(... 之类的东西来迭代传递的元素集合,否则您只能在一个元素上使用它(这很糟糕,插件就是这样)。
  • 它应该可以工作......从我在插件中看到的内容
  • 是的,插件在 init 中有 this.each(... 但是当我尝试 $("#MyParentId").find("ul.sf-menu").. .孩子们不能调用 show() 方法。也许是因为 ($el).data('sf-options') 被设置在父母身上,而不是孩子们所以他们不能调用 show()方法。Doh。
  • 如果它在 init 中使用 this.each(...,当你动态插入新的孩子时会发生什么?他们还会冒泡吗?
  • 我可以确认,他们没有。您只会得到 init 中连接的内容:this.each( 在页面加载时。动态添加的任何子项都会丢失 init 连接。

标签: jquery superfish event-delegation


【解决方案1】:

您可以选择所有菜单,然后循环访问它们以启动它们。

$("#MyParentId").find("ul.sf-menu").each(function () {
    $(this).superfish({ delay: 100, speed: 'fast' });
});

.each() 的文档:http://api.jquery.com/each

你也可以使用:

例如:

var $menus = $("#MyParentId").find("ul.sf-menu");
for (var i = 0, l = $menus.length; i < l; i++) {
    $menus.eq(i).superfish({ delay: 100, speed: 'fast' });
}

for 循环的运行速度比 jQuery .each() 循环稍快,我相信这主要是因为.each() 循环为每次迭代创建了一个 IIFE(例如 for (...) { (function () {...})(); })。

【讨论】:

  • 是否可以通过事件委托来实现?我将通过淘汰更新我的视图模型来动态添加一些。想知道插件是否真的支持事件委托。出于某种原因,我什至没有在插件中看到对委托的引用,更不用说使用它的示例了,但他们特别说它现在使用事件委托。我一定是错过了什么。
  • 查看 superfish.js 的第 64、65 和 75-77 行,它使用了.on()。这就是事件委托。
  • 我不熟悉 .on()... 当我想到事件委托时,我使用 $("#MyParentId").delegate(".child-class", "click" , function(e) {... 我实际上不确定插件 init 中的 this.each 是否会连接动态插入的子级。
  • 不是。 init: this.each(function 是整个问题。它仅在加载页面时初始化它找到的项目。事件委托通常允许在页面加载后动态添加子项冒泡。有没有人知道如何获得jQuery 插件支持通过事件委托在父节点上初始化插件?我之前也想为其他 jQuery 插件解决这个问题。
  • @user2378631 我想你可能误解了插件作者所说的委托事件是什么意思。这很可能意味着插件的所有事件处理程序都绑定到单个元素而不是特定元素。这使人们更容易自定义插件,并且插件应该更快地初始化。您要做的是动态初始化插件的新实例。有关在将 HTML 添加到 DOM 时如何初始化插件的示例,请参阅我的答案:stackoverflow.com/questions/9610267/…
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 2013-11-17
  • 2013-02-16
  • 2016-02-17
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多