這是全棧資料工程師養成攻略系列教程的第二十一期:21 Web基礎 網頁的關節JS。
我們已經瞭解了Web三件套中的HTML和CSS,現在讓我們來學習下最後的JS。
什麼是JS
JS的全稱是JavaScript,但是和Java關係並不大。之所以將JS比如網頁的關節,是因為JS可以動態地操作DOM元素,例如插入和刪除DOM元素,或者修改已有元素的樣式和內容等。
JS是Web網頁中的指令碼程式語言,因此可以用JS來完成一些任務,例如實現一些數值計算,或者編寫Web網頁中的事件響應函式。Web網頁中的事件包括滑鼠懸浮、滑鼠點選、滑鼠滾動、鍵盤輸入等,可以使用JS監聽這些事件,並且在事件發生時進行相應的操作和處理,從而實現動態的頁面更新和使用者互動。
使用JS
使用JS的方法有兩種:引入外部.js檔案;直接在HTML中寫JS。
如同引入外部.css檔案一樣,可以新建一個script.js檔案,然後在裡面編寫JS程式碼,例如輸入console.log("Hello World!");
,然後在HTML的head
中使用script
標籤引入,src
屬性指定了.js檔案的相對路徑。
<script src="script.js"></script>複製程式碼
執行寫好的HTML檔案,開啟Chrome的開發者工具,在Console標籤頁中即可看到列印出來的Hello World!
。console.log()
是JS提供的列印函式,好比Python的print
,可以在Web網頁中列印變數並進行除錯。
如果是直接在HTML中寫JS程式碼,則如同CSS的style
標籤一樣,JS程式碼需要寫在script
標籤之中,script
標籤可以放在HTML網頁的任意位置,每條JS程式碼之後應當使用分號;
結束。
<script>
console.log("Hello World!");
</script>複製程式碼
JS基礎
在實際專案中我們一般很少直接寫原生JS程式碼,因為已經有相當多的JS高階封裝框架。這些框架在原生JS語法的基礎上進一步開發,能夠提供更方便更豐富的功能,例如後續章節中將介紹的JQuery,以及目前十分流行的Angular.js
、React.js
和Vue.js
等前端框架。儘管如此,我們仍需要了解一些JS基礎內容。
使用document.write()
可以向body
中寫入DOM元素,以下程式碼向body
中新增了一個h1
標籤。不過這一函式比較雞肋,因為無法靈活地控制寫入的內容和位置。
document.write(`<h1>Hello World!</h1>`);複製程式碼
和Python一樣,JS也是一種弱變數型別的程式語言。使用關鍵字var
宣告一個變數,宣告時無需指定其變數型別。和Python一樣,JS中常用的基礎變數型別包括數值(整數、浮點數)和字串。//
表示JS註釋,如同Python中的#
一樣。
var a = 1; // 整數
var b = 1.1; // 浮點數
var c = `Hello`; //字串
console.log(a, b, c);複製程式碼
Python中用列表和字典分別來儲存序列和鍵值對,在JS中同樣有相應的資料結構,只不過是換了個名稱,分別叫做陣列和物件。它們的使用方法,包括宣告、新增元素、訪問元素、修改元素和刪除元素等,和Python中的列表和字典都是大同小異的。
var d = []; // 陣列
// 新增元素
// Python中的列表是append()
d.push(1);
d.push(2);
console.log(d);
// 列印下標為1,即第二個元素
console.log(d[1]);
// 陣列長度,Python中是用len()
console.log(d.length);
var e = {}; // 物件
// 新增key和value
e[`k1`] = 1;
e[`k2`] = 2;
e[`k3`] = `Hello`;
console.log(e);
console.log(e[`k1`]);複製程式碼
在Chrome開發者工具的Console標籤頁中可以進行除錯並觀察列印資訊,可以看到陣列和物件分別是用Array[]
和Object{}
表示的。
使用document.getElementById()
可以根據給定的ID獲取相應的DOM元素並返回一個DOM物件,假設我們在body
裡面寫了一個h1
標籤:
<h1 id="title">標題內容</h1>複製程式碼
然後便可以在JS中通過document.getElementById()
函式搜尋並獲取到這個h1
。通過操作變數t
,我們可以對相應的h1
標籤進行一些操作,例如獲取其文字內容、修改其文字內容、向其中新增DOM元素、將其刪除等。
var t = document.getElementById(`title`);
console.log(t);複製程式碼
再來看一下onclick
,即DOM元素的滑鼠點選響應事件。以下程式碼以button
標籤為例,當滑鼠點選這一按鈕時,剛才提到的h1
標籤文字將發生變化。HTML部分程式碼如下,可以將onclick
當作DOM元素的屬性來理解,當滑鼠點選這一按鈕時,將觸發JS中定義的myFunc()
函式。
<h1 id="title">標題內容</h1>
<button type="button" onclick="myFunc()">點我</button>複製程式碼
JS部分程式碼如下,首先我們需要定義myFunc()
函式。JS使用function
定義函式,和Python中的函式一樣,也是將一些可重用的程式碼定義成函式,從而通過呼叫函式即可方便地執行一系列程式碼。JS函式也支援提供引數,從而根據提供的引數完成更靈活更復雜的功能。在DOM物件之後使用.
可以訪問其自帶的一些內部屬性和函式,例如innerHTML
屬性即DOM物件的HTML內容,可以設定為純文字,也可以在其中包含HTML標籤。編寫程式碼並重新整理網頁,可以發現點選按鈕之後,h1
標籤的內容將會被替換成兩個p
。
function myFunc (argument) {
var t = document.getElementById(`title`);
t.innerHTML = `<p>按鈕被點選了</p><p>按鈕被點選了</p>`;
}複製程式碼
因此,我們可以大概總結出JS動態操作DOM元素的流程。要麼一開始直接在script
中進行相關操作,要麼通過onclick
等屬性繫結相應的事件響應函式,然後在響應函式裡完成一些操作,從而實現動態互動的網頁效果。
JS中的運算子包括算術運算子、比較運算子、賦值運算子、邏輯運算子等,和Python類似。
JS中也有條件和迴圈,分別使用小括號()
和大括號{}
顯式指定判斷條件和主體部分,而Python則是依靠適當的縮排來隱式指定。對於條件,需要注意,但凡出現if
的地方都必須加上判斷條件。JS迴圈以for
迴圈為主,可以用來遍歷陣列和物件。
// 條件
if (a == 1) {
console.log(`a equal 1`);
}
else {
console.log(`a not equal 1`);
}
if (a == 1) {
console.log(`a equal 1`);
}
else if (a == 2) {
console.log(`a equal 2`);
}
else {
console.log(`a not equal 1, 2`);
}
// 迴圈遍歷陣列
for (var i = 0; i < d.length; i++) {
console.log(i, d[i]);
}
// 迴圈遍歷物件
for (var key in e) {
console.log(key, e[key]);
}複製程式碼
現在我們應該能逐漸體會到各種程式語言的一些通性,雖然不同的程式語言都有各自的特點和強項,但核心的程式設計思想都是相通和類似的,不同的無非只是一些使用上的細節。因此,熟練掌握一門自己最習慣使用的程式語言,同時瞭解其他多門輔助的程式語言,對於提高自己的理解能力和程式設計能力都是有很有幫助的。
除了以上提及的滑鼠點選事件,JS中還支援很多其他型別的事件,例如滑鼠懸浮、滑鼠滾動、鍵盤輸入等,我們將在後續介紹JQuery的時候再進行詳細討論。
補充學習
關於JS的更多內容可以參考以下連結,www.runoob.com/js/js-tutor…,裡面提供了更為詳細和系統的講解,並結合大量例項程式碼加以鞏固,推薦完整地瀏覽和嘗試一遍。
掌握HTML、CSS、JS三件套之後,我們對Web基礎內容應當具備了一個大致的瞭解。後續的學習內容包括一些進階知識,例如基於JS、可以更加方便操作DOM元素的JQuery。Bootstrap是一款輕量的前端封裝,包括CSS和JS兩部分。前者提供了一些寫好的CSS class,這樣我們通過class的名稱便可以快速使用寫好的樣式;後者基於JS提供了一些封裝好的可以直接使用的網頁動態功能,例如標籤頁、模態框和輪播等,如果我們自己使用原生的JS程式碼去實現這些動態效果,往往需要耗費更多時間和程式碼。
當然,前端所涉及的內容非常之多,新的好用的框架也層出不窮、不斷迭代,例如之前提及的Angular.js
、React.js
和Vue.js
等。Web後端可選的框架則更為豐富,基於PHP、Python、NodeJs、Java等都可以搭建Web後端。不斷學習新的知識是好事,但是應當打好Web基礎,並分別熟練掌握至少一種前端框架和後端框架,這樣在後續通過Web網站實現動態互動的資料視覺化時,才能得心應手地實現想要的效果。
視訊連結:網頁的關節JS