鍍金池/ 問(wèn)答/HTML5  數(shù)據(jù)庫(kù)  HTML/ JavaScript使用createElement創(chuàng)建一個(gè)li,后如何檢測(cè)到已經(jīng)

JavaScript使用createElement創(chuàng)建一個(gè)li,后如何檢測(cè)到已經(jīng)插入到真實(shí)dom,并計(jì)算li的寬度

js通過(guò)createElement創(chuàng)建一個(gè)li,想要計(jì)算這個(gè)li的寬度,但是沒(méi)插入頁(yè)面之前計(jì)算寬度是0,插入頁(yè)面之后就能計(jì)算出li的真實(shí)寬度


class Tab{
    constructor(){
        const tab = document.createElement("ul")
        const li = document.createElement("li")
        tab.appendChild(li)
        li.textContent = "test"
        // 1、這個(gè)時(shí)候如果獲取li的寬度(li.offsetWidth),是0
        // 如何在tab插入真實(shí)dom上后再去計(jì)算 li.offsetWidth?
        return tab
    }
}

const tab = new Tab()
const root = document.getElementById('root')
root.appendChild(tab)
// 2、這個(gè)時(shí)候再去計(jì)算 li的offsetWidth 就不是0
// li 在render到頁(yè)面后會(huì)不會(huì)觸發(fā)什么事件,通過(guò)監(jiān)聽(tīng)這個(gè)事件來(lái)獲取呢?
回答
編輯回答
墨沫

從你代碼來(lái)看, 在構(gòu)造函數(shù)中是獲取不到li的寬度的,因?yàn)樵跇?gòu)造函數(shù)中 你只做了把li插入到ul中 而ul并沒(méi)有插入到DOM中,故 li也就沒(méi)有插入到DOM中 所以你獲取不到,考慮換個(gè)思路 實(shí)現(xiàn)你的需求。

2017年12月1日 15:51
編輯回答
墨沫

因?yàn)樵诓迦胫?,各種樣式屬性都沒(méi)有應(yīng)用上,瀏覽器并不知道你里邊的內(nèi)容該以怎樣的方式來(lái)呈現(xiàn)。
插入到文檔中以后,才會(huì)被瀏覽器渲染出來(lái),進(jìn)而計(jì)算出盒模型相關(guān)的屬性。

2017年8月20日 17:16
編輯回答
扯不斷

有個(gè)監(jiān)聽(tīng)事件 貌似叫 DOMNodeInserted 可以掛在 li 上面,然后呢,在插入的時(shí)候,就可以獲取到了

2017年10月4日 05:41
編輯回答
厭遇

看起來(lái)你需要 MutationObserver,它能夠偵聽(tīng) DOM 結(jié)構(gòu)的變化,調(diào)用函數(shù)處理。

2017年11月13日 22:41