Hop*_*ppe 15 javascript browser-history pushstate jquery-bbq
我正在使用jQuery BBQ插件来跟踪用户在页面中的进度.但是,我只想在用户的历史记录中创建一个额外的条目,而不是每个哈希变化都创建一个条目.
我已经尝试了jQuery.bbq.pushState和merge_mode方法,没有成功:仍然添加了新的历史记录条目:
jQuery.bbq.pushState({ sort: encodeURIComponent(sort) });
Run Code Online (Sandbox Code Playgroud)
我也尝试过location.replace(),但这对Safari 5.1.2不起作用.
location.replace('#' + encodeURIComponent(sort))
Run Code Online (Sandbox Code Playgroud)
什么是修改哈希的跨浏览器解决方案,而不会在历史记录中添加太多条目?
Rob*_*b W 35
首先,我展示了函数的定义,replaceHash它只接受一个参数:新的位置散列.可以在答案的底部找到逻辑的详细说明.
// Should be executed BEFORE any hash change has occurred.
(function(namespace) { // Closure to protect local variable "var hash"
if ('replaceState' in history) { // Yay, supported!
namespace.replaceHash = function(newhash) {
if ((''+newhash).charAt(0) !== '#') newhash = '#' + newhash;
history.replaceState('', '', newhash);
}
} else {
var hash = location.hash;
namespace.replaceHash = function(newhash) {
if (location.hash !== hash) history.back();
location.hash = newhash;
};
}
})(window);
// This function can be namespaced. In this example, we define it on window:
window.replaceHash('Newhashvariable');
Run Code Online (Sandbox Code Playgroud)
history.replaceState支持时,该函数将始终替换当前哈希,没有任何副作用.否则,将创建hash第一个location.hash属性的reference(),并定义以下函数:
location.hash != hash,那么我们肯定知道历史的状态至少超过了第一页的视图.我们可以安全地返回历史记录,而无需卸载页面.history.back(); // Go back in the history.location.hash属性.如果我们回到上一步的历史记录中,则会覆盖历史记录条目.
后备(最后)方法可能并不总是替换历史记录:
何时location.hash == hash,满足以下任一条件:
history.back();,页面可能会被卸载,这是不可取的.
因此,为了安全起见,当哈希值等于保存的原始哈希值时,我们永远不会卸载页面.
注意:在哈希更改之前运行此代码非常重要.当哈希值已经更改时,脚本不再可靠.用户可能已导航到第一个散列状态,该状态不等于已保存hash.因此,history.back()卸载页面.
yck*_*art 22
您可以使用replace-method from window.location,而不使用第二个newSubStr参数.这适用于所有已知的浏览器,甚至是oldIE:
function replaceHash(hash) {
return window.location.replace(
'#' + hash.replace(/^#/, '')
);
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果文档中存在有效元素(根据规范),页面将跳转/滚动到该页面.
| 归档时间: |
|
| 查看次数: |
23524 次 |
| 最近记录: |