2011-11-21 68 views
5

我已经开始测试History.js。了解它的工作原理,并且没有popstate,而是有statechange。当我按下浏览器的后退按钮时,我正在寻找一种不同的方法。History.js中有没有方法知道按下后退按钮

原因是我需要知道状态移动之前的URL,从我要去的那个。该项目包含gist,只查看我们所访问的网址。

我希望解决的办法是不要跟踪全局变量中访问的最新URL。

感谢

回答

4

我知道这是一个相当陈旧的问题,但我想出了一个解决问题的一个标准页和历史状态页面之间切换时,前进/后退键。

方案:使用 HTML5历史(或history.js插件)在一组页面 然后其他页面,我们需要真正的负荷,又称标准页(不要问为什么,但也有一定的用例,这可能需要)

当您从历史状态页面前往,并且执行实际加载到标准页面时。你不能回去:它改变网址,但不加载页面 - 它只激发一个状态变化;我认为这是原帖的问题。我的个人意见是,这是一个浏览器错误(所有浏览器都有问题),因为浏览器应该知道您正在浏览的页面已重新加载到历史记录状态页面之外。

我使用一些非常简单的方法解决了这个问题: 监听statechange事件,并在触发时告诉浏览器刷新。这种方式我不在乎他们是否返回或转出此页面。如果浏览器认为状态正在改变(链接不会触发statechange事件),只有后退/前进INTO历史状态页面会触发此事件,因此它可以解决问题。

代码,使用jQuery + History.js插件:

$(window).on('statechange', function() { 
    window.location.reload(); 
}); 

如果这是没有意义的,你可能没有这个问题。然而,我注意到许多网站上的这个使用HTML 5的历史(即使pinterest.com有这个问题,如果你重新加载时,图像模态,然后尝试返回)。

我们希望,如果你确实有这个问题,你会发现这个答案,有一种如释重负的叹息巨大:)

+2

我曾想过类似的逻辑,但是,当发出pushState和按下后退/前进时会触发statechange,从而创建无限重新加载循环。 – Dean

+0

事实上,一个巨大的缓解。我正要放弃。 –

17

我发现在GitHub上的解决方案是有点过头了,我的目的。我创建了一个总是正确的布尔,除了之前我使用History来更改状态时。

var manualStateChange = true; 

History.Adapter.bind(window,'statechange',function(){ 
    if(manualStateChange == true){ 
    // BACK BUTTON WAS PRESSED 
    } 
    manualStateChange = true; 
}); 

任何时候,我以编程方式更改的状态,设置布尔为false:

manualStateChange = false; 
History.pushState(null, null, currentPath); 
+0

好的想法... – JDandChips

+1

我做了同样的事情,但是这不会区分'后退'和'前进'按钮。 – GTCrais

+0

这正是我所需要的,谢谢:D ...我只需要位于'// BACK BUTTON PRESSED'位的'location.reload()',所以'back'和'forward'不是一个问题:D –

0

在“官方”版本,此功能将不可用。尝试在主文件中使用此文件: https://github.com/danger89/history.js/blob/master/scripts/bundled/html5/jquery.history.js

我无法保证他的解决方案适用于每个浏览器。但这是一个很好的解决方案。如果你申请了他的变化,你可以使用:

var State = History.getState(); 
if (State.navigation) { 
    // Back/forward button is pressed. 
} 

更多信息,请Github issue 47找到。

0

与James Wagoner相似的答案。 'statechange'事件被双方解雇,所以我只检查'popstate'事件,在我的情况下只在用户返回时调用。

window.addEventListener('popstate', function() { 
    window.location.reload(); 
}); 
相关问题