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 相关文章推荐
jQuery $.each的用法说明
Mar 22 Javascript
js使用removeChild方法动态删除div元素
Aug 01 Javascript
js实现Select列表各项上移和下移的方法
Aug 14 Javascript
深入浅析JavaScript中数据共享和数据传递
Apr 25 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
Jun 22 Javascript
jquery单击文字或图片内容放大并居中显示
Jun 23 jQuery
使用原生js+canvas实现模拟心电图的实例
Sep 20 Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 Javascript
微信小程序左滑动显示菜单功能的实现
Jun 14 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
Feb 18 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
Jul 14 Javascript
swiperjs实现导航与tab页的联动
Dec 13 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制作万年历
2015/01/07 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
js null undefined 空区别说明
2010/06/13 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
浅谈关于axios和session的一些事
2017/07/13 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
Python中文件操作简明介绍
2015/04/13 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
蔻驰美国官网:COACH美国
2016/08/18 全球购物
男方父母婚礼答谢词
2014/01/25 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
班级年度安全计划书
2014/05/01 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
教师节感想
2015/08/11 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS