我已经建立了一个一页的网站。当用户单击菜单按钮时,内容将使用ajax加载。它工作正常。为了改善SEO并允许用户复制/过去不同内容的URL,我使用
function show_content() {
// change URL in browser bar)
window.history.pushState("", "Content", "/content.php");
// ajax
$content.load("ajax/content.php?id="+id);
}
它工作正常。URL更改并且浏览器没有重新加载页面
但是,当用户单击浏览器中的后退按钮时,URL会更改,并且必须加载内容。
我已经做到了,它的工作原理是:
window.onpopstate = function(event) {
if (document.location.pathname == '/4-content.php') {
show_content_1();
}
else if (document.location.pathname == '/1-content.php') {
show_content_2();
}
else if (document.location.pathname == '/6-content.php') {
show_content_();
}
};
您知道是否有改进此代码的方法吗?
我所做的是将对象文字传递给pushState()
页面加载。这样,您始终可以返回到第一个创建的pushState。就我而言,我不得不两次推后才可以返回。推动页面加载状态帮助了我。
HTML5允许您使用数据属性,因此对于触发器,您可以使用它们来绑定HTML数据。
我之所以使用try catch,是因为我没有时间为较旧的浏览器找到一个polyfill。您可能需要检查Modernizr,如果您的情况需要这样做。
页面加载
try {
window.history.pushState({
url: '',
id: this.content.data("id"), // html data-id
label: this.content.data("label") // html data-label
}, "just content or your label variable", window.location.href);
} catch (e) {
console.log(e);
}
活动扶手
填充了默认信息的对象
var obj = {
url: settings.assetsPath, // this came from php
lang: settings.language, // this came from php
historyData: {}
};
绑定history.pushState()
触发器。在我的情况下是一个委托,因为我在页面上有动态元素。
// click a trigger -> push state
this.root.on("click", ".cssSelector", function (ev) {
var path = [],
urlChunk = document.location.pathname; // to follow your example
// some data-attributes you need? like id or label
// override obj.historyData
obj.historyData.id = $(ev.currentTarget).data("id");
// create a relative path for security reasons
path.push("..", obj.lang, label, urlChunk);
path = path.join("/");
// attempt to push a state
try {
window.history.pushState(obj.historyData, label, path);
this.back.fadeIn();
this.showContent(obj.historyData.id);
} catch (e) {
console.log(e);
}
});
将history.back()
事件绑定到自定义按钮,链接或其他内容。我使用了,.preventDefault()
因为我的按钮是链接。
// click back arrow -> history
this.back.on("click", function (ev) {
ev.preventDefault();
window.history.back();
});
当历史记录弹出时->检查推送状态,除非是第一次尝试
$(window).on("popstate", function (ev) {
var originalState = ev.originalEvent.state || obj.historyData;
if (!originalState) {
// no history, hide the back button or something
this.back.fadeOut();
return;
} else {
// do something
this.showContent(obj.historyData.id);
}
});
使用对象文字作为参数很容易传递您的ID。然后,您可以使用一个功能showContent(id)
。
无论我在哪里使用this
它,都不过是存储在IIFE中的jQuery对象/函数。
请注意,我将这些脚本与实现结合在一起,并结合了您最初的要求。所以希望这会给您一些新的想法;)
问题内容: 当用户登录时,将存储会话信息。当用户注销时,会话信息将被删除。但是当我点击浏览器的后退按钮时,会显示用户信息。由于会话已消失,但我们无法确定是否执行了用户登录操作。我该如何解决这个问题? 问题答案: 我用这种方法。首先创建一个实现Filter的类并重写doFilter()方法。doFilter()的代码是: 之后在web.xml中使用过滤器。这个过滤器就是这个。
问题内容: 我正在用php做在线测验应用程序。我想限制用户再次参加考试。我尝试了以下脚本,但是它停止了我的计时器。我该怎么办? 我已经包含了源代码。计时器存储在cdtimer.js中 我有一个考试计时器,该计时器从 mysql 值中获取考试时间。计时器相应地启动,但是当我放入用于禁用后退按钮的代码时,计时器停止。我怎么了 问题答案: 有许多原因导致禁用后退按钮无法真正起作用。最好的选择是警告用户:
本文向大家介绍如何禁止浏览器使用后退按钮功能,包括了如何禁止浏览器使用后退按钮功能的使用技巧和注意事项,需要的朋友参考一下 本文介绍可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适用场合。 一、概述 曾经有许多人问起,“怎样才能‘禁用'浏览器的后退按钮?”,或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”在ASP论坛上,这个问题也是问得最多的问题之一。遗憾的是,答案非常
问题内容: 您如何确定用户是否按下浏览器中的“后退”按钮? 您如何使用系统在单页Web应用程序内强制使用页内后退按钮? 到底为什么浏览器后退按钮不触发自己的事件!? 问题答案: (注意:根据Sharky的反馈,我提供了用于检测退格的代码) 因此,我经常在SO上看到这些问题,并且最近遇到了我自己控制后退按钮功能的问题。在为我的应用程序寻找最佳解决方案(带哈希导航的单页)几天后,我提出了一个简单的,跨
问题内容: 我在www.darknovagames.com上运行了基于浏览器的游戏。最近,我一直在努力使用CSS重新格式化该网站,试图让其所有页面都根据HTML标准进行验证。 我一直在想着要在页面左侧放置AJAX导航菜单的想法(而不是每次都将用户带到一个单独的页面,而是需要重新加载标题和导航栏,而这几乎是不会改变的),我知道如果这样做,我可能会破坏浏览器中的“前进/后退”按钮。我的问题是,我应该继
问题内容: 我正在使用Material-ui的选项卡,这些选项卡是受控的,并且将它们用于(React-router)链接,如下所示: 如果我正在访问仪表板/数据并且单击浏览器的后退按钮,则可以转到仪表板/用户(例如),但突出显示的选项卡仍停留在仪表板/数据上(值= 2) 我可以通过设置状态来更改,但是当按下浏览器的后退按钮时,我不知道如何处理该事件? 我发现了这一点: 但这在每次状态更改时都会调用