国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

掌控 DOM - 它不像你想的那么難

Reducto / 652人閱讀

摘要:很多開(kāi)發(fā)者認(rèn)為是真的很難或者很慢以至于你需要一個(gè)巨大的框架才能讓它服帖。如果我告訴你其實(shí)沒(méi)那么復(fù)雜,你信嗎并不難并且它也不慢。它很聰明的和已經(jīng)附加在的元素進(jìn)行比較并按需進(jìn)行插入移除重排等操作

很多開(kāi)發(fā)者認(rèn)為 DOM 是真的很難(或者很慢)以至于你需要一個(gè)巨大的框架才能讓它服帖。于是他們投入了大量的時(shí)間去學(xué)習(xí)這些框架。一兩年過(guò)去了,又一個(gè)框架火了于是你不得不扔掉之前的框架從頭學(xué)起。這樣的事情多重復(fù)幾次就能讓你對(duì) JavaScript 產(chǎn)生疲勞,更不用說(shuō)那多的數(shù)不過(guò)來(lái)的依賴(lài)。

如果我告訴你 DOM 其實(shí)沒(méi)那么復(fù)雜,你信嗎?

DOM 并不難并且它也不慢。

創(chuàng)建元素

要?jiǎng)?chuàng)建一個(gè)元素,你只需要寫(xiě) document.createElement(tagName)

const h1 = document.createElement("h1")

// 

修改文本內(nèi)容

HTML 元素如果沒(méi)有任何內(nèi)容,那就是空的,讓我們用 element.textContent 來(lái)增加一些文本

h1.textContent = "Hello world!"

// 

Hello world!

屬性

要定義一個(gè) HTML 元素的屬性,你可以用 element.setAttribute(name, value)

h1.setAttribute("class", "hello")

// 

Hello world!

若要管理 class 有一個(gè) element.className 屬性

h1.className = "hello"

// 

Hello world!

但是,最好的方式是使用 classList

h1.classList.add("hello")

// 

Hello world!

h1.classList.remove("hello") //

Hello world!

要設(shè)置一個(gè)元素的 ID,你可以使用標(biāo)簽屬性或者 id 屬性

h1.setAttribute("id", "hello-world")

h1.id = "hello-world"

// 

Hello world!

如果你不確定用標(biāo)簽屬性(attributes)還是對(duì)象屬性(properties),就用標(biāo)簽屬性 (表單元素的狀態(tài)除外,如 value 和 checked)

注意,有些布爾值的修改不能使用 element.setAttribute(someBoolean, false),下面這些則可以

input.checked = true

// 

input.checked = false

// 

input.setAttribute(‘checked’, ‘’)

// 

input.removeAttribute("checked")
// 
元素附加

HTML 是結(jié)構(gòu)化的。可以通過(guò) parent.appendChild(child) 來(lái)實(shí)現(xiàn)元素附加

document.body.appendChild(h1)

// 

Hello world!

元素移除

有時(shí)候你希望去掉一個(gè)元素,那么你可以使用 parent.removeChild(child)

document.body.removeChild(h1)

// 
元素查找

你可以使用下列方法來(lái)查找子元素

document.getElementById(id)

element.childNodes[i]

element.firstChild === element.childNodes[0]

element.lastChild === element.childNodes[element.childNodes.length - 1]

element.getElementsByTagName(tagName)

element.getElementsByClassName(className)

element.querySelector(query)

element.querySelectorAll(query)

注意 getElementsByTagName, getElementsByClassName 和 querySelectorAll 返回的不是數(shù)組,而是 NodeList,你不能通過(guò) ES5 的數(shù)組快速訪問(wèn)方式來(lái)迭代。

元素間插入元素

想要將元素查到另一個(gè)元素的前面?試試 parent.insertBefore(child, before)

/*

 *  

 *    

 *  

 */

document.body.insertBefore(h1, document.body.firstChild)

/*  

 *    

Hello world!

* * */
創(chuàng)建元素列表

