JavaScript的History API使搜索引擎抓取AJAX内容


Posted in Javascript onDecember 07, 2015

大家在浏览Facebook的相册时有没有发现,页面局部刷新的同时地址栏的地址也改变了,而且不是hash的方式。它使用的就是HTML5 history新增的几个API,作为window的一个全局变量,在HTML4的时代history已不是什么新鲜的事物了。我们经常使用的就有 history.back()以及history.go() 。

我一直以为没有办法做到,直到前两天看到了Discourse创始人之一的Robin Ward的解决方法,不禁拍案叫绝。

JavaScript的History API使搜索引擎抓取AJAX内容

Discourse是一个论坛程序,严重依赖Ajax,但是又必须让Google收录内容。它的解决方法就是放弃井号结构,采用 History API。

所谓 History API,指的是不刷新页面的情况下,改变浏览器地址栏显示的URL(准确说,是改变网页的当前状态)。这里有一个例子,你点击上方的按钮,开始播放音乐。然后,再点击下面的链接,看看发生了什么事?

JavaScript的History API使搜索引擎抓取AJAX内容

地址栏的URL变了,但是音乐播放没有中断!

History API 的详细介绍,超出这篇文章的范围。这里只简单说,它的作用就是在浏览器的History对象中,添加一条记录。

window.history.pushState(state object, title, url);

上面这行命令,可以让地址栏出现新的URL。History对象的pushState方法接受三个参数,新的URL就是第三个参数,前两个参数都可以是null。

window.history.pushState(null, null, newURL);

目前,各大浏览器都支持这个方法:Chrome(26.0+),Firefox(20.0+),IE(10.0+),Safari(5.1+),Opera(12.1+)。

下面就是Robin Ward的方法。

首先,用History API替代井号结构,让每个井号都变成正常路径的URL,这样搜索引擎就会抓取每一个网页。

example.com/1
 

example.com/2
 

example.com/3

然后,定义一个JavaScript函数,处理Ajax部分,根据网址抓取内容(假定使用jQuery)。

 function anchorClick(link) {
 
var linkSplit = link.split('/').pop();
 

$.get('api/' + linkSplit, function(data) {
 


$('#content').html(data);
 

});
 
} 

再定义鼠标的click事件。

$('#container').on('click', 'a', function(e) {
 

window.history.pushState(null, null, $(this).attr('href'));
 

anchorClick($(this).attr('href'));
 

e.preventDefault();
 
});

还要考虑到用户点击浏览器的"前进 / 后退"按钮。这时会触发History对象的popstate事件。

 window.addEventListener('popstate', function(e) {  
 
anchorClick(location.pathname); 
 
}); 

定义完上面三段代码,就能在不刷新页面的情况下,显示正常路径URL和AJAX内容。

最后,设置服务器端。

因为不使用井号结构,每个URL都是一个不同的请求。所以,要求服务器端对所有这些请求,都返回如下结构的网页,防止出现404错误。

  <html>
 
<body>
 


<section id='container'></section>
 


<noscript>
 



... ...
 


</noscript>
 

</body>
 
</html>

仔细看上面这段代码,你会发现有一个noscript标签,这就是奥妙所在。

我们把所有要让搜索引擎收录的内容,都放在noscript标签之中。这样的话,用户依然可以执行AJAX操作,不用刷新页面,但是搜索引擎会收录每个网页的主要内容!                  

Javascript 相关文章推荐
让任务管理器中的CPU跳舞的js代码
Nov 01 Javascript
JQuery 学习笔记 选择器之三
Jul 23 Javascript
JS按位非(~)运算符与~~运算符的理解分析
Jul 31 Javascript
javascript高级学习笔记整理
Aug 14 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
jquery动态增加删减表格行特效
Nov 20 Javascript
使用webpack打包koa2 框架app
Feb 02 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
Jul 31 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 Javascript
图文详解vue框架安装步骤
Feb 12 Javascript
JS操作字符串转数字的常见方法示例
Oct 29 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
Dec 07 #Javascript
小巧强大的jquery layer弹窗弹层插件
Dec 06 #Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
Dec 06 #Javascript
javascript字符串函数汇总
Dec 06 #Javascript
win7下安装配置node.js+express开发环境
Dec 06 #Javascript
分享使用AngularJS创建应用的5个框架
Dec 05 #Javascript
如何利用AngularJS打造一款简单Web应用
Dec 05 #Javascript
You might like
第十一节--重载
2006/11/16 PHP
php实现httpclient类示例
2014/04/08 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python实现名片管理系统
2020/02/14 Python
python内打印变量之%和f的实例
2020/02/19 Python
python 通过文件夹导入包的操作
2020/06/01 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
毕业求职自荐信格式是什么
2013/11/19 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
大学生学业生涯规划
2014/01/05 职场文书
公司表扬信格式
2015/05/04 职场文书
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
python实现商品进销存管理系统
2022/05/30 Python