JQuery Infinite Scroll 加载多个相同的 $(document).ready 事件,并多次触发它们
我是 jquery 的新手,希望这是一个简单的问题,但我已经没有想法了。
我正在使用 .net,并且有一个页面,其中包含一些自定义 jquery 函数,如下所示,用于跟踪用户。当页面首次加载时,这工作得非常好。
问题在于无限滚动,我将其发布到另一个页面并附加结果。如果我附加结果而不在该发布的页面上重新包含以下功能,则当我单击新附加的链接时,它永远不会触发该事件。但如果我再次包含这个完全相同的片段,它就会正常工作。除了页面上所有以前的链接现在都会触发额外的时间。
因此,如果我向下滚动 5 页数据,然后单击该页面上的第一个链接,它现在会触发 6 次!我添加的最新的仅触发一次。
我看到一些关于去抖动和节流的东西,但这似乎比这更简单 - 有没有办法只加载这个函数一次并让它对附加数据起作用?
$(document).ready(function () {
$('a.FollowJQ').click(function () {
var username = $(this).attr('data');
$.post('/jquery/follow.aspx',{ user: username },
function (data) {
if (!data.error) {
if (data.server == 'SendToLoginPage') { window.location = "/login.aspx" }
else { $('a.FollowJQ:[data=' + username + ']').html(data.server); } }
else { $('a.FollowJQ:[data=' + username + ']').html(data.server); }
}, 'json');
});
});
I'm new to jquery and am hoping this is a simple issue, but am running out of ideas.
I am working with .net and have a page that includes a few custom jquery functions like the below for following a user. This works perfectly fine when the page first loads.
The issue comes with infinite scrolling, where I am posting to another page and appending the results. If I append the results without re-including the below function on that posted page, it will never fire the event when I click the newly appended links. But if I do include this exact same snippet again, it works correctly. EXCEPT that all previous links on the page now fire an extra time.
So if i scroll down through 5 pages of data and then click on the first link on the page, it now fires 6 times!! The newest one I added only fires once.
I see some stuff about debouncing and throttling, but this seems even more simplistic than that - isn't there a way to only load this function once and have it work for the appended data?
$(document).ready(function () {
$('a.FollowJQ').click(function () {
var username = $(this).attr('data');
$.post('/jquery/follow.aspx',{ user: username },
function (data) {
if (!data.error) {
if (data.server == 'SendToLoginPage') { window.location = "/login.aspx" }
else { $('a.FollowJQ:[data=' + username + ']').html(data.server); } }
else { $('a.FollowJQ:[data=' + username + ']').html(data.server); }
}, 'json');
});
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要使用
.on()
(jQ 1.7 及以上版本)来委托祖先元素作为侦听器,而不是使用.click()
。绑定一次,然后任何“a.FollowJQ
”都可以执行该函数。如果使用 jQuery 1.6.x,.delegate() 将执行相同的操作:
在示例中,
"#wrapper"
是"a.FollowJQ"
元素的任何祖先元素,预计不会被任何其他 DOM 操作破坏。最接近的共同祖先将具有最好的性能。Instead of using
.click()
, you need to use.on()
(jQ 1.7 onward) to delegate to an ancestor element as the listener. Bind once and then any 'a.FollowJQ
' can execute the function.If using jQuery 1.6.x, .delegate() will do the same:
In the samples,
"#wrapper"
is any ancestor element of"a.FollowJQ"
elements that is not expected to be destroyed by any other DOM manipulation. The closest common ancestor will have the best performance.