SheepChef Blog
何時までも夢へ求めてる
SheepChef Blog

WordPress实现全站AJAX,附注意事项

前注:本文有部分内容转载自 https://hilau.com/5/

这几天给自己的博客加了一个音乐播放器,但是点击链接跳转到其他页面时,整个页面都会刷新,包括我播放器所在的footer,致使音乐播放中断,体验十分不好,后来发现AJAX可以解决这个问题

Tip:AJAX即局部加载网页,可以显著提升加载速度,具体可以上网百度一下~~

可惜的是,百度上很多转载的所谓AJAX.js都是会报错,与网站不兼容,所以我找到了一个能用的,在这里把源码发一下:

//全局变量
//注意:这里用的选择器是jQuery,使用前确保你引入了jQuery
//注意:这里jQuery可能不兼容,你可以先在控制台试一下,如果不兼容,尝试把jQuery改成 $
//注意,这里你需要把#centent改成你想在你网站上实现异步加载的区域的id或者class名称,ID前要加#号
var ajaxBinded = false;
jQuery(document).ready(function() {
       //下面三行你可以插入到你的jQuery(document).ready(function()里面,html5的历史记录API
    if( history && history.pushState){
       //为真就执行Ajaxopt函数
        Ajaxopt();
    }
})
//Ajaxopt函数
function Ajaxopt(){
         //所有不为新窗口打开的链接
    jQuery('a[target!=_blank]').live('click',function(event){
        var link = event.currentTarget;
        var url = link.href;
        if ( event.which > 1 || event.metaKey || event.ctrlKey )
        return
        if ( location.protocol !== link.protocol || location.host !== link.host ){
            return;
        }
        if (link.hash && link.href.replace(link.hash, '') === location.href.replace(location.hash, ''))
        return
        if (url.indexOf("respond")>0||url.indexOf("/wp-admin/")>0||url.indexOf("wp-login.php")>0||url.indexOf("sitemap.xml")>0||url.indexOf("/nextcloud/")>0||url.indexOf("/crack-beta.php")>0||url.indexOf("/file-download/")>0)
        return
                //以上条件语句均为判断链接时候需要ajax加载,下面2句为执行loadDate函数进行ajax操作。
               
        loadData(url,true);
        event.preventDefault();
    });
}
//loadDate函数
function loadData(url,toPush){
//进行AJAX操作
jQuery.ajax({
url:url,
data: "soz=ajax", //这个可以参考ajax全站加载系列文章第二篇。
dataType: "html",
type: "post",
beforeSend:function(jqXHR, settings){ //加载前操作 #centent的DIV变化
jQuery('#centent').fadeTo(500,0.3);
}
,
complete:function(){ //加载后操作 #centent的DIV变化
setTimeout("jQuery('#centent').fadeTo(200,1)",100);
}
,
success:function(message){ //加载成功的操作
var msger = message;
var titl1 = jQuery(message).find("h1:first").text();
var titl2 = jQuery(message).find("h2:first").text();
if (titl1 == "") {
window.document.title = titl2 + " \u2502 \u221a";
}
else {
window.document.title = titl1 + " \u2502 \u221a";
}
//以上几句为组合新页面的标题。下面一句为插入ajax回来的内容到"#centent"的DIV容器内。
jQuery("#centent").html(msger);
if(toPush){//使用html5的特有API 来改变历史记录数据。
window.history.pushState(null, titl1, url);
}
if(!ajaxBinded){//ajax后重新绑定新加载页面的ajax事件。
ajaxBinded = true;
jQuery(window).bind('popstate', function(e){
loadData(location.href,false);
return false;
});
}
document.getElementById("logo").scrollIntoView();//这里是我自己加的,用来回到页面顶部
}
,
error: function() {//如果加载失败 报错内容
alert("AJAX页面由于您自身的网络原因加载失败!请检查网络和浏览器控制台!");
throw("AJAX加载失败,请刷新页面!!!");
},
});
}
//这个脚本主要内容来自https://hilau.com/5/

把上面的JS放进js文件里,然后把它丢到你网站随便哪个目录底下,然后在你主题的header.php里面插入:

<script type="text/javascript" src="path/AJAX.js"></script>

注意,上方的path是你网站到达js文件的路径,自己修改。

正确配置这一切之后,就可以看到加载效果了,加载速度也有了比较大的提升。当然,如果你有什么不想刷新的js或者是内容的话,可以放到footer里面,例如我的音乐播放器。

我最后还是要评测一下,我博客配置完Ajax之后,那些兼容性踩过的坑。

1.Ajax不兼容页面加载动画,至少不能完美兼容,因为加载动画的主题要刷新,但是把刷新动画删掉的js却必须要写在footer里面,致使首次进入网站时动画加载正常,但是点击链接跳转时AJAX会不刷新执行清除js导致动画无法被正常关闭。

2.AJAX不兼容某些内嵌Js,如果有一些JS必需在每次打开界面时都要加载刷新,但是AJAX可能会忽略那些JS从而导致某些插件不能正常加载。

3.AJAX与一些WordPress插件不兼容,在使用AJAX刷新时,插件的JS不能正常应用于新加载出来的html。

关于这些问题的解决方法,请看下文:

关于第一种问题,我没有好的解决办法,只能是在AJAX的JS里面添加remove语句,具体可以这样写:

jQuery(selector).remove()//删除指定的元素

通过remove指令在页面加载后移除加载动画。

第二种可以修改主题文件,把JS直接写进去,或者自己写JS进行动态加载:

function loadScript(src) {//这里是加载JS的方法,可以写在JS文件里
  var script = document.createElement('script'),
    head = document.getElementsByTagName('head')[0];
  script.type = 'text/javascript';
  script.charset = 'UTF-8';
  script.src = src;
  if (script.addEventListener) {
    script.addEventListener('load', function () {
      
    }, false);
  } else if (script.attachEvent) {
    script.attachEvent('onreadystatechange', function () {
      var target = window.event.srcElement;
      if (target.readyState == 'loaded') {
     
      }
    });
  }
  head.appendChild(script);
}
//#######################################
//调用方法为
loadScript(src);//src为JS文件路径
//这样就可以动态加载JS了

关于第三种问题,我有我自己的解决方法,我用的插件是 SyntaxHighlighter ,这个插件只要加载JS和CSS以后,只要执行一个函数就可以将页面上所有的代码进行高亮:

SyntaxHighlighter.highlight();
//这个可以放进上面AJAX的加载完成后操作里

好啦,这篇文章就写到这,如果你想知道更多,欢迎留言!

3.5 2 投票数
文章评分
感谢您一直阅读到本文的最后!
如果您觉得本文写得不错,欢迎您转发支持我们。
# # # #
首页      IT技术      WordPress实现全站AJAX,附注意事项
Avatar photo

SheepChef

文章作者

Webmaster

订阅评论
提醒
guest
1 评论
最新
最旧 最多投票
内联反馈
查看所有评论

SheepChef Blog

WordPress实现全站AJAX,附注意事项
Wordpress如何实现全站AJAX?如何解决那些随之而来的兼容性问题?这里有你想找的答案!
扫描二维码继续阅读
2020-02-17