在 dom 更改后处理东西
Handle stuff after dom changes
我有一个页面,里面有一些Javascript/jQuery的东西,例如:
(function()
{
$('.tip').tooltip();
$('.test').click(function()
{
alert('Clicked!')
});
}();
在页面上,我用jQuery插入了一些HTML,所以DOM会改变。例如,我插入一个带有类"tip"或"test"的额外元素。刚刚插入的元素不起作用,因为jQuery正在使用非操作的DOM,而刚刚插入的元素不存在。所以我四处搜索并找到了这个"点击"的解决方案:
$('body').on('click','.click',function()
{
alert('Clicked!')
});
我不明白为什么,但通过这种方式,它可以与纵的 DOM 一起工作,而 jQuery 的东西可以处理新插入的元素。所以我的第一个问题是,为什么这有效,而只有 click(( 函数不起作用?第二个问题,为什么我必须指向"身体"?
最后,我的第三个问题是,如何使用工具提示完成此操作?
我知道有很多关于这个主题的信息(以前我读过的委托((和live((函数(,但我找不到关于它的解释。我无法用我找到的信息解决我的第三个问题。
我期待您的回复!
额外问题:
4(在这种情况下,是否建议始终指向"身体"?它总是在那里,但对于可能的性能问题?
所以我的第一个问题是,为什么这有效,只是 click(( 功能不是吗?
因为事件处理程序现在委托给父元素,所以即使在替换/操作子元素之后它仍然存在。
关于事件委托的古老文章供您阅读 - 但概念保持不变:
- http://www.sitepoint.com/javascript-event-delegation-is-easier-than-you-think/
第二个问题,为什么非要指向"身体">
你没有,任何合适的父元素都可以。例如,任何不会被替换的直接父级(例如div 包装器(。
最后,我的第三个问题是,如何使用工具提示完成此操作?
您需要在新插入的元素上重新初始化工具提示插件。例如:
$.get("foo.html", function (html) {
$("#someDiv").html(html);
$("#someDiv").find(".tip").tooltip();
});
操作 DOM 时,click()
事件不起作用,因为 JQuery 没有监视 DOM 更改。 绑定 click()
事件时,它将选择当时页面上的元素。 除非显式绑定事件,否则新事件不在列表中。
因为你已经把click()
事件指向了身体。 然后,JQuery 检查单击的目标是否与任何事件处理程序(如您创建的事件处理程序(匹配,与单击的元素匹配。 这样,任何新元素都将使事件与它们"关联"。
由于工具提示不是可以放置在正文上的事件,因此需要在创建元素时重新初始化它。
编辑:
对于你的第四个问题,是不是要看情况。 绑定到主体的优点是不会意外地将事件多次绑定到元素。 缺点是要添加需要检查每个事件的事件处理程序,这可能会导致性能问题。
至于您对 DRY 的担忧,请将工具提示的初始化放入一个函数中,并在添加它们时调用它。 在这方面,试图避免使用相同的函数调用有点矫枉过正,IMO。
事件绑定到要绑定到的特定对象。
因此,像$('.tip').tooltip()
这样的东西将在$('.tip')
上执行tooltip((功能,实际上这只是满足css选择器.tip
的对象集合。你应该注意的是,该集合不是动态的,它基本上是当前页面的"数据库"查询,并返回由jQuery包装的HTML DOM对象的结果集。
因此,在该集合上调用 tooptip(( 将仅对该集合中的对象执行工具提示功能,调用工具提示时不在该集合中的任何内容都将不具有工具提示功能。因此,在tooltip()
调用后添加满足.tip
选择器的元素不会为其提供工具提示功能。
现在,$('body').on('click','.click', func)
实际上是将点击事件绑定到 body
标签(:P应该始终存在(,但发生的情况是它捕获点击事件是否通过目标 css 选择器的元素(在这种情况下.click
(,因此由于检查是动态完成的,因此将捕获新元素。
这是对正在发生的事情的相对简短的总结......我希望它有所帮助
更新:工具提示的最佳方法是在添加元素后绑定工具提示,例如
$('#container').load('www.example.com/stuff', function() {
$('.tip', $(this)).tooltip();
});
- 使用 ajax 更改光滑轮播的 html 后,DOM 不会更新
- node.js-express.js API删除http后处理程序
- 如何在 jQuery DataTable 中对列值进行后处理
- 如何在声明后运行DOM添加的指令
- 提交表单javascript后处理完整事件
- 删除属性后刷新DOM,而不象chrome那样刷新页面
- JQuery 在渲染后搜索 dom 元素,并用其相应的值替换键
- 处理 DOM 元素,寻找下一个类
- 使用查询获取修改后的 dom 内容
- 语义 UI 模态导致我的元素在关闭后从 DOM 中消失
- 如何在 AngularJS 中同时处理 DOM 操作和状态更改
- 如何在上一次 JQuery 调用后访问 DOM
- 对挖空.JS输入值进行后处理
- 在 ajax 加载后刷新 DOM 元素
- AJAX调用后访问DOM对象
- 如何处理DOM和Controller之间的交互
- Rails+Ajax:如何在点击一个元素后处理JS代码
- Selenium page_source不返回修改后的DOM树
- 在redux状态改变后处理不纯的DOM操作
- 在 dom 更改后处理东西