2015-08-28 93 views
0

我有JavaScript代碼,似乎在Chrome,Firefox和Safari的工作,但無法在IE中工作,由於一些變量是「未定義」,但如果你看我的代碼你會看到變量被正確賦值。我覺得它與它的定義範圍有關,但我不想在嘗試修復IE時破壞其他瀏覽器的代碼。這個問題發生在IE11和IE8中,但我沒有測試其他版本的IE來驗證。Js變量未定義在IE後定義

function resizeCommentBox(obj,i){ 
    var lastItemCounter = obj[i].getElementsByTagName('tr').length - 1; 
    var lastRow = obj[i].getElementsByTagName('tr')[lastItemCounter]; 
    var nextCommentBox = obj[i+1].getElementsByTagName('table')[0]; 

    console.log("lastRow.parentElement right outside the first conditional if(obj[i].offsetHeight < obj[i].scrollHeight): "); 
    console.log(lastRow.parentElement); 

    if(obj[i].offsetHeight < obj[i].scrollHeight){ 
     if(!(i+2 < obj.length)){ 
      var template = document.getElementById('lastPageTemplate'); 
      var parentNode = template.parentNode; 

      template.style.display="block"; 
      template.removeAttribute("id"); 

      parentNode.innerHTML = parentNode.innerHTML + template.outerHTML; 
      parentNode.children[parentNode.children.length-1].setAttribute('id','lastPageTemplate'); 
      parentNode.children[parentNode.children.length-1].style.display="none"; 
      parentNode.children[parentNode.children.length-1].innerHTML = parentNode.children[parentNode.children.length-1].innerHTML; 

     } 

     console.log("lastRow.parentElement right outside the conditional if(lastRow.childElementCount > 0): "); 
     console.log(lastRow.parentElement); 
     if(lastRow.childElementCount > 0){ 
      nextCommentBox.innerHTML = lastRow.outerHTML + nextCommentBox.innerHTML; 
      lastRow.parentElement.removeChild(lastRow); 
     } 
     else{ 
      lastRow.parentElement.removeChild(lastRow); 
     } 

      if(nextCommentBox.getElementsByTagName('tr')[nextCommentBox.getElementsByTagName('tr').length-1].innerHTML === ""){ 
       nextCommentBox.getElementsByTagName('tr')[nextCommentBox.getElementsByTagName('tr').length-1].parentElement.removeChild(nextCommentBox.getElementsByTagName('tr')[nextCommentBox.getElementsByTagName('tr').length-1]); 
      } 


     resizeCommentBox(obj,i); 
    } 
    else{ 
     try{ 
      var lastPageOnlyFooter = document.getElementsByClassName('keepOnLastPageOnly'); 
      for(var j = 0; j < lastPageOnlyFooter.length - 2; j++){ 
       lastPageOnlyFooter[j].parentElement.removeChild(lastPageOnlyFooter[j]); 
      } 
     } 
     catch(err){ 
      console.log(err); 
     } 
     return false; 
    } 
} 

function checkCommenBox(elementCounter){ 

    var commentBoxCollection = document.getElementsByClassName('comments'); 
    resizeCommentBox(commentBoxCollection,elementCounter); 
    commentBoxCollection[elementCounter].style.height = "auto"; 

    if(elementCounter < commentBoxCollection.length){ 
     checkCommenBox(elementCounter + 1); 
    } 

} 

checkCommenBox(0); 

是守失敗的變量是LASTROWnextCommentBox,但他們在函數的開始被定義。我現在還不能包裹我的頭,這是爲什麼它可以在許多瀏覽器上運行,但IE無法找到變量?感謝您的幫助和建議。

編輯15年8月31日
我把IE控制檯的一些截圖顯示的確切錯誤。如您所見,刪除方法沒有被調用,因爲引用爲空。在這種情況下,調用的引用是變量lastRow,它是一個錶行元素。

IE11 javascript console error

檢查我的代碼,我們發現第一removeChild之函數被調用的lastRow.parentElement它確實存在:

lastRow.parentElement.removeChild(lastRow); 

,做外的條件和console.logs在removeChild函數被調用之前,我們看到元素指針剛剛消失。

console.logs

我換的innerHTML上表引用的的appendChildremoveChild之功能,但仍無法在IE瀏覽器。

+0

'elementCounter'被用作從零開始的索引。但是你將它與一個基於的長度進行比較。當到達最後一個元素時,if條件仍然滿足,並且調用具有未定義索引的checkCommenBox(超出邊界)。這發生在所有瀏覽器中。 – Andreas

回答

0

我通過腳本完成了幾個日誌到控制檯中,發現了這個問題。看來,下面一行由可變LASTROW空:

parentNode.innerHTML = parentNode.innerHTML + template.outerHTML; 

前面提到的前行,LASTROW有一個元素對象的值。該行執行後,lastRow值將變爲空(僅在IE上)。爲了解決這個問題,我必須更改parentNode.innerHTML以使用appendChild on template.cloneNode(true)

parentNode.appendChild(template.cloneNode(true)); 

然後我移動了一些其他功能,使我的代碼像以前一樣工作。

3

我不知道的你想在這裏做什麼,但使用的innerHTML和outerHTML在IE瀏覽器屬性是不建議,因爲它是唯一的「差不多」的支持,特別是具有內表。請參閱http://www.quirksmode.org/dom/html/並嘗試以此方式進行挖掘。