jquery插件history.js在html4浏览器中无法正常工作

  1. 在我的主页上,我们称之为mysite.com ,我点击一个具有此href值的链接: /home/home.php?doc=gym 。 所以,整个url是mysite.com/home/home.php?doc=gym# (浏览器在url的末尾添加了# ,但我需要在参数之前将插件正常工作)。

  2. 从那个页面home.php ,我点击了一个链接,我发现了它的事件,加载了一些Ajax数据,并希望将url mysite.com/home/home.php?doc=gym更改为mysite.com/home/home.php?doc=pilates 。 所以,我所做的是:只要加载内容,我就执行History.pushState(null, null, url); url = ?doc=pilates

  3. 这是问题出现的时候,例如,在Internet Explorer 8中,新的url是: mysite.com/home/home.php?doc=gym#home.php?doc=pilates而不是mysite.com/home/home.php?doc=pilates

  4. 我想,这种情况发生了,因为我在第1.步说的最后一件事1.

  5. 如果我单击另一个链接并执行pushState方法,它将使用我编写的参数替换?doc=pilates作为函数的第三个参数,因为它位于#符号之后。

一些代码示例会很好,但从您的解释我得到的想法是你没有正确实现history.js。

你必须在href click事件中推送状态然后捕获statechange事件并在那里执行你的ajax加载和dom操作。

你必须这样使用它,因为当你调用pushState函数时会触发statechange事件。

由Shikyo编辑:

所以,我所做的是:只要加载内容,我就执行History.pushState(null,null,url);

这就是为什么我明白你没有正确使用它的原因。 你必须pushState然后在statechange事件中加载你的内容并更新dom。 不首先更新dom然后调用pushState

至于html4浏览器中的初始状态,history.js插件永远不会触发初始状态更改事件。

我在html 4浏览器中找到了2种处理初始状态的解决方案:

1)在文档就绪事件中调用History.getState()并处理初始状态。

2)自己触发statechange事件:

 // If pushState is emulated (html4 browsers) and we have a hash (a '#' in the url) trigger the statechange event if (History.emulated.pushState && History.getHash()) { $(document).ready(function() { History.Adapter.trigger(window, "statechange"); }); } 

当然还要处理statechange事件中操作的任何DOM。

由ksairi编辑2:

作为更新,我认为当我加载ajax内容时,加载和更改url时无关紧要,因为内容的加载不会影响url,也不会影响加载。 也许有一些我不理解的东西。

实际上,演示中的部分代码如下:

  (function(window,undefined){ var History = window.History, State = History.getState(), $log = $('#log'); // Log Initial State History.log('initial:', State.data, State.title, State.url); // Bind to State Change History.Adapter.bind(window,'statechange',function(){ // Note: We are using statechange instead of popstate // Log the State var State = History.getState(); // Note: We are using History.getState() instead of event.state History.log('statechange:', State.data, State.title, State.url); }); })(window); 

如您所见,执行History.getState()并在IE8中测试了它。

在html5浏览器中,当您登陆页面时,它不会执行状态更改,它会在您按下状态时执行。 在html4和html5浏览器中。

Shikyo编辑3:

好的,这就是为什么你需要在初始状态的html4浏览器中做一些特别的事情:

在html5浏览器中,实际的url会被更改,例如从http://mysite.com/到html4中的http://mysite.com/page/1 ,url会更改为http://mysite.com/#page=1

请注意,实际上并未更改url,只更改了称为哈希的#之后的位。

服务器不知道散列后面是什么,所以在html5浏览器中,服务器加载http://mysite.com/page/1 ,在html4浏览器中,服务器忽略#后的所有内容,所以url是http://mysite.com/

在html5浏览器中,正确的内容被加载,因为url指向正确的地址。 在html4浏览器中,您必须手动处理初始状态,因为第一次未加载内容且未触发statechange事件。

请参阅我的第一次编辑,了解此问题的可能解决方

Shikyo,我做了你告诉我的事情,它实际上帮助了我,后面和前面的按钮现在显示正确的内容。 谢谢你,我没有想到那些行为。 不幸的是,问题仍然存在于html4浏览器中。 该页面是galagym.com/home/home.php。 您可以进入左侧的不同部分,查看url的错误行为,当然是在html4浏览器中。 在html5浏览器中它完美运行。

所以如果你/任何人可以给我笔记,那就太好了。

谢谢!