監聽DIV等標記的class屬性改變,實現onshow,onhide

貌似h5標記有click等事件的監聽,沒有show,hide等事件的監聽。用了一個tab樣式庫,想實現切換tab時刷新頁面數據,這個庫也沒說明招接口也不好找。看到他是在div的class屬性上面addClass("active show"),removeClass("active show"),來實現切換時的隱藏和顯示的。於是就想有沒有監聽class改變的方法,百度到 MutationObserver
用示例代碼測試了一下,果真可以。

<script>
    $(document).ready(function(){
        var targetNode = document.getElementById('article-original-review').parentNode;
        var config = { attributes: true };
        var callback = function(mutationsList) {
          for(var mutation of mutationsList) {
            if (mutation.type == 'attributes') {
                  if($(targetNode).hasClass("active")){
                    setTimeout(function(){ getlist()},100);  
                  }
              }
          }
        };
        var observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    });

    function getlist(){
      var newidolurl = "/api/private/";
      $.ajax({
          type: "POST",      //data 傳送數據類型。post 傳遞
          dataType: 'json',  // 返回數據的數據類型json
          contentType: "application/json; charset=utf-8",
          url: newidolurl,  // yii 控制器/方法
          cache: false,      
          data: JSON.stringify({action:'original-review-list'}),  //傳送的數據
          error:function(res){
              alert("數據傳輸錯誤");
          },success: function (data) {
            if(data.status == 0){

            }else{
              alert(data.msg);
            }
          }
      })        
    }
</script>

測試tab點擊切換按鈕時,果真觸發了ajax請求。但是有個問題,爲啥連續觸發兩次啊。後來想一想難道時addClass("active show") 兩個屬性就觸發兩次,搞不懂啊。找不到原因也要解決阿。於是引入setTimeout來過濾重複請求。代碼如下:

<script>
    $(document).ready(function(){
        var targetNode = document.getElementById('article-original-review').parentNode;
        var config = { attributes: true };
        var idTimeout = 0;
        var callback = function(mutationsList) {
          for(var mutation of mutationsList) {
            if (mutation.type == 'attributes') {
                  clearTimeout(idTimeout)
                  if($(targetNode).hasClass("active")){
                    idTimeout = setTimeout(function(){ getlist()},100);  
                  }
              }
          }
        };
        var observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    });

    function getlist(){
      var newidolurl = "/api/private/";
      $.ajax({
          type: "POST",      //data 傳送數據類型。post 傳遞
          dataType: 'json',  // 返回數據的數據類型json
          contentType: "application/json; charset=utf-8",
          url: newidolurl,  // yii 控制器/方法
          cache: false,      
          data: JSON.stringify({action:'original-review-list'}),  //傳送的數據
          error:function(res){
              alert("數據傳輸錯誤");
          },success: function (data) {
            if(data.status == 0){

            }else{
              alert(data.msg);
            }
          }
      })        
    }
</script>

ok,搞定,僅作記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章