2016-08-03 93 views
0

我在樹形視圖中單擊鏈接時創建選項卡。在選項卡中還有兩個其他選項卡已創建,其中有textareas,它們轉換爲CodeMirror。在創建CodeMirror實例時,我遇到了很多困難,通常我的問題是.refresh()事件。jQuery,引導選項卡和CodeMirror.refresh()

CodeMirror沒有完全加載在沒有激活的標籤中,因此我在創建實例時添加了一些更改,並將它們全部收集到數組中,稍後在代碼循環中使用.refresh(),以便CodeMirror編輯器完全加載。

在我這樣做之前,CodeMirror被添加到我在點擊創建的所有選項卡中的所有textareas中,但是我總是刷新所有CodeMirror實例,而不是新選項卡中的那些實例。這導致在另一個選項卡中輸入的值被清除。

因此,對於新更改,我只刷新在新選項卡中創建的當前CodeMirror實例。但是現在,所有仍然打開的舊標籤中的CodeMirror(btw標籤可以被關閉)消失。所以現在我想知道,CodeMirror.refresh()刷新整個頁面?

下面是我的代碼的一部分,它是創建CodeMirror實例的部分。我不認爲創建選項卡上的代碼有什麼用此功能失調:

/*添加CodeMirror所有的文本框轉換,需要超時,直到所有的DOM元素加載*/

setTimeout(function() { 
    var textAreaId = 0; 
    $(".AI-textarea").each(function() { 
     $(this).attr("id", "text" + textAreaId); 
     ++textAreaId; 
    }); 

    var queryArr = []; 
    var dimensionArr = []; 

    var queryBuilder = $(tabPanelDiv).find(".QueryBuilder"); 
    queryBuilder.each(function (index, el) { 
     var editorQuery = CodeMirror.fromTextArea(el, { 
      lineNumbers: true, 
      tabMode: "indent", 
      mode: "text/x-sql", 
      theme: "eclipse" 
     }); 
     queryArr.push(editorQuery); 
    }); 

    var dimensionBuilder = $(tabPanelDiv).find(".DimensionBuilder"); 
    dimensionBuilder.each(function (index, el) { 
     var editorQuery = CodeMirror.fromTextArea(el, { 
      lineNumbers: true, 
      tabMode: "indent", 
      mode: "text/x-sql", 
      theme: "eclipse" 
     }); 
     dimensionArr.push(editorQuery); 
    }); 

    for (var i = 0; i < queryArr.length; i++) { 
     queryArr[i].refresh(); 
    } 

    for (var a = 0; a < dimensionArr.length; a++) { 
     dimensionArr[a].refresh(); 
    } 

}, 100); 

我必須讓setTimeout函數中的代碼等待textareas被創建。該功能在點擊事件中。

任何人都可以指出什麼可能導致CodeMirror從舊標籤中的Dom消失?這可能是CodeMirror.refresh()事件,還是點擊事件做了一些我不知道的事情?在創建新選項卡時,最後一個CodeMirror實例是否會丟失?

下面是兩個選項卡的屏幕截圖,第一個顯示了全新選項卡的外觀。第二個顯示了較舊的選項卡應如何看起來相似。

enter image description here

enter image description here

編輯

這裏是整個點擊事件,有沒有什麼幫助,也許早在造成這種代碼的東西嗎?我很抱歉混合JavaScript和jQuery,可能會做一些重寫。

$(".treeviewLinks").click(function (e) { 
     e.preventDefault(); 
     var targetElement = e.target || e.srcElement; 

     /*** Create everything for the upper tabs that open when tree view link is clicked ***/ 

     if ($(".tabHelper").find("#upperTab").length == 0) { 
      var ul = document.createElement("ul"); 
      ul.className = "nav nav-tabs"; 
      ul.id = "upperTab"; 
      ul.setAttribute("role", "tablist"); 
      $(".tabHelper").append(ul); 
     } 

     var ul = $("#upperTab"); 
     var id = $('#upperTab li').size() + 1; 

     var li = document.createElement("li"); 
     var a = document.createElement("a"); 
     var span = document.createElement("span"); 

     li.setAttribute("role", "presentation"); 
     a.href = "#" + id; 
     a.setAttribute("aria-controls", id); 
     a.setAttribute("role", "tab"); 
     a.setAttribute("data-toggle", "tab"); 
     span.className = "glyphicon glyphicon-remove pull-right exit"; 
     a.innerHTML = targetElement.innerHTML; 

     if ($(".tabHelper").find(".tab-content").length == 0) { 
      var tabContentDiv = document.createElement("div"); 
      tabContentDiv.className = "tab-content"; 
     } 

     $(".tabHelper").append(tabContentDiv); 

     var tabContentDiv = $(".tabHelper").find(".tab-content").first(); 
     var tabPanelDiv = document.createElement("div"); 

     tabPanelDiv.className = "tab-pane" 
     tabPanelDiv.id = id; 
     tabPanelDiv.setAttribute("role", "tabpanel"); 

     ul.append(li); 
     li.appendChild(a); 
     a.appendChild(span); 
     tabContentDiv.append(tabPanelDiv); 

     var upperTab = document.getElementById("upperTab"); 
     var tabContent = document.getElementsByClassName("tab-content")[0]; 
     var cId = $(tabContent).size() + 1; 

     if (id == 1) { 
      var tmpLi = upperTab.firstChild; 
      tmpLi.className = "active"; 
     } 
     else if (id > 1) { 
      $(li).siblings().removeClass("active"); 
      li.className = "active"; 
     } 

     if (cId == 1) { 
      var tmpTabPane = tabContent.firstChild; 
      tmpTabPane.className += " active"; 
     } 
     else if (cId > 1) { 
      $(tabPanelDiv).siblings().removeClass("active"); 
      tabPanelDiv.className += " active"; 
     } 

     /*** Create ul for nav-tabs and tab-content for query and dimension builder tabs ***/ 

     var qdUl = document.createElement("ul"); 
     qdUl.className = "nav nav-tabs query-dimension-tabs"; 
     qdUl.setAttribute("role", "tablist"); 

     var qdDiv = document.createElement("div"); 
     qdDiv.className = "tab-content query-dimsension-tabs-content"; 

     for (var i = 0; i < tabContent.childNodes.length; i++) { 
      var item = $(tabContent.childNodes[i]); 

      if (item.children().length < 1) { 
       item.append(qdUl); 
       item.append(qdDiv); 
      } 
     } 

     /*** Create li in nav-tabs and tab-panel in tab-content for query and dimension builder tabs ***/ 

     var qLi = document.createElement("li"); 
     var dLi = document.createElement("li"); 
     qLi.setAttribute("role", "presentation"); 
     qLi.className = "active"; 
     dLi.setAttribute("role", "presentation"); 

     var navTabs = $(".query-dimension-tabs"); 

     var qA = document.createElement("a"); 
     var dA = document.createElement("a"); 
     qA.setAttribute("role", "tab"); 
     qA.setAttribute("data-toggle", "tab"); 
     qA.innerHTML = "Query Builder"; 
     dA.setAttribute("role", "tab"); 
     dA.setAttribute("data-toggle", "tab"); 
     dA.innerHTML = "Dimension Builder"; 

     for (var i = 0; i < navTabs.length; i++) { 
      var item = $(navTabs[i]); 

      if (item.children().length < 1) { 
       item.append(qLi); 
       item.append(dLi); 
       qLi.appendChild(qA); 
       dLi.appendChild(dA); 
      } 
     } 

     var qdId = 0; 
     $(".query-dimension-tabs").each(function() { 
      $(this).find("a").each(function() { 
       $(this).attr("href", "#tab" + qdId); 
       $(this).attr("aria-controls", "tab" + qdId); 
       ++qdId; 
      }); 
     }); 

     var tabPane1 = document.createElement("div"); 
     var tabPane2 = document.createElement("div"); 
     tabPane1.className = "tab-pane active"; 
     tabPane1.setAttribute("role", "tabpanel"); 
     tabPane2.className = "tab-pane"; 
     tabPane2.setAttribute("role", "tabpanel"); 

     $(".tab-content:not(:first)").each(function() { 
      $(this).append(tabPane1); 
      $(this).append(tabPane2); 
     }); 

     var pId = 0; 
     $(".query-dimsension-tabs-content").each(function() { 
      $(this).find(".tab-pane").each(function() { 
       $(this).attr("id", "tab" + pId); 
       ++pId; 
      }); 

      if (!($.contains($(this), "form"))) { 
       var firstPane = $($(this).children()[0]); 
       var secondPane = $($(this).children()[1]); 
       firstPane.load("/Webfront/QueryBuilder"); 
       secondPane.load("/Webfront/DimensionBuilder"); 
      }   
     }); 

     //var url = '@Url.Action("QueryDimensionTab", "Webfront")'; 

     /*** Add CodeMirror to convert all textboxes, needs timeout until all dom elements are loaded ***/ 

     setTimeout(function() { 
      var textAreaId = 0; 
      $(".AI-textarea").each(function() { 
       $(this).attr("id", "text" + textAreaId); 
       ++textAreaId; 
      }); 

      var queryArr = []; 
      var dimensionArr = []; 

      var queryBuilder = $(tabPanelDiv).find(".QueryBuilder"); 
      queryBuilder.each(function (index, el) { 
       var editorQuery = CodeMirror.fromTextArea(el, { 
        lineNumbers: true, 
        tabMode: "indent", 
        mode: "text/x-sql", 
        theme: "eclipse" 
       }); 
       queryArr.push(editorQuery); 
      }); 

      var dimensionBuilder = $(tabPanelDiv).find(".DimensionBuilder"); 
      dimensionBuilder.each(function (index, el) { 
       var editorQuery = CodeMirror.fromTextArea(el, { 
        lineNumbers: true, 
        tabMode: "indent", 
        mode: "text/x-sql", 
        theme: "eclipse" 
       }); 
       dimensionArr.push(editorQuery); 
      }); 

      for (var i = 0; i < queryArr.length; i++) { 
       queryArr[i].refresh(); 
      } 

      for (var a = 0; a < dimensionArr.length; a++) { 
       dimensionArr[a].refresh(); 
      } 

     }, 100); 
    }); 

回答

0

我發現是什麼導致CodeMirror舊實例消失。這是因爲我正在加載jQuery .each()中的表單,這些表單循環遍歷所有具有這些表單的div。我把負載移到了它的外面,並修復了它。

舊代碼:

var pId = 0; 
    $(".query-dimsension-tabs-content").each(function() { 
     $(this).find(".tab-pane").each(function() { 
      $(this).attr("id", "tab" + pId); 
      ++pId; 
     }); 

     if (!($.contains($(this), "form"))) { 
      var firstPane = $($(this).children()[0]); 
      var secondPane = $($(this).children()[1]); 
      firstPane.load("/Webfront/QueryBuilder"); 
      secondPane.load("/Webfront/DimensionBuilder"); 
     }   
    }); 

新代碼:

var pId = 0; 
    $(".query-dimsension-tabs-content").each(function() { 
     $(this).find(".tab-pane").each(function() { 
      $(this).attr("id", "tab" + pId); 
      ++pId; 
     });   
    }); 

    var formToLoad = $($(tabPanelDiv).children()[1]); 
    var firstPane = $($(formToLoad)[0].firstChild); 
    var secondPane = $($(formToLoad)[0].lastChild); 
    firstPane.load("/Webfront/QueryBuilder"); 
    secondPane.load("/Webfront/DimensionBuilder"); 

如果有人對我怎麼能在這,將不勝感激以不同的方式加載動態jQuery的這部分觀點的建議或想法。我認爲這可能不是最好的方法。