【发布时间】:2016-08-10 06:01:02
【问题描述】:
我正在使用流星 1.3,我必须将“网络模板”集成到我的流星应用程序中,这个“网络模板”有一个 custom.js 文件,其中包含 j 个查询事件,但在集成“网络模板”之后,js文件中的那些事件只运行一次,有没有办法解决这个问题,这个js文件包含很多行,将事件移动到我的“流星模板事件”中会非常复杂。 谢谢
【问题讨论】:
我正在使用流星 1.3,我必须将“网络模板”集成到我的流星应用程序中,这个“网络模板”有一个 custom.js 文件,其中包含 j 个查询事件,但在集成“网络模板”之后,js文件中的那些事件只运行一次,有没有办法解决这个问题,这个js文件包含很多行,将事件移动到我的“流星模板事件”中会非常复杂。 谢谢
【问题讨论】:
问题是事件直接绑定到模板内的 DOM 元素,当流星改变 DOM 元素时,绑定丢失。
你要做的就是使用委托事件,这是通过使用jquery .on()来完成的。
您需要做的是处理固定 DOM 元素中的事件,即您的“更改 HTML”父元素。当该元素内部发生事件时,该事件“冒泡”到处理它的固定 DOM 元素。该事件携带有关启动它的 DOM 元素的信息,因此 on 订阅可以调用正确的处理程序。
注意$('#fixedElement').on(event, selector, handler) 指定:
因此,您可以指定在哪个元素上处理哪个事件,使用哪个处理程序。这将在流星修改 DOM 后起作用。
例如,如果你有这个:
$('#btnOk').click(function() { alert('Clicked OK!`); });
你必须把它改成这样:
$('#container').on('click', '#btnOk', function() { alert('Clicked OK!`); });
这样,只要有一个 ID 为“#btnOk”且位于“#cotnainer”内的 DOM 元素,处理程序就会被执行,而不管该对象是事先存在的还是动态创建的。
当然,您必须确保#container 元素存在,并且没有被任何其他东西替换。为此,您可能必须遍历 DOM 树,例如使用 jQuery .parent()。
【讨论】: