全站Pjax,有能力的拿去用。

流年
流年
管理员
322
文章
447.8千
浏览
21,8171字数 1278阅读4分15秒

因为一点基础也没有,搞了好久,搞不定文章内容页JS加载问题,还有导航切换,插件的JS和css加载等等问题,无奈只好放弃。。。    最下面有源码下载。

  1. jQuery(document).ready(function($){
  2. var ajx_main = '#content' , // 要替换的主体id,改为你文章部分的容器
  3. ajx_a = 'a' , // a标签,自己添加排除规则
  4. ajx_comt = 'comments' , // 整个评论区的id ,不加#
  5. ajx_submit_form = '#comment_form' , // 提交按钮所在的表单
  6. ajx_comtlist = '.comment-list' , // 评论列表id或class
  7. ajx_comtpagenav = '.pagenav' , // 评论分页导航的id或class
  8. ajx_comtpagenav_a = '.pagenav a' , // 评论分页导航的a标签
  9. ajx_sform = '.inlo-search form' , // 搜索表单form标签
  10. ajx_skey = '.s-key' ; // 搜索表单input标签内的id或class
  11. function reload_func(){
  12. // 这里放置需要重载的JS或函数
  13. }
  14. $(function() {
  15. a(); //pushState初始化执行一次
  16. });
  17. // 建立锚点函数,用于跳转后的滚动定位,使用这个主要是有侧栏评论带#号时能在请求后定位到该条评论的位置
  18. function body_am(id) {
  19. id = isNaN(id) ? $('#' + id).offset().top : id;
  20. $("body,html").animate({
  21. scrollTop: id
  22. }, 0);
  23. return false;
  24. }
  25. function to_am(url) {
  26. var anchor = location.hash.indexOf('#'); // 用indexOf检查location.href中是否含有'#'号,如果没有则返回值为-1
  27. anchor = window.location.hash.substring(anchor + 1);
  28. body_am(anchor);
  29. }
  30. // 主页地址,用于下面的提交函数
  31. var home_url = document.location.href.match(/http:\/\/([^\/]+)\//i)[0];
  32. // 函数: 替换url,用于评论ajax提交
  33. function replaceUrl(url, domain) {
  34. return url.replace(/http:\/\/([^\/]+)\//i, domain);
  35. }
  36. // 函数:从封装的Json获取
  37. function getFormJson(frm) {
  38. var o = {};
  39. var a = $(frm).serializeArray();
  40. $.each(a,
  41. function() {
  42. if (o[this.name] !== undefined) {
  43. if (!o[this.name].push) {
  44. o[this.name] = [o[this.name]];
  45. }
  46. o[this.name].push(this.value || '');
  47. else {
  48. o[this.name] = this.value || '';
  49. }
  50. });
  51. return o;
  52. }
  53. // 函数:更新浏览器历史缓存(用于浏览器后退)
  54. function l(){
  55. history.replaceState( // 刷新历史点保存的数据,给state填入正确的内容
  56. { url: window.document.location.href,
  57. title: window.document.title,
  58. html: $(document).find(ajx_main).html(), // 抓取主体部分outerHTML用于呈现新的主体。也可以用这句 html: $(ajx_main).prop('outerHTML'),
  59. }, window.document.title, document.location.href);
  60. }
  61. // 函数:页面载入初始一次,解决Chrome浏览器初始载入时产生ajax效果的问题,并且监听前进后退事件
  62. function a(){
  63. window.addEventListener( 'popstate', function( e ){ //监听浏览器后退事件
  64. if( e.state ){
  65. document.title = e.state.title;
  66. $(ajx_main).html( e.state.html ); //也可以用replaceWith ,最后这个html就是上面替换State后里面的html值
  67. // 重载js
  68. window.load = reload_func(); // 重载函数
  69. }
  70. });
  71. }
  72. //函数:AJAX核心
  73. function ajax(reqUrl, msg, method, data) {
  74. if (msg == 'pagelink' || msg == 'search') { // 页面、搜索
  75. $(ajx_main).fadeTo('slow',0.6);
  76. else if ( msg == 'comment' ){ // 评论提交
  77. $('#' + ajx_comt).fadeTo('slow',0.5);
  78. else if ( msg == 'comtpagenav' ){ // 评论分页时
  79. $(ajx_comtlist).fadeTo('slow',0.5);
  80. $(ajx_comtpagenav).fadeTo('slow',0.8);
  81. }
  82. $.ajax({
  83. url: reqUrl,
  84. type: method,
  85. data: data,
  86. beforeSend : function () { //加载前操作 这个必须放在window.history.pushState()之前,否则会出现逻辑错误。
  87. l(); //刷新历史点内容,这个必须放在window.history.pushState()之前,否则会出现逻辑错误。
  88. },
  89. success: function(data) {
  90. if (msg == 'pagelink' || msg == 'search') { // 又如果msg为 页面 或 搜索—— 【1】
  91. $(ajx_main).html($(data).find(ajx_main).html()) ; // 替换原#main的内容
  92. $(ajx_main).fadeTo('normal',1);
  93. else if (msg == 'comment') { // 又如果msg为 评论回复——————————【2】
  94. $('#' + ajx_comt).html($(data).find('#' + ajx_comt).html());// 评论列表滑出
  95. $('#' + ajx_comt).fadeTo('normal',1);
  96. $("body,html").animate({scrollTop:$('#'+ajx_comt).offset().top}, 900); // 定位返回评论ID顶部
  97. else if (msg == 'comtpagenav') { // 又如果msg为 评论分页——【3】
  98. var content = $(data).find(ajx_main).html();
  99. var pagedstring = $(data).find(ajx_comtpagenav).html();
  100. $(ajx_main).html(content);
  101. $(ajx_comtpagenav).html(pagedstring);
  102. $(ajx_comtlist).fadeTo('normal',1); // 评论列表显示
  103. $(ajx_comtpagenav).fadeTo('normal',1); // 评论分页显示
  104. $("body,html").animate({scrollTop:$(ajx_comtlist).offset().top}, 600);
  105. }
  106. document.title = $(data).filter("title").text(); // 浏览器标题变更
  107. if (msg != 'comment') { // —— 不为后退 也 不为评论回复时
  108. var state = { // 设置state参数
  109. url: reqUrl,
  110. title: $(data).filter("title").text(),
  111. html: $(data).find(ajx_main).html(),
  112. };
  113. // 将当前url和历史url添加到浏览器当中,用于后退。里面三个值分别是: state, title, url
  114. window.history.pushState(state, $(data).filter("title").text(), reqUrl);
  115. }
  116. },
  117. complete: function() { // ajax完成后加载
  118. // 代码重载区
  119. if (msg == 'pagelink') { // 若msg为 页面链接
  120. to_am(reqUrl) ;// 定位到相应链接位置,这个必须放在window.history...之后执行,否则遇到带#号的链接,再点击其他链接地址栏就无法改变
  121. }
  122. window.load = reload_func(); // 重载函数
  123. },
  124. timeout: 5000, // 超时长度
  125. error: function(request) { // 错误时的处理
  126. if (msg == msg == 'pagelink' || msg == 'search'){
  127. location.href = reqUrl; //直接刷新跳转到请求的页面链接
  128. else if (msg == 'comment') { // 若msg为评论回复
  129. alert($(request.responseText).filter("p").text()); // 弹出警告,这个是必需的,如果删除那么提交错误时就会打开空白页面
  130. $('#' + ajx_comt).fadeTo('normal',1);
  131. else if ( msg == 'comtpagenav' ) {
  132. $(ajx_comtlist).fadeTo('normal',1); // 警告后评论区显示
  133. $(ajx_comtpagenav).fadeTo('normal',1); // 警告后评论区显示
  134. else {
  135. location.href = reqUrl; //页面错误时跳转到请求的页面
  136. }
  137. },
  138. });
  139. }
  140. //页面ajax
  141. $('body').on("click",ajx_a,
  142. function() {
  143. ajax($(this).attr("href"), 'pagelink');
  144. return false;
  145. });
  146. //评论ajax
  147. $('body').on('submit',ajx_submit_form,
  148. function() {
  149. ajax(replaceUrl(this.action, home_url), 'comment', 'POST', getFormJson(this));
  150. return false;
  151. });
  152. //搜索ajax
  153. $('body').on('submit',ajx_sform,
  154. function() {
  155. ajax(this.action + '?s=' + $(this).find(ajx_skey).val(), 'search');
  156. return false;
  157. });
  158. //评论分页ajax
  159. $('body').on("click",ajx_comtpagenav_a,
  160. function() {
  161. ajax($(this).attr("href"), 'comtpagenav');
  162. return false;
  163. });
  164. });

流年
  • 本文由 流年 发表于2015年11月16日 19:46:38
  • 除非特殊声明,本站文章均为原创,需要转载,请留言说明!
评论  2  访客  1  作者  1
    • icss.me
      icss.me 0

      一直好想学下动态加载,就学不会从哪下手,你站好多知识让我益了,好多特效我也做过,对比你的方法,才发现这才是大神的方法,学习了!欢迎回访。

    匿名

    发表评论

    匿名网友
    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
    确定

    拖动滑块以完成验证