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 eval和JSON之间的联系
Dec 31 Javascript
JavaScript必知必会(九)function 说起 闭包问题
Jun 08 Javascript
浅析$(function) ready和onload 的区别
Sep 03 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
基于JS递归函数细化认识及实用实例(推荐)
Aug 07 Javascript
React Native AsyncStorage本地存储工具类
Oct 24 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
May 25 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
详解easyui 切换主题皮肤
Apr 04 Javascript
如何对react hooks进行单元测试的方法
Aug 14 Javascript
tracking.js实现前端人脸识别功能
Apr 16 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
Oct 02 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/06/20 PHP
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php解析url的三个示例
2014/01/20 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
初识PHP
2014/09/28 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
PHP时间类完整代码实例
2021/02/26 PHP
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
python 读写中文json的实例详解
2017/10/29 Python
python针对excel的操作技巧
2018/03/13 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
Python collections模块使用方法详解
2019/08/28 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
python能开发游戏吗
2020/06/11 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
早安问候语大全
2015/11/10 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
vue实现在data里引入相对路径
2022/06/05 Vue.js