JQuery Infinite Scroll 加载多个相同的 $(document).ready 事件,并多次触发它们

发布于 2024-12-14 10:08:54 字数 966 浏览 3 评论 0原文

我是 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别忘他 2024-12-21 10:08:54

您需要使用 .on()(jQ 1.7 及以上版本)来委托祖先元素作为侦听器,而不是使用 .click()。绑定一次,然后任何“a.FollowJQ”都可以执行该函数。

$('#wrapper').on("click", "a.FollowJQ", function() { ..the function.. });

如果使用 jQuery 1.6.x,.delegate() 将执行相同的操作:

$('#wrapper').delegate("a.FollowJQ", "click", function() { ..the function.. });

在示例中,"#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.

$('#wrapper').on("click", "a.FollowJQ", function() { ..the function.. });

If using jQuery 1.6.x, .delegate() will do the same:

$('#wrapper').delegate("a.FollowJQ", "click", function() { ..the function.. });

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文