【发布时间】:2011-12-30 23:50:32
【问题描述】:
我有几个在 ajax 调用后动态添加的文本框。这些框与当前工作正常的 .live() 事件处理程序相关联。我想用更新的 .on() 函数替换它。
这就是我所拥有的
$('.MyTextBox').live({
mouseenter: function () { .... },
mouseleave: function () { .... },
blur: function () { ... }
});
当我用 .on() 替换 .live() 时,它不起作用;添加后,文本框不会显示其正常行为。
如果我写 $('#MainDiv .MyTextBox').live({... ,其中 MainDiv 是所有操作发生的顶部 DOM 元素,那么也不会发生任何事情。
我错过了什么?
谢谢
【问题讨论】:
-
你怎么写.on()?因为它应该可以工作,但我真的很讨厌它的语法,很难判断它是否是委托。
-
@Matt:
.live()和.delegate做同样的基本事情(事件委托,通过在事件冒泡时测试事件目标)。不同之处在于.live()在文档级别一直捕获事件,而.delegate()将在您指定的任何位置捕获它们(即更近,更好)。所以,.on()等价于.live()是$(document).on('event', '#selector .you > would've ~ used [with=live]', fn)。否则,.on()的工作方式类似于.bind()或.delegate(),具体取决于您是否提供选择器作为第二个参数。 -
@DaveWard .on() 与 .live() 完全不同,试试吧。据我所知,它只是在加载 DOM 时将事件处理程序附加到元素,因此与 .live() 不同,它不会在 DOM 已经加载后将处理程序附加到加载的节点。如果添加第二个选择器,它会将其视为 .delegate(),这与 live 完全不同。
-
@Matt:这里的误解可能是
.live()在将元素添加到 DOM 时不会附加新的处理程序。当您编写类似$('.targets').live('click', fn)的内容时,实际发生的是jQuery 开始监视冒泡到文档对象的点击事件,检查它们的eventTarget 是否与.targets匹配,如果匹配则执行您的函数。它使用与.delegate()完全相同的方法,但在更接近它们发生的位置捕获冒泡事件的灵活性较低。使用$(document).on('click', '.targets', fn)做同样的事情。 -
@DaveWard 哦,好的,知道了。是的,这很有意义。
标签: jquery