簡體   English   中英

使用 Javascript 將元素附加到 DOM - 無法定位正確的 DIV?

[英]Attach an Element to the DOM using Javascript - Can't target the correct DIV?

我正在嘗試學習如何使用 Javascript 制作動態菜單。

onload,程序會根據頁面中的h2標題創建一個菜單。

如果 body 標簽的 id = homePage 菜單將插入到頁面的頂部,否則它將在頁面的一側插入一個菜單。

它一直在工作,直到我在內容周圍添加了一個 DIV 包裝器(id = wrapper)。 然后它停止工作。

錯誤:未捕獲的 DOMException:無法在 'Node' 上執行 'insertBefore':要在其之前插入新節點的節點不是該節點的子節點。

我認為這是因為我的 if/else 語句將錯誤的元素定位為父元素。 但我無法弄清楚如何使用 id = 包裝器定位 DIV,並在該元素 firstChild 之前插入菜單。

我被卡住了!

如果我注釋掉 DIV id=wrapper 那么它就可以工作了。

HTML:

<body id ='notHomePage'>

  <!--<div id='wrapper'>-->
    <h1>Heading 1</h1>

    <h2>H2 Heading - 1</h2>

    <p>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam fermentum ullamcorper
    </p>

    <h2>H2 Heading - 2</h2>

    <p>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam fermentum ullamcorper
    </p>

    <h2>H2 Heading - 3</h2>

    <p>
      Lorem ipsum dolor sit amet, consectetur
    </p>

 <!-- </div> -->

</body>

JS:

    if(pageIs == 'homePage'){
       
        //IF is homePage then load menu at top
        document.body.insertBefore(makeMenuDiv(), document.body.firstChild);
      

       } else {
        
        //ELSE load SIDE NAV
        document.body.insertBefore(makeSideNav(), document.body.firstChild);
       
 
       }//END IF

代碼:代碼

如果您需要選擇 div,它應該是:

document.getElementById('wrapper')

所以如果我得到你想要的東西,我認為你應該只需要:

if(pageIs == 'homePage'){

    //IF is homePage then load menu at top
    document.body.insertBefore(makeMenuDiv(),
        document.getElementById('wrapper').firstChild);                                   
}

問題來自

makeMenuUl()

其中的最后一個函數是

document.body.insertBefore(anchor, headings[i]);

當你用 div 將所有內容都包裹在 body 中時,headings[i] 不再是 body 的子元素——因此出現錯誤。 將該行更改為

document.getElementById('wrapper').insertBefore(anchor, headings[i]);

它對我有用。

好的,我終於讓這個工作了。 這是更新的 CodePen:

代碼筆

我必須改變的兩件事:

1) 在我的 IF/ELSE 語句中,我必須更改我選擇 DOM 元素的方式,因為 1 頁 (homePage) 沒有包裝 div,而另一個頁面有一個包裝 div:

        if (pageIs == 'homePage') {

        //IF is homePage then load menu at top
        document.body.insertBefore(makeMenuDiv(), document.body.childNodes[0]);

    } else {

        //NOT homePage then load side menu

        var wrapper = document.getElementById('wrapper');

        wrapper.insertBefore(makeMenuDiv(), wrapper.childNodes[0]);

    } //END IF

2) 在我的 for 循環中,當將錨標記附加到 h2 標題的前面時,我不得不再次更改我選擇 h2 標題的方式,因為包裝器使document.body.insertBefore不正確。

        //10. insert the anchor in the the document next to each <h2>
        //document.body.insertBefore(anchor, headings[i]);
        document.getElementsByTagName('h2')[i].insertBefore(anchor, document.getElementsByTagName('h2')[i].firstChild);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM