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 相关文章推荐
javascript权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
Jquery:ajax实现翻页无刷新功能代码
Aug 05 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
Nov 24 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
Nov 29 Javascript
javascript实现的网站访问量统计代码
Dec 20 Javascript
基于JavaScript实现百度搜索框效果
Jun 28 Javascript
JS基于贪心算法解决背包问题示例
Nov 27 Javascript
Nuxt.js实战详解
Jan 18 Javascript
原生js实现省市区三级联动代码分享
Feb 12 Javascript
简单了解JS打开url的方法
Feb 21 Javascript
解决Vue中使用keepAlive不缓存问题
Aug 04 Javascript
面试中canvas绘制图片模糊图片问题处理
Mar 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仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
vue router 配置路由的方法
2018/07/26 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
wxPython中文教程入门实例
2014/06/09 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
详解Swift中属性的声明与作用
2016/06/30 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
香港礼品网站:GiftU eshop
2017/09/01 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
2015年工会工作总结
2015/03/30 职场文书
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