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 相关文章推荐
悄悄用脚本检查你访问过哪些网站的代码
Dec 04 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
Node.js的特点和应用场景介绍
Nov 04 Javascript
HTML5实现留言和回复页面样式
Jul 22 Javascript
JavaScript对Cookie进行读写操作实例
Jul 25 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
js选项卡的制作方法
Jan 23 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
vue项目优化之通过keep-alive数据缓存的方法
Dec 11 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
vue项目中锚点定位替代方式
Nov 13 Javascript
JS实现关闭小广告特效
Jan 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
PHP之变量、常量学习笔记
2008/03/27 PHP
使用PHP批量生成随机用户名
2008/07/10 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
javascript防抖函数debounce详解
2019/06/11 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
python实现从ftp服务器下载文件的方法
2015/04/30 Python
python实现中文分词FMM算法实例
2015/07/10 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python常用特殊方法实例总结
2019/03/22 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
python可迭代对象去重实例
2020/05/15 Python
python中turtle库的简单使用教程
2020/11/11 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
行政管理人员精品工作推荐信
2013/11/04 职场文书
自我鉴定四大框架
2014/01/17 职场文书
xxx同志考察材料
2014/02/07 职场文书
师范生求职信
2014/06/14 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
导游词之河北野三坡
2019/12/11 职场文书
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers