在每个 turbolinks page:load 中使用 jQuery 的委托事件 on()
using jQuery's delegated event on() within every turbolinks page:load
我的 rails 应用程序中有此代码:
$(document).ready( function() {
myCustomFunction("#link-selector");
}
function myCustomFunction(linkCssSelector){
// some stuff...
$(document).on('click', linkCssSelector, function(){
// ...some other stuff...
});
}
click
事件处理已委托给 文档 ,但现在我必须将 Turbolinks 添加到我的应用程序.
然后,我将使用 ready()
函数并执行以下操作(基于我的搜索):
$(document).on("ready page:load", function() {
myCustomFunction("#link-selector");
}
但是一些参考资料告诉我不要在页面加载中添加绑定,因为它会在每次 turbolinks 加载内容时创建另一个绑定。这是很合理的。但是,就我而言,我已经将 click 事件委托给 myCustomFuntion
.
中的 document
问题是:我可以 运行 这个事件委托 on()
每次页面加载时都正常运行吗?
Obs:问题也可以改写:这段代码会不会在长时间 运行 中引起麻烦,在加载许多页面之后?
Obs2:我无法从 myCustomFunction
内部获取 click 事件处理,因为它取决于之前完成的计算。
将事件处理程序添加到文档 page:load
上的文档将如您所读创建重复的处理程序。尝试 运行 下面的片段:
(点击触发page:load几次点我!)
$(document).on('page:load', function(){
$(document).on('click', '#test', function(){
$("#log").append('<li>clicked!</li>');
});
});
$("#page_load").on('click', function(){
$(document).trigger('page:load');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="page_load">Trigger page:load</button>
<button id="test">Click me!</button>
<ul id="log"></ul>
Turbolinks 基本上通过 Ajax 加载页面并替换文档内容来工作。
当它从 DOM 中删除旧页面时,它确实会尝试清理事件处理程序 - 但由于您的处理程序已绑定到文档,因此不会被删除。
您可以相对安全地将处理程序应用于 DOM 元素,例如 body
,因为 turbolinks 会取出文档并替换内容。
我的 rails 应用程序中有此代码:
$(document).ready( function() {
myCustomFunction("#link-selector");
}
function myCustomFunction(linkCssSelector){
// some stuff...
$(document).on('click', linkCssSelector, function(){
// ...some other stuff...
});
}
click
事件处理已委托给 文档 ,但现在我必须将 Turbolinks 添加到我的应用程序.
然后,我将使用 ready()
函数并执行以下操作(基于我的搜索):
$(document).on("ready page:load", function() {
myCustomFunction("#link-selector");
}
但是一些参考资料告诉我不要在页面加载中添加绑定,因为它会在每次 turbolinks 加载内容时创建另一个绑定。这是很合理的。但是,就我而言,我已经将 click 事件委托给 myCustomFuntion
.
document
问题是:我可以 运行 这个事件委托 on()
每次页面加载时都正常运行吗?
Obs:问题也可以改写:这段代码会不会在长时间 运行 中引起麻烦,在加载许多页面之后?
Obs2:我无法从 myCustomFunction
内部获取 click 事件处理,因为它取决于之前完成的计算。
将事件处理程序添加到文档 page:load
上的文档将如您所读创建重复的处理程序。尝试 运行 下面的片段:
(点击触发page:load几次点我!)
$(document).on('page:load', function(){
$(document).on('click', '#test', function(){
$("#log").append('<li>clicked!</li>');
});
});
$("#page_load").on('click', function(){
$(document).trigger('page:load');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="page_load">Trigger page:load</button>
<button id="test">Click me!</button>
<ul id="log"></ul>
Turbolinks 基本上通过 Ajax 加载页面并替换文档内容来工作。
当它从 DOM 中删除旧页面时,它确实会尝试清理事件处理程序 - 但由于您的处理程序已绑定到文档,因此不会被删除。
您可以相对安全地将处理程序应用于 DOM 元素,例如 body
,因为 turbolinks 会取出文档并替换内容。