整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript庫hxsfx.ajax之解決動態加載HTML

          最近寫博客真的是太痛苦了,倒不是寫博客本身,而是寫完之后往多個平臺發布的過程,一不注意就是十多分鐘往上的時間消耗。

          為了解決這個問題,之前立項的“解決自媒體一鍵多平臺發布”項目必須得立刻著手完善了,爭取早日讓自己從發布這件事情上解脫出來專心寫文章。

          【hxsfx的JavaScript庫】這個系列基本上是為“一鍵多平臺發布”項目打基礎用的。之所以把各個功能模塊拆分出來,是為了盡量讓小伙伴能夠復制即用(在兼容性方面,因為個人能力的原因,幾乎只會兼容Chrome瀏覽器)。


          hxsfx.ajax庫

          (一)介紹

          AJAX 是異步的 JavaScript 和 XML(Asynchronous JavaScript And XML),開發hxsfx.ajax庫的主要目的就是希望通過異步加載HTML,從而盡量避免直接在js中寫HTML來刷新頁面內容。

          hxsfx.ajax這個庫與jquery的ajax功能基本一致,不過短時間內應該是寫不到人家那么完善的。哈哈~

          各位小伙伴別問,為什么不用jquery的ajax而要自己再寫一個呢?

          問就是,博主喜歡造輪子。開玩笑了~

          其實原因是為了減少三方庫的依賴,達到對項目的全面掌控。

          項目地址:https://github.com/hxsfx/hxsfx_web_tools

          (二)代碼

          要自己開發一個ajax庫,需要借助Web API接口中的XMLHttpRequest(XHR)對象。

          XMLHttpRequest(XHR)對象用于與服務器交互。通過 XMLHttpRequest 可以在不刷新頁面的情況下請求特定 URL,獲取數據。這允許網頁在不影響用戶操作的情況下,更新頁面的局部內容。

          1、在window對象上新建一個hxsfx對象,本系列的所有庫基本都會在hxsfx對象之中:

          //hxsfx.js
          (function () {
              window.hxsfx = {};
          })();

          2、在hxsfx對象的基礎上新建一個ajax對象:

          //ajax.js
          (function () {
              window.hxsfx.ajax = {
              };
          })();

          3、在ajax對象中新建loadHTML方法,設置兩個參數,分別是ele準備加載HTML的容器元素和url加載HTML的地址:

          //ajax.js
          (function () {
              window.hxsfx.ajax = {
                  loadHTML: function (ele, url) {
                  }
              };
          })();

          4、在loadHTML方法中新建XMLHttpRequest對象:

          //ajax.js
          (function () {
              window.hxsfx.ajax = {
                  loadHTML: function (ele, url) {
                      const httpRequest = new XMLHttpRequest();
                      httpRequest.open('GET', url, true);
                      httpRequest.onreadystatechange = function () {
                          //為了讓代碼更健壯,使用try...catch來捕獲返回狀態判斷和處理HTML代碼的異常
                          try {
                              if (httpRequest.readyState === XMLHttpRequest.DONE) {
                                  if (httpRequest.status === 200) {
                                        //在這處理返回的HTML
                                      }
                                  }
                                  else {
                                      console.log("【ajax.get(" + url + ")請求出錯】");
                                  }
                              }
                          }
                          catch (ex) {
                              console.log("【ajax.get(" + url + ")異?!?#34; + ex.message);
                          }
                      };
                      httpRequest.send();
                  }
              };
          })();

          5、為了解決加載HTML緩存的問題,將loadHTML方法中傳入的URL參數后面加上一個時間戳:

          //ajax.js
          //時間戳用來解決加載頁面緩存的問題
          var urlTimeStamp = "timeStamp=" + new Date().getTime();
          url += ((url.indexOf('?') >= 0) ? "&" : "?") + urlTimeStamp;

          6、【重點】在這處理返回的HTML時,如果直接將HTML加載到容器中,會出現HTML中Javascript代碼不執行的問題。解決這個問題,需要將加載的script標簽替換為script元素:

          //ajax.js
          ele.innerHTML = httpRequest.responseText;
          var scriptElements = ele.getElementsByTagName("script");
          for (var i = 0; i < scriptElements.length; i++) {
              var scriptElement = document.createElement("script");
              scriptElement.setAttribute("type", "text/javascript");
              var src = scriptElements[i].getAttribute("src");
              if (src) {
                  //因為加載的src路徑是之前相對加載HTML頁面的,需要修改為當前頁面的引用路徑
                  src = url.substring(0, url.lastIndexOf('/') + 1)  + src;
                  src += ((src.indexOf('?') >= 0) ? "&" : "?") + urlTimeStamp;
                  scriptElement.setAttribute("src", src);
              }
              var scriptContent = scriptElements[i].innerHTML;
              if (scriptContent) {
                  scriptElement.innerHTML = scriptContent;
              }
              //用生成的script元素去替換html中的script標簽,以此來激活script代碼
              ele.replaceChild(scriptElement, scriptElements[i]);
          }

          7、最后ajax.js完整代碼:

          //ajax.js
          (function () {
              window.hxsfx.ajax = {
                  loadHTML: function (ele, url) {
                      //時間戳用來解決加載頁面緩存的問題
                      var urlTimeStamp = "timeStamp=" + new Date().getTime();
                      url += ((url.indexOf('?') >= 0) ? "&" : "?") + urlTimeStamp;
                      const httpRequest = new XMLHttpRequest();
                      httpRequest.open('GET', url, true);
                      httpRequest.onreadystatechange = function () {
                          //為了讓代碼更健壯,使用try...catch來捕獲返回狀態判斷和處理HTML代碼的異常
                          try {
                              if (httpRequest.readyState === XMLHttpRequest.DONE) {
                                  if (httpRequest.status === 200) {
                                      ele.innerHTML = httpRequest.responseText;
                                      var scriptElements = ele.getElementsByTagName("script");
                                      for (var i = 0; i < scriptElements.length; i++) {
                                          var scriptElement = document.createElement("script");
                                          scriptElement.setAttribute("type", "text/javascript");
                                          var src = scriptElements[i].getAttribute("src");
                                          if (src) {
                                              //因為加載的src路徑是之前相對加載HTML頁面的,需要修改為當前頁
                                              src = url.substring(0, url.lastIndexOf('/') + 1) + src;
                                              src += ((src.indexOf('?') >= 0) ? "&" : "?") + urlTimeStamp;
                                              scriptElement.setAttribute("src", src);
                                          }
                                          var scriptContent = scriptElements[i].innerHTML;
                                          if (scriptContent) {
                                              scriptElement.innerHTML = scriptContent;
                                          }
                                          //用生成的script元素去替換html中的script標簽,以此來激活script代
                                          ele.replaceChild(scriptElement, scriptElements[i]);
                                      }
                                      }
                                  }
                                  else {
                                      console.log("【ajax.get(" + url + ")請求出錯】");
                                  }
                              }
                          }
                          catch (ex) {
                              console.log("【ajax.get(" + url + ")異常】" + ex.message);
                          }
                      };
                      httpRequest.send();
                  }
              };
          })();

          (三)調用文檔

          1、將hxsfx.js和ajax.js放入Scripts文件夾中的hxsfx文件夾

          2、在Scripts文件夾同級目錄新建index.html頁面

          <!DOCTYPE html>
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
              <title>js庫測試</title>
              <script src="Scripts/hxsfx/hxsfx.js"></script>
              <script src="Scripts/hxsfx/ajax.js"></script>
              <script>
                  window.onload = function () {
                          //調用ajax中的loadHTML方法
                      window.hxsfx.ajax.loadHTML(document.getElementById("ContentContainer"), "Views/test/testPage.html");
                  };
              </script>
          </head>
          <body>
              <div id="ContentContainer"></div>
          </body>
          </html>

          3、在Scripts文件夾同級目錄,首先新建Views文件夾,接著其中新建test文件夾,最后在test文件夾中新建testPage.html

          <style>
              div#TestPageContainer {
                  height: 300px;
                  width: 300px;
                  background-color: #F0F0F0;
              }
          </style>
          <script src="../../Scripts/hxsfx/test/test.js"></script>
          <script>
              function updateBackgroundColor() {
                  try {
                      var backgroundColor = '#' + (Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0'));
                      document.getElementById("TestPageContainer").style.backgroundColor = backgroundColor;
                  }
                  catch (ex) {
                      console.log(ex.message);
                  }
              }
          </script>
          <div id="TestPageContainer">
              <button onclick="updateBackgroundColor()">更改背景色</button>
              <button onclick="modifyPFontColor()">更改下面一句話的字體顏色</button>
              <p id="P">這兒是一句話。</p>
          </div>


          最后

          以上內容只是hxsfx.ajax庫的開始,后續的內容更新小伙伴可以通過訪問Github項目地址進行獲取。

          Query load() 方法

          jQuery load() 方法是簡單但強大的 AJAX 方法。

          load() 方法從服務器加載數據,并把返回的數據放入被選元素中。

          語法:

          $(selector).load(URL,data,callback);

          必需的 URL 參數規定您希望加載的 URL。

          可選的 data 參數規定與請求一同發送的查詢字符串鍵/值對集合。

          可選的 callback 參數是 load() 方法完成后所執行的函數名稱。

          這是示例文件("demo_test.txt")的內容:

          <h2>jQuery AJAX 是個非常棒的功能!</h2><pid="p1">這是段落的一些文本。</p>

          下面的例子會把文件 "demo_test.txt" 的內容加載到指定的 <div> 元素中:

          實例

          $("#div1").load("demo_test.txt");

          也可以把 jQuery 選擇器添加到 URL 參數。

          下面的例子把 "demo_test.txt" 文件中 id="p1" 的元素的內容,加載到指定的 <div> 元素中:

          實例

          $("#div1").load("demo_test.txt #p1");

          嘗試一下 ?

          可選的 callback 參數規定當 load() 方法完成后所要允許的回調函數。回調函數可以設置不同的參數:

          • responseTxt - 包含調用成功時的結果內容

          • statusTXT - 包含調用的狀態

          • xhr - 包含 XMLHttpRequest 對象

          下面的例子會在 load() 方法完成后顯示一個提示框。如果 load() 方法已成功,則顯示"外部內容加載成功!",而如果失敗,則顯示錯誤消息:

          實例

          $("button").click(function(){ $("#div1").load("demo_test.txt",function(responseTxt,statusTxt,xhr){if(statusTxt=="success")alert("外部內容加載成功!"); if(statusTxt=="error")alert("Error: "+xhr.status+": "+xhr.statusText); });});


          //HTML code
          //數據顯示區域div--job-homepage-list
          <div class="job-homepage-list" id="job-homepage-list">
               <ul class="clearfix">      
               </ul>
           </div>
          //點擊事件
          <a action-url="/接口地址/job_list_ajax?load_more=1" class="js_more-job">
            查看更多
          </a>
          //js code
          <script>
              // 查看更多
              var clickNum = 1,//默認點擊一次  
              url,param,strHtml,isLast,
              $eventList=$('#job-homepage-list'),errorHtml = '出現了網絡錯誤,請檢查您的網絡是否正常';
              (function(num){
                  $(document).off('click','.js_more-job').on('click','.js_more-job',function(){
                      num++;
                      var $t = $(this);
                      url = $t.attr('action-url');
                      param = {'page': num};
                      $.ajax({
                          url : url,
                          data: param,
                          dataType : 'json',
                          success : function(r){
                              if(r.code == 0){
                                  strHtml = r.data.list;
                                  isLast = r.data.is_last;
                                  $eventList.append(strHtml);//追加數據
                                  if(isLast == 1){
                                      $t.addClass('is-last');
                                  }else{
                                      $t.removeClass('is-last');
                                  }
                              }else{
                                  layer.msg(r.message);
                              }
                          },
                          error : function(){
                              layer.msg(errorHtml);
                          }
                      });
                  });
              })(clickNum);//clickNum
          </script>

          口返回數據

          返回的就是布局的ul數據,追加到指定的div中。


          主站蜘蛛池模板: 亚洲国产日韩一区高清在线| 免费人人潮人人爽一区二区| 国产无套精品一区二区| 中文字幕精品亚洲无线码一区 | 国产精品自拍一区| 一本AV高清一区二区三区| 日韩av片无码一区二区不卡电影| 国产剧情国产精品一区| 亚洲第一区二区快射影院| 久久精品人妻一区二区三区| 色综合视频一区中文字幕| 91一区二区视频| 亚洲一区二区三区高清视频| 久久无码精品一区二区三区| 色视频综合无码一区二区三区| 成人h动漫精品一区二区无码| 一区二区在线电影| 一区二区三区亚洲| 亚洲欧洲一区二区| 秋霞午夜一区二区| 日韩AV无码久久一区二区| 精品成人乱色一区二区| 亚洲视频一区二区在线观看| 亚洲一区二区三区日本久久九| 国产精品女同一区二区 | 国产品无码一区二区三区在线蜜桃| 亚洲日韩AV无码一区二区三区人| 国产乱码精品一区二区三区中| 无码人妻精品一区二区三区在线 | 麻豆一区二区三区精品视频| 亚洲福利一区二区三区| 亚欧免费视频一区二区三区| 亚洲国产一区二区三区在线观看| 免费高清av一区二区三区| 久久亚洲中文字幕精品一区四| 无码人妻精品一区二区三区夜夜嗨 | 国产成人高清亚洲一区久久| 日韩一区二区三区在线观看| 在线观看午夜亚洲一区| 国产精品免费一区二区三区四区| 国产精品久久一区二区三区|