如果我們有一些數(shù)據(jù),可以很容易的動(dòng)態(tài)創(chuàng)建元素。

const data = [
  [ 1, 2, 3 ],
  [ 4, 5, 6 ],
  [ 7, 8, 9 ]
]
const table = document.createElement("table")

data.forEach(row => {
  const tr = document.createElement("tr")

  row.forEach(cell => {
    const td = document.createElement("td")

    td.textContent = cell
    tr.appendChild(td)
 })

  table.appendChild(tr)
})

document.body.appendChild(table)

https://jsfiddle.net/pakastin...

更新元素列表

你希望元素保持最新?tīng)顟B(tài),可以這么做

const table = document.createElement("table")

document.body.appendChild(table)

updateTable(table, [
  [ 1, 2 ],
  [ 3, 4, 5 ],
  [ 6, 7, 8, 9 ]
])

setTimeout(() => {
  updateTable(table, [
    [ 1, 2, 3, 4 ],
    [ 5, 6, 7 ],
    [ 8, 9 ]
  ])
}, 1000)

function updateTable (table, data) {
  const rowLookup = table._lookup || (table._lookup = [])

  setChildren(table, updateRows(rowLookup, data))
}

function updateRows (rowLookup, rows) {
     return rows.map((row, y) => {
    const tr = rowLookup[y] || (rowLookup[y] = document.createElement("tr"))
    const cellLookup = tr._lookup || (tr._lookup = [])

    setChildren(tr, updateCells(cellLookup, row))

    return tr
  })
}

function updateCells (cellLookup, cells) {
     return cells.map((cell, x) => {
    const td = cellLookup[x] || (cellLookup[x] = document.createElement("td"))

    td.textContent = cell

    return td
  })
}

function setChildren (parent, children) {
  let traverse = parent.firstChild

  for (let i = 0; i < children.length; i++) {
    const child = children[i]

    if (child == null) {
      return
    }

    if (child === traverse) {
      traverse = traverse.nextSibling
    } else if (traverse) {
      parent.insertBefore(child, traverse)
    } else {
      parent.appendChild(child)
    }
  }

  while (traverse) {
    const next = traverse.nextSibling

    parent.removeChild(traverse)

    traverse = next
  }
}

https://jsfiddle.net/pakastin...

以上代碼有兩個(gè)事情發(fā)生

一個(gè)隱藏屬性 element._lookup = [] 用來(lái)查找子元素,使用lookup 我們可以復(fù)用DOM中已經(jīng)存在的元素并更新它們。

setChildren(parent, children) 方法能讓你提供一個(gè)元素列表。它很聰明的和已經(jīng)附加在 parent的元素進(jìn)行比較并按需進(jìn)行 插入 移除 重排等操作

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91357.html

