Spring 2019 。 Ric Huang
在學習完 HTML & CSS 之後,
你應該是有能力可以刻出一個靜態網頁
(雖然 CSS 的 state selector
也是可以做出一定程度的動態網頁啦!)
現代的動態網頁 (各種跟使用者 I/O 的互動),
幾乎都是使用 JavaScript 寫的
但為了接下來理解如何
利用 JavaScript 製作出動態網頁,
我們必須先瞭解何謂
DOM (Document Object Model)
(wiki) …is a cross-platform and language-independent application programming interface that treats an HTML, XHTML, or XML document as a tree structure wherein each node is an object representing a part of the document.
剛剛改的是你瀏覽器(前端)收到的 HTML (i.e. local 端),一但 reload, 從 server 端 (i.e. 台大計中) 重新載入網頁,剛剛的修改就都不見了!
不過,如果你寫了一個網頁服務程式,放在自己的伺服器,讓使用者在他的瀏覽器進行互動的過程中 (如:滑鼠點按、填資料送出等),將「動作」送至伺服器,然後你的網頁程式「聽到」這個動作「事件」後,送回對應的網頁更新(部分)腳本,使用者就會看到更新的網頁了!
Year 1995 (rise of IE; Netscape/Sun/Microsoft)
Brendan Eich created it in a few weeks
披著 Java 皮,流著 Scheme (first-class function) / Self (prototype-based)的血
Inter-platform operability
Native support on VM
(Already is) Full-stack language
var a = “38”;
var b = false;
console.log(a + !b);
0.1 + 0.2; // = 0.30000000000000004
不用先定義 class 即可建置物件,且一旦一個物件被建置好,後續的物件可以用它來當作原型來建置類似的物件
也就是說 functions 被當成是一般的變數(物件),可以當成其他 function 的參數或是回傳值,也可以被 assigned 給別的變數
var a = 1;
console.log(a);
型態 | 範例 |
---|---|
Undefined (未定義) | undefined |
Null (空值) | null |
String (字串) | "哎呀" |
Boolean (布林值) | true, false |
Number (數字) | 3.1415926 |
{ property: value, ... }
var me = { name: "Ric", age: 18 }
var a = { name:"Ric", score:100 };
var b = new Date;
function Student(name, score) {
this.name = name;
this.score = score;
}
var c = new Student(“Ric”, 100); // return this
var a = new Number(3); // 不建議
var b = Number(3); // What's the difference?
console.log(a === b); // false
var a = 3; // a is a primitive
var b = Number(3); // b is a primitive
var c = new Number(3); // c is an object
var o = new Object;
var o = new Object;
console.log(o);
// No need to define "name" and "score" in advance
o.name = "Ric";
o.score = 100;
var o2 = new Object;
console.log(o);
console.log(o2);
var a = 3;
var b = a; // {a, b} = {3, 3}
b = 4; // {a, b} = {3, 4}
a = 5; // {a, b} = {5, 4}
var i = { a:3 };
var j = i;
j.a = 4; // i.a = 4
i.a = 5; // j.a = 5
Functions in JavaScript is “first-class”
// Function as an object (i.e. constructor function)
var f = function add(a, b) { return a + b; };
Function can be anonymous // recommended
var add = function(a, b) { return a + b; };
// f is an reference to add
var f = function add(a, b) { return a + b; };
// print out the returned value of f(3,4)
console.log(f(3,4));
// print out f itself
console.log(f);
// Error (why?)
console.log(add);
var f = function(a, b) { return a + b; };
f(3,5);
f(f(1,2),3);
var f = function(s) {
return s?
function(a,b) { return a+b; }:
function(a,b) { return a-b; }
};
var f1 = f(true); f1(3,5);
var f2 = f(false); f2(3,5);
var a = { name:"Ric", score:100 };
a.gender = "Male";
var a = {
name:"Ric", score:100,
report: function() {
return this.name + " got " + this.score;
}
};
a.report(); // Ric got 100
a.isPass = function() {
console.log(this.score >= 60? “Yes”: “No”);
};
a.isPass() // Yes
(function() {
... some statements
})();
function f(a) { console.log(a); } f(0); var b = f; b; b(10); b("Hello"); var c = f(20); c; // undefined c(30); // Error!
var f = function add(a, b) { return a + b; }; add(10, 20); // Error! f(20, 30); var g = f; g(30, 40); var h = add; // Error! h(40, 50); // Error!
var f = function add(a, b) { return a + b; }; var g = add; // Error var h = function add(a, b) { return a + b; }; var i = function add(a, b, c) { return a + b + c; }; var f = "Hello"; // overloading f
var f = function pp() { ... } var g = f; var f = function qq() { ... } console.log(f); // qq console.log(g); // pp
var students = [ "John", "Mary", "Ric" ];
var students = new Array("John", "Mary", "Ric");
var a = [ "Ric", 100, function() { return "Hello!"; } ];
a[2](); // Hello!
// initialized as an empty array
var s = [ ];
s.push("John"); // recommended
s[s.length] = "Mary"; // length is now 2
s[3] = "Ric"; // OK, but create an “undefined” in [2]
var students = [ "John", "Mary", "Ric" ];
typeof students; // object
Array.isArray(students); // true
var a = { name:"Ric", score:100 };
a["name"]; // "Ric"
a[0]; // undefined
Array.isArray(a); // false
var s = [];
s[0] = "John";
s["Name"] = "Ric";
console.log(s); // ["John", name: "ric"]
Array.isArray(s); // true
Comparison in JavaScript use "===" and "!=="
"==" 跟 "!=" 會雞婆地幫你做型別轉換
"5" == 5; // = true
null == undefined; // = true
Variable 定義的位置會自動抬升到最前面
以下兩種寫法是一樣的(雖然前者不太正常):
a = 1;
var a = 2;
var a = 1;
a = 2;
sum(3,5); // This is OK!
function sum(a, b) { return a + b; };
sum(3,5); // Error
var sum = function(a, b) { return a + b; };
事實上,“var” 沒有寫也會過,只是會被視為全域變數 (global variable)
此外,”var” 如為區域變數,其範圍並非 block, 而是 function scope
function() {
for (var i = 0; i < 10; i++)
console.log(i);
}
// 等同於
function() {
var i;
for (i = 0; i < 0; i++)
console.log(i);
}
var a = 0;
{ var a = 10; } // 仍屬同一範圍之 'a'. a = 10 now
var b = function() { var a = 20; }
b(); // local 'a' 並非 global 'a'. 所以 a 仍然為 10
<div id="target"></div>
<div class="a-class"></div>
var target = document.getElementById("target");
var arr = document.getElementsByClassName("a-class");
var arr2 = document.getElementsByTagName("div");
var target = document.querySelector("#target");
var arr = document.querySelectorAll(".a-class");
var arr = parentNode.children;
var element1 = parentNode.firstElementChild;
var element2 = parentNode.lastElementChild;
var count = parentNode.childElementCount;
var newElement = document.createElement(“div”);
var newText = document.createTextNode(“Hello!”);
// become the last child
var appendedNode = parentNode.appendChild(childNode);
// removed from parent
var removedNode = parentNode.removeChild(childNode);
// insert before refNode
var insertedNode = parentNode.insertBefore(newNode, refNode);
// replace child node
var replacedNode = parentNode.replaceChild(newNode, oldNode);
// get the serialized HTML code for all of its children
const childrenHTMLCode = thisNode.innerHTML;
// replace all of its children using the HTML code
thisNode.innerHTML = childrenHTMLCode;
// modify CSS style
thisElement.style.color = “red”;
// modify properties
thisElement.className = “new-class1 new-class2”;
thisElement.classList.add(className);
thisElement.classList.remove(className);
<button id="target">是個按鈕</button>
var targetElement = document.getElementById("target");
targetElement.addEventListener(
"click",
function() {
// ..做一些事,任何事,你希望按鈕按了要幹麻?
alert('你希望按鈕按了要幹麻?');
}
);
<p>Click anywhere in this example.</p>
<p id="log"></p>
let log = document.getElementById('log');
log.onclick = inputChange;
function inputChange(e) {
//.. some something here
}
<div class="myClass" onclick="clickHandler()">