javascript - 使用 Ajax 加载页面时,返回按钮不起作用

标签 javascript ajax xmlhttprequest

我正在尝试创建一个所有页面都通过 Ajax 调用的网站。当我点击页面上的任何链接时,url和页面内容都会发生变化,而无需刷新所有页面(类似Facebook)。到目前为止一切都很好。

问题是:当我点击后退前进按钮时,网址发生变化,但页面内容没有变化。

示例代码:

function loadDoc($link) {  // example for $link : /example.php
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                var parser = new DOMParser();
                var doc = parser.parseFromString(xhttp.responseText, "text/html");
                var elem = doc.getElementById("content");
                document.getElementById("content").innerHTML = elem.innerHTML;
            }
        };
        xhttp.open("GET", $link, true);
        xhttp.send();
        window.history.pushState('', 'Settings', $link);  // dynamic url changing 
    }

(也欢迎完全独立的结构或其他想法)

最佳答案

您已使用 pushState 将条目添加到浏览器历史记录中,但尚未添加事件处理程序来确定浏览器返回时会发生什么情况。浏览器不会自动为您记住 DOM 的状态。

这是一个简单的例子:

<div id="content">1</div>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>

<script>
    const div = document.querySelector('div');

    addEventListener('click', event => {
        if (event.target.tagName.toLowerCase() !== 'button') return;
        const last = div.textContent;
        const next = event.target.textContent;
        div.textContent = next;
        history.pushState({ value: next }, `Page ${next}`, `/page/${next}`);
    });

    addEventListener('popstate', event => {
        let state = event.state;
        if (state === null) {
            // special case: This is the state before pushState was called
            // We know what that should be:
            state = { value: 1 };
        }
        div.textContent = state.value;
        console.log('location: ' + document.location + ', state: ' + JSON.stringify(event.state));
    });
</script>

关于javascript - 使用 Ajax 加载页面时,返回按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63753030/

相关文章:

javascript - 如何在 jQuery 中保持 DRY?

javascript - 打开一个多打开的 Accordion 选项卡并滚动到该部分中的哈希位置(IE 在评估查询字符串之前滚动到哈希 anchor ?)

php - 从服务器目录填充选择 PHP jQuery AJAX

javascript - 我无法使用 Angular2 从 JSONP 响应中获取正文数据,但它可以通过使用 ajax 来工作

javascript - 在 <ul> 中隐藏 <li> 元素

javascript - WordPress 中的 masonry

javascript - 使用 AJAX 调用将 GeoJSON 数据拉入 Leaflet

javascript - 二进制数据的部分 XHR 响应读取,可能吗?

javascript - 从函数中抛出和捕获异常

java - 删除带有有效负载或表单数据的请求会导致错误请求