1. 程式人生 > >前端應該知道的基本知識

前端應該知道的基本知識

前端時間在部門內進行分享,準備素材時偶然發現下面的一個現象,因為和當時分享的主題無關,就先記下來了,事後重新審視,並把一些思考記錄如下:

一、問題

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DOM-插入子節點</title>
</head>
<body>
<h1>第0個標題</h1>
<div id="app"></div>

<script>
    //寫法1:分步呼叫
    var h1 = document.createElement('h1');
    var text = document.createTextNode('第1個標題');
    h1.appendChild(text); //!!!
    document.getElementById('app').appendChild(h1);

    //寫法2:鏈式呼叫
    document.getElementById('app').appendChild(document.createElement('h1').appendChild(document.createTextNode('第2個標題')));
</script>
</body>
</html>

結果:

節點渲染不一致

渲染後的HTML結構

html結構

為什麼???

二、原因

寫法1中

var text = document.createTextNode('第1個標題');

text是Text型別,而appendChild()方法的返回值型別取決於入參的型別,即下面程式碼執行後

h1.appendChild(text);

返回值的仍然是Text型別,所以寫法2的鏈式寫法(也不知道當時為啥想來這麼一招)

document.getElementById('app').appendChild(document.createElement('h1').appendChild(document.createTextNode('第2個標題')));

相當於

document.getElementById('app').appendChild(new Text('第2個標題'));

所以第2個標題是文字節點,而不是h1元素。

三、引申

最初發現此問題,百思不解,又苦於谷歌時不知道如何描述,後來在一個學習群中得到了解答,不過也被鄙視了一下下。

痛定思痛,反思自己為什會在這個問題上迷失,最終得出的結論:對於底層DOM的api不熟。

在我開始接觸前端時,jQuery和各種前端框架早已大行其道,它們將繁瑣的底層DOM操作封裝的盡善盡美,讓我們在開發的時候爽到飛。當然也讓我們對DOM底層也生疏起來,甚至對於有些半路出家的前端而言根本不是生疏,因為從來沒有熟悉過。這是一種非常危險的現象。試想,現在如果讓我們拋棄所有庫和框架去實現一個元件,我們是否能夠依然遊刃有餘呢?我是沒有信心的。

所有我們不熟悉或者沒有掌握的知識皆可稱之為"知識盲區",有知識盲區並不可怕,針對知識盲區去學習即可。

我感覺對自己職業的技能要求有一個全面的認識,有一個俯視視角才是最重要的。只有這樣,我們才會準確知道自己的知識盲區所處何處,以及發現更多的知識盲區。

以下是我結合本次內容,對前端技能樹的一個梳理:

1.前端技能樹

前端技能樹

其中我始終堅信JavaScript才是前端人員的核心競爭力,它決定了一個前端人員在前端領域能走多遠和能達到的高度。

JavaScript是一門程式語言,與之緊密相關的三個領域:BOM、DOM、ECMAScript。

  • BOM(Browser Object Model,瀏覽器物件模型),將瀏覽器抽象成物件,進而可以操作瀏覽器。
  • DOM(Document Object Model,文件物件模型),將網頁抽象成物件,進而可以操作網頁。
  • ECMAScript(European Computer Manufacturers Association,歐洲計算機制造商協會),JavaScript的標準,JavaScript是它的實現。我們對JavaScript語法的學習其實就是對此標準的學習,比如我們整天說的ES6。

2.BOM

BOM

BOM提供了獨立於內容而與瀏覽器視窗進行互動的物件,由於BOM主要用於管理視窗與視窗之間的通訊,因此其核心物件是window。

BOM由一系列相關的物件構成,並且每個物件都提供了很多方法與屬性,這些物件的例項又都存在於window物件中。我們平時最常用到的包括location、history、document,navigtor和screen很少用,瞭解即可。

JavaScript語法的標準化組織是ECMA,DOM的標準化組織是W3C,BOM缺乏標準,它最初是Netscape瀏覽器標準的一部分。

3.DOM

在DOM中,所有事物都是節點。DOM將HTML文件表達為樹結構,DOM是被視為HTML的節點樹。

節點對應的物件是Node,其他的具體節點物件全都是繼承自Node物件。

DOM之Node

DOM 定義了訪問和操作HTML文件的標準方法。換言之,DOM 是關於如何獲取、修改、新增或刪除 HTML 元素的標準。

以下為不同型別節點物件提供的常用屬性和方法:

(1)Node

  • 屬性

    • atrributes
    • childNodes
    • firstChild
    • lastChild
    • nextSibling
    • previousSibiling
    • nodeType
    • nodeName
  • 方法

    • appendChild()
    • insertBefore()

(2)Document

  • 屬性

    • body
  • 方法

    • 建立

      • createElement()
      • createAttribute()
      • createTextNode()
      • createComment()
    • 遍歷

      • getElementById()
      • getElementByTagName()
      • getElementByClassName()

(3)Element

  • 方法

    • 遍歷

      • getElementByTagName()
      • getElementByClassName()
    • 操作

      • getAttribute()
      • setAttribute()

(4)Attr

  • 屬性

    • name
    • value

(5)Text

4.JavaScript與Node.js的關係

(1)JavaScript是一門程式語言,Node.js是JavaScript的執行環境

(2)JavaScript目前主要有兩種執行環境:

  • 客戶端:瀏覽器
  • 伺服器端:Node.js

(3)任何一種執行環境都要有解釋JavaScript的能力,此能力由JavaScript引擎提供,最著名的當屬V8引擎,Chrome瀏覽器和Node.js都是集成了V8引擎

(4)目前常見框架與兩者的關係:

  • Angular、React、Vue是用JavaScript寫的前端框架,編譯後可以直接在瀏覽器中執行
  • Express、Koa是用JavaScript寫的伺服器端框架,可以直接在Node.js中執行
  • Webpack、Gulp、Grunt等是執行在Node.js中的構建框架

所以,如果以後再有人問你:用Node.js寫過什麼東西?直接鄙視他!