Javascript 初學筆記
透過 HTML 和 CSS 能夠搭建出一個美美的網頁,用來呈現資訊算夠用了,但如果是要提供使用者動態回饋的話則要仰賴 Javascript,本篇文章簡單介紹一下 Javascript 如何讀取網頁的元素資訊並動態的新增和修改 HTML/CSS 的內容。
Javascript是什麼
首先與 HTML/CSS 不同的是,Javascript (JS) 是程式語言,就跟C、Python等語言一樣,他能辦到相當多事情,最常見的用處就是用於動態的提供網頁內容: 網頁會根據使用者的操作/資料產生變化,其中又可分成 Server Side 跟 Client Side,差別在動態過程是發生在伺服器端還是瀏覽器端,這邊先只介紹 Client Side 的應用,底下提供一個簡單範例:
JS Demo
demo
可以在左側 input 視窗內打點東西,然後點擊中間的箭號,JS 會將使用者輸入的資料同步到右側的視窗。JS 達成此事的過程可分成三個步驟: 提取元素、邏輯運算、顯示。
提取元素
為了能夠讀取使用者輸入的資料,JS 必須先知道要選取哪個元素,這部分可以透過元素設定的
id、class 來辨識,底下列出常見的兩種方式:let element = document.getElementById("$ELEMENT ID");
let collection = document.getElementsByClassName("$ELEMENT CLASSNAME");let- 用來創建變數,JS 中還有另一種宣告方式:var,兩種差異在於let是 block-scoped,變數的生命週期只限於同一個 block ({ ... }),var則是 function-scoped,變數在同個 function 都有效。從這裡可以看出 JS 跟 Python 一樣都是 untyped languages。
document- JS 物件,可以當成是用來與 HTML 文件互動的介面。getElementById- 透過元素的id來選取元素,回傳型別為 HTMLElement 。getElementsByClassName- 透過元素的class來選取元素 不過由於 classname 並非獨特的,因此回傳時會以 collection 的形式來傳送多個元素,之後處理時可以用collection[0]、collection[1]... 來存取各別的元素。
如果想透過類似 CSS Selector 去選取物件,JS 也有提供以下兩種方法,用法上相對彈性可以支援階層式/條件式的選取,兩者的差異在於
querySelector 只會回傳第一個符合條件的元素, querySelectorAll 則是全部回傳。let element = document.querySelector("$YOUR SELECTOR");
let nodelist = document.querySelectorAll("$YOUR SELECTOR");getElementBy 跟 querySelector 傳回的資料型態不太一樣,不過初學時先忽略吧~~。
邏輯運算
邏輯運算就跟想要達成的效果有關,在我們的範例中沒有做什麼額外的處理,只是單純的把元素的內容取出:
element.value,所以這邊就展示一下 JS 的相關語法好了~~~變數宣告
程式語言中常見的基本型別: 整數、浮點數、字串、布林、陣列、物件,雖然宣告上看起來有整數與浮點數之分,但數值資料都是double格式存儲。
let x1 = 10;
let x2 = 10.7;
let x3 = "my string";
let x4 = true;
let x5 = ["A", "B", "C"];
let x6 = { "type": "NPC", "job": "Coding"};運算子
除了基本的四則運算,JS 運算子與C語言很像,同樣有
++i、i++,let x1 = 0;
let x2 = x1 + 0.5;
let x3 -= x2++;
let x4 = x2 * 2;
let x5 = x4 / 3;流程控制
底下展示的是最常用的
if-else 跟 for-loop 的範例: 遍歷一個物件陣列,然後再根據 value 大小進行統計。// elements是陣列,內部元素是物件
for (let i = 0; i < elements.length; i++) {
if (elements[i]["value"] > 10) {
a++;
} else if (elements[i]["value"] > 3) {
b++;
} else {
c++;
}
}字串處理
網頁資料的動態產生很常會涉及到字串處理,因為得修改 HTML 文件內容,這邊提供一些常用的指令:
| Method | Function | Example |
|---|---|---|
| length | 字串長度 | "npc".length → 5 |
| substring(start, end) | 子字串(不含 end) | "npc".substring(0, 2) → "np" |
| includes(sub) | 是否包含子字串 | "npc".includes("pc") → true |
| trim() | 去除前後空白 | " npc ".trim() → "npc" |
| replace(old, new) | 替換第一次出現 | "nnpc".replace("n", "i") → "inpc" |
| replaceAll(old, new) | 替換所有出現 | "nnpc".replaceAll("n", "i") → "iipc" |
| split(sep) | 切割成陣列 | "a,b,c".split(",") → ["a","b","c"] |
顯示
處理後的資料自然是要顯示出來,才能給使用者瀏覽,常見有三種方式能夠達成:
console.log()
這主要是給程式開發人員 debug 使用的,在 JS 中使用此指令 ex:
console.log("Hi");,會在開發者工具的主控台顯示 "Hi",至於這個主控台可以點選 F12 即可檢視,想看效果可以點擊 按鈕即可在 console 顯示 "Hi"。alert()
相較於 console 一般人不會看到,alert 則是會產生一個跳出視窗通知使用者,來試著點看看吧: 。
修改 HTML 元素
前兩個方法的用途比較特殊,最常見的顯示方式還是直接修改 HTML 網頁資料,要修改現有元素的資料只需要指定此元素的
textContent, innerText, innterHTML:// diplay是元素
display.textContent = "demo message";
display.innerText = "demo message";
display.innerHTML = "<b>demo message</b>";textContent 跟 innerText 只會把內容物當純文字,兩者間的差異在於 innerText 會額外考慮渲染 (render) 的結果,因此會額外考慮 CSS 的設定,這點在取得元素內容時才會顯現,在以下的範例中,textContent 得到的是 hello,而 innerText 則是 HELLO。<h1 class="uppercase">hello<h1>h1.uppercase {
text-transform: uppercase;
}至於
innterHTML 則是會將內容物當成 HTML 標籤,所以<b>demo message</b>會視為加粗文字的標籤。當然我們也可以透過這種方式添加多層的 HTML 元素,但以程式的角度來說不太方便管理,通常會採用另一種方式:anchor = document.createElement("a");
anchor.innerHTML = "my web";
anchor.setAttribute("href", "https://personalworkingspace.github.io/");
anchor.style.color = "blue";document.createElement 用來創造 HTML 的元素,上面創造一個 anchor,創造出來的元素跟我們用 getElementBy 取得的是一樣的,能夠替他設定 innerHTML、attribute 以及 style。範例
要引用 JS code 到 HTML 文件中,首先得創立一個 JS 檔案 ex: script.js,然後在 head 或 body 內填入以下內容:
<script src="script.js"></script> <!-- 載入 JS 檔案 -->至於 script.js 的內容,底下提供 Demo 的 JS 範例:
window.onload = function() {
setDemo();
}
function setDemo() {
let button = document.getElementById("demo-button");
button.onclick = updateDemoDisplay;
}
function updateDemoDisplay() {
let text = document.getElementById("demo-input");
let value = text.value;
let display = document.getElementById("demo-display");
display.textContent = value;
}讓我們說明每個 function 的功能吧:
window.onload- 前面提到 JS 應用需要提取 HTML 元素,但 HTML 元素必須等網頁載入後 (onload) 才會存在,所以建議是把主要執行的部分放到window.onload裡面呼叫,避免找不到元素。setDemo- 學會了 JS 生成網頁的三個步驟後,你可能會發現還少了點甚麼,就是觸發事件,前面說的流程都是在我們觸發一個事件後才會開始跑: 點擊按鈕,而 JS 中 HTML 元素都能設定 click 事件:button.onclick = updateDemoDisplay。updateDemoDisplay- 這塊就是前面提到的三個流程,我們取得使用者輸入資料的元素和之後要顯示的區塊、提取輸入的字串、設定顯示區塊內部的字串。
總結
這邊介紹了一點 Javascript 的皮毛,實現了動態生成網頁內容,加上前面幾篇介紹過的 HTML 跟 CSS,我們已經把網頁設定所需的三大技術學會了 (剩下就是精進了~~~),接下來讓我們把搭建的網頁從 localhost 搬到正式的對外網路吧,讓他成為真正的網站!