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 相关文章推荐
将两个div左右并列显示并实现点击标题切换内容
Oct 22 Javascript
Jquery 点击按钮自动高亮实现原理及代码
Apr 25 Javascript
JavaScript实现列出数组中最长的连续数
Dec 29 Javascript
详解JavaScript中shift()方法的使用
Jun 09 Javascript
jquery判断对象是否为空并遍历对象的简单实例
Jul 26 Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
Jun 20 Javascript
vue父子组件的嵌套的示例代码
Sep 08 Javascript
详解webpack打包后如何调试的方法步骤
Nov 07 Javascript
[jQuery] 事件和动画详解
Mar 05 jQuery
vue.js中使用echarts实现数据动态刷新功能
Apr 16 Javascript
es6中reduce的基本使用方法
Sep 10 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
PHP产生随机字符串函数
2006/12/06 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
跟老齐学Python之用Python计算
2014/09/12 Python
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书