【问题标题】:Ajax'ing page content; previously clicked link doesn't behave the same the second time after back button hitAjax'ing 页面内容;以前点击的链接在点击后退按钮后第二次的行为不一样
【发布时间】:2017-02-14 16:25:11
【问题描述】:

我正在创建一个网站,希望在其中无缝切换页面(如应用程序)。为此,我已经决定从请求的页面中对我需要的内容进行 ajax 处理,并在两者之间使用一个预加载器作为过渡。我有以下代码:

var url = "";
var historyUrl = "";

$('a').on('click', function(e){
    url = $(this).attr("href");
    historyUrl = window.location.pathname;

    e.preventDefault();

    $('#wrap main').removeClass('active');

    $("#wrap main").load(url + " #wrap main", function (responseText, textStatus, XMLHttpRequest) {
        if (textStatus == "success") {

            setTimeout(function() {
                $('#wrap main').addClass('active');
            }, 1000);

            history.pushState(null, null, url);

        }
        if (textStatus == "error") {
            // Error out
        }
    });

    e.stopPropagation();
});

$(window).on('popstate', function(){

    $('#wrap main').removeClass('active');

    $("#wrap main").load(historyUrl + " #wrap main", function (responseText, textStatus, XMLHttpRequest) {
        if (textStatus == "success") {
            setTimeout(function() {
                $('#wrap main').addClass('active');
            }, 1000);
        }
        if (textStatus == "error") {
            // Error out
        }
    });
});

如您所见,我正在触发所有标签以进行测试。此代码在大多数情况下都可以正常工作。如果我转到第一页并单击一个链接,我会成功转换到第二页,而无需重新加载浏览器。 URL 更改并推送历史记录。如果我然后单击返回按钮,我也将成功返回第一页。

问题随后出现;如果我继续点击我第一次点击第一页的同一个链接,它将忽略点击功能,并像标准浏览器一样加载第二页。

我无法弄清楚为什么会发生这种情况。我认为这与 pushState 有关,但我不能完全确定它。

我在这里遗漏了什么明显的东西吗?

谢谢

【问题讨论】:

    标签: javascript jquery ajax pushstate html5-history


    【解决方案1】:

    当您动态加载内容时,事件不会自动绑定到元素。这就是为什么动态变回第一页后,没有点击链接的事件处理程序。

    改变

    $('a').on('click', function(e){
    

    $(document).on('click', 'a', function(e){
    

    它应该可以工作。

    如果第二个参数 ('a') 中的选择器与事件目标匹配,这会将点击事件推迟到文档(未更改)并执行回调函数。

    【讨论】:

    • 附带说明:将元素推迟到文档并不是真正的好习惯,因为整个页面上的每次点击都会触发该事件,jQuery 检查事件目标,然后继续或中止。因此,您应该在不破坏功能的情况下尽可能地遵循关闭父元素。例如,当仅将页面的一部分加载到 id="pagecontent" 的 div 元素中时,您可以将 click 事件仅绑定到 ajax 请求的成功回调中的所有 $('#pagecontent a') 元素。这样会干净得多。
    猜你喜欢
    • 2013-04-20
    • 2019-09-01
    • 1970-01-01
    • 2021-11-07
    • 2023-03-14
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多