全站 ajax 加载网站的用户体验是很奇妙的,全程浏览网站期间看不到任何浏览器刷新的迹象,点击网站上的链接,如果网站的速度可以的话,会给人一种瞬间加载的顺滑感觉,同时不失有高大上的感觉。
现在我看到很多 WordPress 网站已经部署上了全站 ajax 加载代码,效果也不错,所以我也在 lipop 主题中设置了全站局部刷新的 ajax 代码。全站 ajax 看似技术复杂,但是实际上操作起来非常简易,原因是已经有大神写好了相关的函数,任何开发者只要稍微修改一下参数,就可以轻松改造自己的网站。
全站 ajax 代码的来源是从 WordPress 插件中提取出来的,作者是英国的卢克和威廉姆斯。这款代码适用范围非常广,不仅 WordPress 网站可以使用,只要结构统一完整的网站都可以使用,只需要简单的几部就可以改造完成。
ajax 代码部分
- var ajaxhome='';
- var ajaxcontent = 'content';
- var ajaxsearch_class = 'searchform';
- var ajaxignore_string = new String('#, /wp-, .pdf, .zip, .rar, /goto');
- var ajaxignore = ajaxignore_string.split(', ');
- var ajaxloading_code = 'loading';
- var ajaxloading_error_code = 'error';
- var ajaxreloadDocumentReady = false;
- var ajaxtrack_analytics = false
- var ajaxscroll_top = true
- var ajaxisLoad = false;
- var ajaxstarted = false;
- var ajaxsearchPath = null;
- var ajaxua = jQuery.browser;
- jQuery(document).ready(function() {
- ajaxloadPageInit("");
- });
- window.onpopstate = function(event) {
- if (ajaxstarted === true && ajaxcheck_ignore(document.location.toString()) == true) {
- ajaxloadPage(document.location.toString(),1);
- }
- };
- function ajaxloadPageInit(scope){
- jQuery(scope + "a").click(function(event){
- if (this.href.indexOf(ajaxhome) >= 0 && ajaxcheck_ignore(this.href) == true){
- event.preventDefault();
- this.blur();
- var caption = this.title || this.name || "";
- var group = this.rel || false;
- try {
- ajaxclick_code(this);
- } catch(err) {
- }
- ajaxloadPage(this.href);
- }
- });
- jQuery('.' + ajaxsearch_class).each(function(index) {
- if (jQuery(this).attr("action")) {
- ajaxsearchPath = jQuery(this).attr("action");;
- jQuery(this).submit(function() {
- submitSearch(jQuery(this).serialize());
- return false;
- });
- }
- });
- if (jQuery('.' + ajaxsearch_class).attr("action")) {} else {
- }
- }
- function ajaxloadPage(url, push, getData){
- if (!ajaxisLoad){
- if (ajaxscroll_top == true) {
- jQuery('html,body').animate({scrollTop: 0}, 1500);
- }
- ajaxisLoad = true;
- ajaxstarted = true;
- nohttp = url.replace("http://","").replace("https://","");
- firstsla = nohttp.indexOf("/");
- pathpos = url.indexOf(nohttp);
- path = url.substring(pathpos + firstsla);
- if (push != 1) {
- if (typeof window.history.pushState == "function") {
- var stateObj = { foo: 1000 + Math.random()*1001 };
- history.pushState(stateObj, "ajax page loaded...", path);
- } else {
- }
- }
- if (!jQuery('#' + ajaxcontent)) {
- }
- jQuery('#' + ajaxcontent).append(ajaxloading_code);
- jQuery('#' + ajaxcontent).fadeTo("slow", 0.4,function() {
- jQuery('#' + ajaxcontent).fadeIn("slow", function() {
- jQuery.ajax({
- type: "GET",
- url: url,
- data: getData,
- cache: false,
- dataType: "html",
- success: function(data) {
- ajaxisLoad = false;
- datax = data.split('<title>');
- titlesx = data.split('</title>');
- if (datax.length == 2 || titlesx.length == 2) {
- data = data.split('<title>')[1];
- titles = data.split('</title>')[0];
- jQuery(document).attr('title', (jQuery("<div/>").html(titles).text()));
- } else {
- }
- if (ajaxtrack_analytics == true) {
- if(typeof _gaq != "undefined") {
- if (typeof getData == "undefined") {
- getData = "";
- } else {
- getData = "?" + getData;
- }
- _gaq.push(['_trackPageview', path + getData]);
- }
- }
- data = data.split('id="' + ajaxcontent + '"')[1];
- data = data.substring(data.indexOf('>') + 1);
- var depth = 1;
- var output = '';
- while(depth > 0) {
- temp = data.split('</div>')[0];
- i = 0;
- pos = temp.indexOf("<div");
- while (pos != -1) {
- i++;
- pos = temp.indexOf("<div", pos + 1);
- }
- depth=depth+i-1;
- output=output+data.split('</div>')[0] + '</div>';
- data = data.substring(data.indexOf('</div>') + 6);
- }
- document.getElementById(ajaxcontent).innerHTML = output;
- jQuery('#' + ajaxcontent).css("position", "absolute");
- jQuery('#' + ajaxcontent).css("left", "20000px");
- jQuery('#' + ajaxcontent).show();
- ajaxloadPageInit("#" + ajaxcontent + " ");
- if (ajaxreloadDocumentReady == true) {
- jQuery(document).trigger("ready");
- }
- try {
- ajaxreload_code();
- } catch(err) {
- }
- jQuery('#' + ajaxcontent).hide();
- jQuery('#' + ajaxcontent).css("position", "");
- jQuery('#' + ajaxcontent).css("left", "");
- jQuery('#' + ajaxcontent).fadeTo("slow", 1, function() {});
- },
- error: function(jqXHR, textStatus, errorThrown) {
- ajaxisLoad = false;
- document.title = "Error loading requested page!";
- document.getElementById(ajaxcontent).innerHTML = ajaxloading_error_code;
- }
- });
- });
- });
- }
- }
- function submitSearch(param){
- if (!ajaxisLoad){
- ajaxloadPage(ajaxsearchPath, 0, param);
- }
- }
- function ajaxcheck_ignore(url) {
- for (var i in ajaxignore) {
- if (url.indexOf(ajaxignore[i]) >= 0) {
- return false;
- }
- }
- return true;
- }
- function ajaxreload_code() {
- //add code here
- }
- function ajaxclick_code(thiss) {
- jQuery('ul.nav li').each(function() {
- jQuery(this).removeClass('current-menu-item');
- });
- jQuery(thiss).parents('li').addClass('current-menu-item');
- }
代码部分需要根据自己的实际修改一小部分:
1、第一行 ajaxhome 填写网站的访问网址;
2、第二行 ajaxcontent 填写网站文章的容器id名称,即异步加载的部分;
3、第三行 ajaxsearch_class 填写网站搜索框的容器名称,一般都是“searchform”;
4、第四行 ajaxignore_string 是忽略使用ajax加载的链接,比如说feed源等等;
5、第六行 ajaxloading_code 加载时显示的内容,可以设定动画;
6、第七行 ajaxloading_error_code 加载失败时显示的内容,可以设定动画。
只要按照上述要求修改好代码,单独存放为 JS 文件并且引入网页之中,效果立竿见影。有木有很神奇的感觉。
ajax异步加载影响其他jQuery特效
部署上 ajax 异步加载代码后,会出现一个问题,首次打开网站后,jQuery 动画都会正常运行,但是点击网页执行了 ajax 异步加载之后,所有的动画都会失效。这是因为进行异步加载后 jQuery 代码无法获取元素,特效自然消失,为解决这个问题,还需要对 jQuery 代码进行改造。
解决方式是使用 live()
事件,live()
事件的用法如下:
- $(selector).live(event,data,function)
event 用来替换 click()
、hover()
等动作;data 可选,是参数;function 是需要执行的动作。
举个例子,一个 click()
事件改写为 live()
事件,原本代码是这样:
- $(".menu-item").click(function(){$(".topmenu").fadeOut(500)});
修改之后:
- $(".menu-item").live("click",function(){$(".topmenu").fadeOut(500)});
可以感受一下。
jQuery加载动画精选
加载动画是纯 CSS3 动画,自然是不支持低版本浏览器了。动画分两个部分:HTML 代码和 CSS 代码,HTML代码放置在ajax文件中的 ajaxloading_code 之后,请注意,JavaScript 中禁止一句代码回车分行,所以需要把HTML 代码整理后存放。
效果一
HTML代码
- <div class="spinner">
- <div class="rect1"></div>
- <div class="rect2"></div>
- <div class="rect3"></div>
- <div class="rect4"></div>
- <div class="rect5"></div>
- </div>
CSS代码
- .spinner {
- margin: 100px;
- width: 50px;
- height: 60px;
- text-align: center;
- font-size: 10px;
- }
- .spinner > div {
- background-color: #67CF22;
- height: 100%;
- width: 6px;
- display: inline-block;
- -webkit-animation: stretchdelay 1.2s infinite ease-in-out;
- animation: stretchdelay 1.2s infinite ease-in-out;
- }
- .spinner .rect2 {
- -webkit-animation-delay: -1.1s;
- animation-delay: -1.1s;
- }
- .spinner .rect3 {
- -webkit-animation-delay: -1.0s;
- animation-delay: -1.0s;
- }
- .spinner .rect4 {
- -webkit-animation-delay: -0.9s;
- animation-delay: -0.9s;
- }
- .spinner .rect5 {
- -webkit-animation-delay: -0.8s;
- animation-delay: -0.8s;
- }
- @-webkit-keyframes stretchdelay {
- 0%, 40%, 100% { -webkit-transform: scaleY(0.4) }
- 20% { -webkit-transform: scaleY(1.0) }
- }
- @keyframes stretchdelay {
- 0%, 40%, 100% {
- transform: scaleY(0.4);
- -webkit-transform: scaleY(0.4);
- } 20% {
- transform: scaleY(1.0);
- -webkit-transform: scaleY(1.0);
- }
- }
效果演示
效果二
HTML代码
- <div class="spinner"></div>
CSS代码
- .spinner {
- width: 60px;
- height: 60px;
- background-color: #67CF22;
- margin: 100px;
- -webkit-animation: rotateplane 1.2s infinite ease-in-out;
- animation: rotateplane 1.2s infinite ease-in-out;
- }
- @-webkit-keyframes rotateplane {
- 0% { -webkit-transform: perspective(120px) }
- 50% { -webkit-transform: perspective(120px) rotateY(180deg) }
- 100% { -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) }
- }
- @keyframes rotateplane {
- 0% {
- transform: perspective(120px) rotateX(0deg) rotateY(0deg);
- -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg)
- } 50% {
- transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
- -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg)
- } 100% {
- transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
- -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
- }
- }
效果演示
动态效果为正方片旋转。
效果三
HTML代码
- <div class="spinner">
- <div class="bounce1"></div>
- <div class="bounce2"></div>
- <div class="bounce3"></div>
- </div>
CSS 代码
- .spinner {
- margin: 100px;
- width: 150px;
- text-align: center;
- }
- .spinner > div {
- width: 30px;
- height: 30px;
- background-color: #67CF22;
- border-radius: 100%;
- display: inline-block;
- -webkit-animation: bouncedelay 1.4s infinite ease-in-out;
- animation: bouncedelay 1.4s infinite ease-in-out;
- -webkit-animation-fill-mode: both;
- animation-fill-mode: both;
- }
- .spinner .bounce1 {
- -webkit-animation-delay: -0.32s;
- animation-delay: -0.32s;
- }
- .spinner .bounce2 {
- -webkit-animation-delay: -0.16s;
- animation-delay: -0.16s;
- }
- @-webkit-keyframes bouncedelay {
- 0%, 80%, 100% { -webkit-transform: scale(0.0) }
- 40% { -webkit-transform: scale(1.0) }
- }
- @keyframes bouncedelay {
- 0%, 80%, 100% {
- transform: scale(0.0);
- -webkit-transform: scale(0.0);
- } 40% {
- transform: scale(1.0);
- -webkit-transform: scale(1.0);
- }
- }
效果演示
动画效果为三个圆点依次收缩放大
ajax 局部加载对 SEO 的猜想
ajax 加载网站的方式可能会让一部分习惯浏览常规网站的人感觉不适应,人都如此,那么搜索引擎蜘蛛呢?对于 ajax 是否对 SEO 有消极影响的问题,很多人都有自己的见解。在我认为 ajax 对网站 SEO 没有任何影响,因为根据蜘蛛抓取网页的思路来讲,蜘蛛进入网站后抓取内容吗,然后探索其他链接地址,进行下一页的抓取。所以只要保证了网页链接没有问题,网站内容有保证,ajax 跟搜索引擎蜘蛛没有多少关系,更别提是否有深仇大恨那么夸张了。全局 ajax 处理过的网站,就像是附着在网站上的特效工具,可有可无,跟网站的内容是剥离明晰的,蜘蛛更加关心的是 HTML 网页中的内容,所以做好网站内容和基本的 SEO 优化即可。
感谢你的赏识与认可
支付宝
微信支付
使用手机访问这篇文章
本文许可协议 © CC BY-NC-SA 4.0 转载请注明来源
有插件就好了
有插件的,因为这些代码都是从插件里面拆下来的,但是插件拖累速度啊。
Jquery把这些问题都简化得不再难以入门了…现在无论是ajax或者是pjax都很容易实现了。
大叔为毛输入框信息在输入框下面 ´▽` 有点不习惯,输错了都
没弄好 ´▽` 感觉好复杂,话说你说这个是从插件里提去的,那有插件么
大叔。。。咱还很年轻啊。介于你这么说咱家,只好给你个反人类的输入框玩玩了。插件我没接触过,强迫症不需要插件。
感谢