相關(guān)文章

  • 二十五歲零基礎(chǔ)轉(zhuǎn)行做軟件測(cè)試怎么樣?一個(gè)過(guò)來(lái)人的心路歷程送給迷茫的你

    摘要:一個(gè)軟件測(cè)試在職老人幫你詳細(xì)分析一下。在軟件測(cè)試行業(yè),前兩點(diǎn)可以結(jié)合起來(lái)說(shuō),就是大環(huán)境和前景以及人才缺口的問(wèn)題。軟件測(cè)試屬于互聯(lián)網(wǎng)技術(shù)的一個(gè)分支,就是經(jīng)常被提到的行業(yè)。你零基礎(chǔ)轉(zhuǎn)行嗷,良心奉勸你不要自學(xué)。 一個(gè)軟件測(cè)試在職老人幫你詳細(xì)分析一下。先不說(shuō)軟件測(cè)試領(lǐng)域,你想轉(zhuǎn)行的話,得知道這個(gè)行...

    AlienZHOU 評(píng)論0 收藏0
  • 和BEM的戰(zhàn)斗:10個(gè)常見(jiàn)問(wèn)題及如何避免

    摘要:我發(fā)現(xiàn)使用這些命名空間會(huì)使我的代碼非常具有可讀性。跨組件的組建我們面臨的另一個(gè)常見(jiàn)的問(wèn)題是組件的樣式和位置會(huì)受到父級(jí)容器的影響。 無(wú)論你是剛剛發(fā)現(xiàn)BEM或者已經(jīng)是個(gè)中熟手(作為web術(shù)語(yǔ)來(lái)說(shuō)),你可能已經(jīng)意識(shí)到它是一種有用的方法。如果你還不知道BEM是什么,我建議你在繼續(xù)閱讀這篇文章之前去BEM website了解一下它,因?yàn)槲視?huì)假設(shè)你對(duì)這種CSS的方法有一個(gè)基礎(chǔ)的理解。 本文旨在對(duì)那...

    dongfangyiyu 評(píng)論0 收藏0
  • 和BEM的戰(zhàn)斗:10個(gè)常見(jiàn)問(wèn)題及如何避免

    摘要:我發(fā)現(xiàn)使用這些命名空間會(huì)使我的代碼非常具有可讀性。跨組件的組建我們面臨的另一個(gè)常見(jiàn)的問(wèn)題是組件的樣式和位置會(huì)受到父級(jí)容器的影響。 無(wú)論你是剛剛發(fā)現(xiàn)BEM或者已經(jīng)是個(gè)中熟手(作為web術(shù)語(yǔ)來(lái)說(shuō)),你可能已經(jīng)意識(shí)到它是一種有用的方法。如果你還不知道BEM是什么,我建議你在繼續(xù)閱讀這篇文章之前去BEM website了解一下它,因?yàn)槲視?huì)假設(shè)你對(duì)這種CSS的方法有一個(gè)基礎(chǔ)的理解。 本文旨在對(duì)那...

    mumumu 評(píng)論0 收藏0
  • 和BEM的戰(zhàn)斗:10個(gè)常見(jiàn)問(wèn)題及如何避免

    摘要:我發(fā)現(xiàn)使用這些命名空間會(huì)使我的代碼非常具有可讀性。跨組件的組建我們面臨的另一個(gè)常見(jiàn)的問(wèn)題是組件的樣式和位置會(huì)受到父級(jí)容器的影響。 無(wú)論你是剛剛發(fā)現(xiàn)BEM或者已經(jīng)是個(gè)中熟手(作為web術(shù)語(yǔ)來(lái)說(shuō)),你可能已經(jīng)意識(shí)到它是一種有用的方法。如果你還不知道BEM是什么,我建議你在繼續(xù)閱讀這篇文章之前去BEM website了解一下它,因?yàn)槲視?huì)假設(shè)你對(duì)這種CSS的方法有一個(gè)基礎(chǔ)的理解。 本文旨在對(duì)那...

    荊兆峰 評(píng)論0 收藏0
  • 學(xué)習(xí)python12小時(shí)后,告訴你,學(xué)python真沒(méi)你想的那么

    摘要:列入全國(guó)計(jì)算機(jī)二級(jí)取代,部分城市試點(diǎn),引入高中。建議通過(guò)視頻學(xué)習(xí),這樣不但節(jié)省時(shí)間,而且效果很好。能否回憶起那個(gè)陡峭的學(xué)習(xí)曲線問(wèn)題越多,學(xué)的越快。出報(bào)告每完成一個(gè)項(xiàng)目,總結(jié)報(bào)告,必不可少。結(jié)構(gòu)化學(xué)習(xí),才是你我需要真正培養(yǎng)的能力。 編程就如同你學(xué)習(xí)開(kāi)車(chē),即使,你可以一口氣,說(shuō)出一輛車(chē)的全部零部件,以及內(nèi)燃機(jī)進(jìn)氣、壓縮、做功和排氣過(guò)程,但你就是不去練如何開(kāi)車(chē),怎么上路。你確定,你敢開(kāi)嗎?你...

    Kaede 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<