无刷新修改页面的浏览器地址栏显示地址的方法

标签: 技术技巧 history pushState 刷新 浏览历史 | 发表时间:2014-05-16 00:34 | 作者:歪脖骇客
出处:http://www.webhek.com

作为一个Web程序员,我经常会到网上去看别人是如何做网站,如何开发Web应用的。这样的好处有很多,一是开阔你的眼界,你能看到很多书本上没有的东西,二是看别人的代码是如何写的,取人之长、补己之短。像 纯CSS3实现光芒旋转四射的头像动画用CSS制作出绚丽燃烧的火狐狸的方法都是研究别人网站上的技术的收获。

经常访问Facebook,或github.com,或plus.google.com的人会发现,它们翻页时页面并不是全部刷新,只有中间文章部分刷新,而页面头和页面侧边栏不刷新。首先我们要理解为什么它们要这样做,这样做有什么好处。

布局

通常的网站页面都有一个规律,比如我们的WebHek网站,左侧的内容以及页面头部的logo和菜单部分在各个页面上都是一样的,只有中间文章部分的内容会变化。传统的页面里,用户访问每个页面时,这些永远不变的部分会反复重复重新加载——其实完全没必要,既浪费流量资源,又影响页面加载速度,我们真正需要它们只加载一次就行了。

当然,有经验的Web程序员已经说出来了,用Ajax动态加载有变化的部分。当用户点击“下一页”时,我们不是真的翻到下一页,而是后台用Ajax把新内容的HTML拉取到客户端,然后删掉原来的内容部分,填充进新拉取的内容。整个效果跟传统的翻页效果一样,但速度更快,更节省资源,而且可以添加一些特性,比如淡入淡出。

但现在有了另外一个问题。在传统的翻页过程中,你可以看到浏览器的地址栏是相应会变化的,会显示当前页面地址,用户可以拷贝这个地址或加入书签或分享给好友。而Ajax实现的翻页地址栏是没有变化的。还有,在传统的翻页过程中,当用户点击“后退”按钮时,浏览器会从缓存里读取前一页,迅速的显示给用户。而Ajax实现的翻页中,用户点击“后退”按钮时,不知道会后退到哪里,因为页面的地址没有变化, window.history里没有存储任何“前一页”的信息。

前面说了这么多,下面才是本文的重点,如何在不刷新页面的情况下修改页面的URL。也就是,如何既能实现用Ajax加载页面实现翻页,又能让浏览器记录翻页地址历史信息。

程序手工存储 window.history信息

function processAjaxData(answer, url){
     document.getElementById("mycontainer").innerHTML = answer.html;
     document.title = answer.pageTitle;
     window.history.pushState({"html":answer.html,"pageTitle":answer.pageTitle},"", url);
 }

answer.html是我们用Ajax在后台拉取的新页面内容,用它替换了页面上的原内容,并且修改了页面标题。最后一步最重要,把页面信息 pushStatewindow.history里。

而当有浏览者点击浏览器“后退”或“前进”按钮时,我们用下面的代码来响应用户的操作:

window.onpopstate = function(event){
    if(event.state){
        document.getElementById("mycontainer").innerHTML = event.state.html;
        document.title = event.state.pageTitle;
    }
};

谷歌浏览器,火狐浏览器,Safafi浏览器、IE10+等现代浏览器都支持这种技术,你也试试吧。

相关 [页面 浏览器 地址栏] 推荐:

无刷新修改页面的浏览器地址栏显示地址的方法

- - WebHek
作为一个Web程序员,我经常会到网上去看别人是如何做网站,如何开发Web应用的. 这样的好处有很多,一是开阔你的眼界,你能看到很多书本上没有的东西,二是看别人的代码是如何写的,取人之长、补己之短. 像 纯CSS3实现光芒旋转四射的头像动画和 用CSS制作出绚丽燃烧的火狐狸的方法都是研究别人网站上的技术的收获.

首款在浏览器地址栏中运行的游戏面世,实在是太神奇了

- aoao - Chrome迷
你没看错,Chrome 的地址栏确实可以玩游戏. 来自 ProbablyInteractive 的高手 Corey 开发了这个完全可以在浏览器地址栏中运行的游戏——URL Hunter,这确实有些不可思议,就好像我在N年前看到Excel中还可以玩赛车游戏一样不可思议. 玩这个游戏的方法说起来很简单,打开 URL Hunter 游戏页面后,地址栏的游戏就开始了.

[转]浏览器的加载与页面性能优化

- Allen - linux大棚-roclinux.cn
本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. 文章部分转自“百度泛用户体验平台”,本文地址为:http://www.baiduux.com/blog/2011/02/15/browser-loading/.

浏览器的加载与页面性能优化

- 彦强 - 百度泛用户体验
本文将探讨浏览器渲染的loading过程,主要有2个目的:. 了解浏览器在loading过程中的实现细节,具体都做了什么. 研究如何根据浏览器的实现原理进行优化,提升页面响应速度. 由于loading和parsing是相互交织、错综复杂的,这里面有大量的知识点,为了避免过于发散本文将不会对每个细节都深入研究,而是将重点放在开发中容易控制的部分(Web前端和Web Server),同时由于浏览器种类繁多且不同版本间差距很大,本文将侧重一些较新的浏览器特性.

腾讯浏览器官方页面出现“aiww"字

- Shadow - Solidot
Pb 写道 "今天有网友发现腾讯浏览器的 官方页面 上,介绍“超级拖拽”功能的配图上出现“#aiww#”字样(截图).

5大Chrome浏览器一键截图扩展,整张页面

- - 够趣堂
在日常生活和工作中,截图功能有经常要使用到的. 当你QQ运行时只需要“Ctrl+Alt+A”组合键即可局部截图,还可以简单的DIY,但是需要截图整个页面的时候,内置的QQ截图功能就有点鸡肋了. 如果你正在使用Chrome浏览器,那么通过安装扩展一键点击即可截取整个页面,非常的傻瓜,在这里Anliu推荐 5款Chrome一键截图整个页面的Chrome插件,当然局部截取也是可以的.

浏览器的加载与页面性能优化

- - 可咔酷 | 网络杂货铺
本文将探讨浏览器渲染的loading过程,主要有2个目的:. 了解浏览器在loading过程中的实现细节,具体都做了什么. 研究如何根据浏览器的实现原理进行优化,提升页面响应速度. 由于loading和parsing是相互交织、错综复杂的,这里面有大量的知识点,为了避免过于发散本文将不会对每个细节都深入研究,而是将重点放在开发中容易控制的部分(Web前端和Web Server),同时由于浏览器种类繁多且不同版本间差距很大,本文将侧重一些较新的浏览器特性.

表格自动适应浏览器大小及DIV浮动设计(页面自适应浏览器大小)

- - CSDN博客Web前端推荐文章
        一、表格自适应浏览器大小.       之前写了个页面,将width和height值给定死了,这样导致浏览器缩小时,表格不会跟着自动适应浏览器大小.       1.一般是给表格整体使用样式: table-layout:fixed;.       2.将表格中的各个单元格的 width和height属性值设为比例,而不是给定值.

怎样让浏览器随意修改访问中的 web 页面

- - ITeye博客
  丈 母娘在的那些日子, 天天玩 4399 上的 花花连连看 游戏, 明天要走了, 说要把游戏下载下来回去玩,因为她家里没有网络. 我看了下这个页面, 发现是个 flash 的游戏, 心想应该能下载到本地玩. 看了看页面上有个下载的连接, 点进去却发现还需要安装 4399 游戏盒. 安装软件对于丈母娘来说太难了, 我心想,直接把 flash 下载下来不就完了吗.

基于浏览器的页面设计工具Easel帮你快速制作出产品原型页面

- - VooSee - 拮取生活中的彩虹
很多初入互联网的创业者脑子里可能有一大堆的创意,却苦于不会代码和用户界面设计,没有办法快速把这些想法快速呈现出来. 注意到你的这种痛点,推出基于浏览器的所见即所得Web设计工具,帮助你和你的团队快速制作出产品原型页面. Easel最重要的特点是速度和协作,它支持多人同时在线编辑. 虽然与强大的桌面设计软件相比功能并不完善,但Easel提供的工具却也能够帮用户设计出适合桌面、移动或平板浏览的基本站点.