JavaScript 網頁程式設計
Module 1. 測試及除錯工具
Module 2. 使用 script 標籤
Module 3. 常數和變數宣告
1-1: Chrome開發者工具 1-2: Console面板 1-3: Network面板
2-1: DOM簡介
2-2: 動態新增頁面標籤內容
2-3: 取得標籤元素
document.head
|
回傳 <head> 元件
|
document.body
|
回傳 <body> 元件
|
document.scripts
|
回傳 <scripts> 元件
|
document.title
|
回傳 <title> 元件
|
Camel Case 駝峰式 :
Snake Case 蛇式 :
var: 變數
let: 變數
const: 常數 -> 不會重新被定義
Demo on nb or DevTools
- // console.log(0o23) // 舊的 8 進位用法, 不建議使用 - console.log(0o23) // 8 進位 - console.log(0x23) // 16 進位 - console.log(0b1111) // 2 進位 - console.log(2e5) // 科學表示法
Let's Test on DevTools or Appendix on nb
1. 域不一樣!
2.
Let's test on DevTools
if(true){
//Start of the Block scope
let b = 'Hi I am in the Block';
//End of the Block scope
}
console.log(b);
//ReferenceError
(function(){
var s = 'Hi I am in the Function';
}())
console.log(s)
//ReferenceError
- Boolean // 布林 - Number // 數字 - String // 字串 - null // 空值 - undefined // 空值,也可視為一個型態 - true // 常數,不可作為變數名稱 (Js 開頭為小寫,與 Python 不同) - false // 常數,不可作為變數名稱 (Js 開頭為小寫,與 Python 不同)
我們來在 DevTools 測試 - true = 100
- 12 = 33 // 不能使用 因為 12 不是變數
- 0xFF0000 //色碼 RGB 所以這個是紅色
- 2e3
- 2E3 //大小寫皆可
- 2E-3 //後面是負的代表示 10^-3次方 2*0.001
- Number.MAX_SAFE_INTEGER //Type in DevTools
- Number.MAX_VALUE //Type in DevTools
- Number.POSITIVE_INFINITY //Type in DevTools
Number("123") // 123 Number("12.3") // 12.3 Number("") // 0 Number("0x11") // 17 Number("0b11") // 3 Number("0o11") // 9 Number("foo") // NaN Number("100a") // NaN
parseInt() 函式能將輸入的字串轉成整數。
parseFloat() 函式能將輸入的字串轉成浮點數。
!!n 轉換為 Boolean
.toString()可以將所有的的資料都轉換為字串,但是要排除null 和 undefined
toString() 括號中的可以寫一個數字,代表進位制,對應進位制字串
二進位制:.toString(2);
八進位制:.toString(8);
十進位制:.toString(10);
十六進位制:.toString(16);
String()可以將null和undefined轉換為字串,但是沒法轉進位制字串
example:
var str = String(null);
console.log(str, typeof str);
var str = String(undefined);
console.log(str, typeof str);
運算子 | 例子 | 說明 |
---|---|---|
+ | x + y | x, y 相加 |
- | x - y | x,y 相減 |
* | x * y | x, y 相乘 |
/ | x /y | x,y 相除 |
% | x % y | x,y 取餘數 |
** | x **y | x 的 y 次方 |
& | x &y | x y 做位元 AND 運算 |
^ | x ^ y | x y 做位元 XOR 運算 |
| | x | y | x y 做位元 OR 運算 |
10 > 5 //true 10 是否大於 5
10 >= 5 //true
10 < 5 //false
10 <= 5 //false
10 == 5 //false 值是否相同
10 != 5 //true
10 === 5 //false 值是否相同, 型態也要相同
10 !== 5 //true 值是否不同, 嚴謹
////陣列
'a' in ['a','b'] //false
0 in ['a','b'] //true
//陣列是看索引位置的
var people = { firstName: 'Andy', lastName: 'Tseng', gender: 'M' };
'firstName' in people; //true
//邏輯 AND -> &&
let fruit = 'Apple' && 'Banana'
//邏輯 OR -> ||
let fruit = 'Apple' || 'Banana'
//邏輯 NOT -> !
let notTrue = !(true && true)
var str = 'This is string text';
var str = "This is string text";
var str = `This is string text` ;
可以使用 單引' 雙引" 與反引號` example:
這樣會發生錯誤 example:
var str = 'Andy's hat.';
var str = "This is a "cat".";
這樣可以解決 example:
var str = "Andy's hat."; // 雙引內放單引
var str = 'This is a "cat".'; // 單引內放雙引
用跳脫字元 (escape character) 反斜線 (backslash) \
來處理引號
example:
var str = 'Andy \'s hat.';
var str = "This is a \"cat\"."; // 單引內放雙引
跳脫字元 \ 還可以處理以下這些
特殊符號 | 表示的符號 |
---|---|
\0 | NULL 字元 |
' | 單引號 |
" | 雙引號 |
\ | 反斜線 |
\n | 換行符號 |
\r | return 回車鍵 |
\t | tab |
\v | vertical tab |
\b | backspace |
\f | form feed |
\uXXXX | unicode codepoint |
字串相加
let a = 'hel'+'llo'
//'hello'
let name = 'Andy'
//'Andy'
let greetings = a + ' ' + name
// 'hello Andy'
let greetings += '!'
//'hello Andy!'
多行字串
let a = 'hel' +
'llo ' +
'Andy' +
//'hello Andy'
//Or,
let a = 'hel \
llo \
Andy'
//'hello Andy'
let name = 'Andy'
let greetings = `Hello ${name}, How are you?`
// Length
console.log(greetings.length)
//split
console.log(greetings.split(""))
//(24) ["H", "e", "l", "l", "o", " ", "A", "n", "d", "y", ",", " ", "H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", "?"]
console.log(greetings.split(" "))
//(5) ["Hello", "Andy,", "How", "are", "you?"]
console.log(greetings.split(","))
//["Hello Andy", " How are you?"]
var str = "This is an 'ant'";
var index = str.indexOf("an");
console.log(index)
// 8
Get script tag
7-1: 使用ES3的方法
7-2: querySelector()
7-3: querySelectorAll()
document.querySelector('#my_id') // 抓單一物件 抓 id
document.querySelector('.my_class') // 抓第一物件 抓 class
document.querySelectorAll("p") // 抓所有的 p
document.querySelectorAll("a[target]")// 抓有target屬性的a
8-1: 選擇敘述
8-2: 迴圈
8-3: break和continue
if(條件式){
//條件式為 true 執行
}
if: 依條件執行某程式區塊 ( block )
if/else: 條件式為 true 執行 block 1 否則 block 2
if(條件式一){
//條件式為 true 執行
}else{
if(條件二){
}else{
if(條件三)
}
}
if(條件式一){
//條件式為 true 執行
}else if(條件二){
}
else if(條件三){
}
switch(變數){
case 值一:
//變數為值一時
break
case 值二:
//變數為值二時
break
case 值三:
//變數為值三時
break
default:
// 預設值
}
switch/case
switch/case
for(起使值;條件式;步進式){
//迴圈內容
}
// Example
for(i=0; i<8; i++){
console.log(i)
}
for 迴圈
a++
++a
let i = 0
while(條件式){
//迴圈內容
i++
}
// Example
let i = 0
while(i<5){
console.log(i)
i++
}
while 迴圈
let i = 0
do {
//迴圈內容
i++
}while(條件式)
// Example
let i = 0
do {
console.log(i)
i++
}while(i<5)
do while 迴圈: 先跑一次再說
break 用來跳出迴圈
continue 跳到檢查條件繼續跑
9-1: Object類型的特點
9-2: Object表達式
9-3: for/in迴圈
var str = {firstName: 'Andy', lastName: 'Tseng'}
var list1 = ['apple', 'banana', 'cat']
str['firstName'] // Andy
str.firstName // Andy
delete str.firstName
Object: 是一個物件包含 key and value 用{} 表示
Array: 是一個有序的資料集合
Object: 一個 名稱 對應一個 值
也叫 hash table
key 為字串不重複,也稱做 字典 Dictionary
value 也可以是 function
key 沒有順序
let obj = {}
let obj1 = Object()
for/in 列舉變數 用於 Object
也可以用在 Array
Object 拿到 key
Array 拿到位置
10-1: Array類型的特點
10-2: Array表達式
10-3: Array的方法
for/of 用於迭代的(iterable)物件上,例如 Array,String
主要差別如下:
let obj = {
a:'apple',
b:'banana',
c:'cake'
}
for(let key of Object.keys(obj)){
console.log(obj[key]);
}
// 不如直接 for in
for(let id in obj){
console.log(obj[id]);
}
var list1 = ['apple', 'banana', 'cat']
for(let i =0; i<list1.length;i++){
console.log(i+':'+ list1[i])
}
list1[2] = "cake"
Array: 是一個有序的資料集合 用 [] 表示
索引從 0 開始
有長度 .length
//Unicode 方式 sort
const slogan = '安迪TV:全民普及!'
const cutSlogan = slogan.split('')
cutSlogan.sort();
console.log(cutSlogan);
let follower = [ 6, 8, 10, 23, 8]
follower.sort()
console.log(follower);
//由小到大
let follower = [ 6, 8, 10, 23, 8]
follower.sort(function(a,b){
return a-b
})
console.log(follower);
//Splice 用法
//.splice(位置, 刪除幾項, items);
const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "June"]
months.splice(4, 1, 'May');
// replaces 1 element at index 4
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "May"]
//forEach 用法
let man = [
{ name: 'Steve', age: 25, id: 'A006' },
{ name: 'Dave', age: 27, id: 'A009' },
{ name: 'Andy', age: 3, id: 'A088' },
];
man.forEach(function(val, ind){
console.log( ind +': ' + val.name )
})
//filter 用法
let words = ['spray', 'limit', 'elite', 'exuberant',
'destruction', 'present'];
let result = words.filter(function(word){return word.length > 6})
//let result = words.filter(word => word.length > 6);
console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]
//map 用法
let array1 = [1, 4, 9, 16];
// pass a function to map
let map1 = array1.map(function(x){ return x * 2});
console.log(map1);
// expected output: Array [2, 8, 18, 32]
//map 的作法
let array1 = [1, 4, 9, 16];
// pass a function to map
let map1 = array1.map(function(x){ return x * 2});
console.log(map1);
// expected output: Array [2, 8, 18, 32]
let array1 = [1, 4, 9, 16];
let map1 = []
array1.forEach(function(x){
map1.push(x*2)
})
console.log(map1);
11-1: JSON字串規則
11-2: Object和Array的複製
11-3: 編輯JSON檔
JSON 是個以純文字為基底去儲存和傳送簡單結構資料,你可以透過特定的格式去儲存任何資料(字串,數字,陣列,物件),也可以透過物件或陣列來傳送較複雜的資料。一旦建立了您的 JSON 資料,就可以非常簡單的跟其他程式溝通或交換資料,因為 JSON 就只是純文字個格式。
JSON 的優點如下:
{
"orderID": 54101,
"shopperName": "John Doe",
"shopperEmail": "johndoe@example.com",
"contents": [
{
"productID": 46,
"productName": "Helmet",
"quantity": 1
},
{
"productID": 98,
"productName": "Gas",
"quantity": 3
}
],
"orderCompleted": true
}
<object>
<property>
<key>orderID</key>
<number>54101</number>
</property>
<property>
<key>shopperName</key>
<string>John Doe</string>
</property>
<property>
<key>shopperEmail</key>
<string>johndoe@example.com</string>
</property>
<property>
<key>contents</key>
<array>
<object>
<property>
<key>productID</key>
<number>46</number>
</property>
<property>
<key>productName</key>
<string>Helmet</string>
</property>
<property>
<key>quantity</key>
<number>1</number>
</property>
</object>
<object>
<property>
<key>productID</key>
<number>88</number>
</property>
<property>
<key>productName</key>
<string>iPad</string>
</property>
<property>
<key>quantity</key>
<number>3</number>
</property>
</object>
</array>
</property>
<property>
<key>orderCompleted</key>
<boolean>true</boolean>
</property>
</object>
XML 的資料量遠大於 JSON 資料量
var jsonString = ' \
{ \
"orderID": 54101, \
"shopperName": "John Doe", \
"shopperEmail": "johndoe@example.com", \
"contents": [ \
{ \
"productID": 64, \
"productName": "Helmet", \
"quantity": 1 \
}, \
{ \
"productID": 88, \
"productName": "iPad", \
"quantity": 3 \
} \
], \
"orderCompleted": true \
} \
';
// 從 JSON 字串 換回 js Object
let cart = JSON.parse ( jsonString );
console.log( cart.shopperEmail );
console.log( cart.contents[1].productName );
// 把物件 變成字串
let jsonStr = JSON.stringify(cart)
console.log(jsonStr)
let arrayA = [28, 77, 'abc', ['John', 63, 'male'] ];
let arrayB = arrayA;
let arrayC = arrayA.slice(); // 單層
arrayA[3][0] = 'Mary';
arrayA[0] = 87;
console.log('arrayA:', arrayA);
console.log('arrayB:', arrayB);
console.log('arrayC:', arrayC);
一般淺層複製,slice 深層複製
let arrayA = [28, 77, 'abc', ['John', 63, 'male'] ];
let arrayB = arrayA;
let arrayJSON = JSON.stringify(arrayA)
let arrayC = JSON.parse(arrayJSON)
arrayA[3][0] = 'Mary';
arrayA[0] = 87;
console.log('arrayA:', arrayA);
console.log('arrayB:', arrayB);
console.log('arrayC:', arrayC);
Let's try jsoneditoronline.org
12-1: 基本型函式
12-2: 暱名函式
12-3: 箭頭函式
function 函式名稱(參數們) {
// 內容
return 回傳值
}
// Example
function myFunc() {
console.log('hi')
}
myFunc() // call myFunc function
定義
// 使用參數
function myFunc(a, b) {
console.log('a:' + a)
console.log('b:' + b)
console.log('arguments:' + arguments)
console.log(JSON.stringify(arguments))
}
myFunc(5, 8, 7);
// ES6
function myFunc2(a, ...b) {
console.log('a:' + a)
console.log('b:' + b);
}
myFunc2(5, 8, 7);
//舊
function multiply(a, b) {
b = (typeof b !== 'undefined') ? b : 1;
return a * b;
}
//ES6
function multiply(a, b = 1) {
return a * b;
}
multiply(3, 3); // 9
multiply(4, 6); // 24
multiply(7); // 7
var square = function(num) {
return num**2;
};
沒有名稱直接用
let square = (num) => {
return num**2;
}
let square = num => num**2
13-1: 全域變數
13-2: 區域變數
13-3: closure
定義:
var a='apple'; //全域變數
function banana(){
var b='banana'; //區域變數
console.log('aInFunc:'+a)
console.log('bInFunc:'+b)
}
banana()
console.log('aNotInFunc:'+a)
console.log('aNotInFunc:'+b)
閉包,由內部函式居然能在外部執行,十分有趣!
想一想!由 function 內往外推
14-1: Date 物件
14-2: setTimeout 用法
14-3: setInterval 用法
today = new Date() //無參數 今天
Xmas95 = new Date("December 25, 1995 13:30:00") //忽略為零
Xmas95 = new Date(1995,11,25,9,30,0) //多參數
//"set" 方法,用於設定 Date 物件的日期和時間的值。
//"get" 方法,用於取得 Date 物件的日期和時間的值。
我們現在學會了用電腦來設定時間,
但,能不能夠用程式將時間設定成
使用者易讀的文字格式呢?
接著看下去..GO!
function JSClock() {
//存現在時間
let time = new Date()
//取得小時
let hour = time.getHours()
//取得分鐘
let minute = time.getMinutes()
//取得秒數
let second = time.getSeconds()
//將 0-24 小時制轉成 0-12 小時制
var temp = "" + ((hour > 12) ? hour - 12 : hour)
//如果是0點就是12點
if (hour == 0)
temp = "12";
//小於十要補零 其他不用
temp += ((minute < 10) ? ":0" : ":") + minute
//小於十要補零 其他不用
temp += ((second < 10) ? ":0" : ":") + second
//判斷上下午
temp += (hour >= 12) ? " P.M." : " A.M."
return temp
}
那我們能不能夠 等一下!
再讓程式跑呢?.....
可以的!
接著看下去..GO!
// 語法
setTimeout(function 函式,
milliseconds 毫秒,
param1 參數一,
param2 參數二,
...);
// 範例
setTimeout(function(){
alert("Hello");
}, 3000);
接著看下去..GO!
setTimeout(function(){ console.log("2 seconds") }, 2000);
setTimeout(function(){ console.log("4 seconds") }, 4000);
setTimeout(function(){ console.log("6 seconds") }, 6000);
有沒有更好的作法?
// 語法
setInterval(function 函式,
milliseconds 毫秒,
param1 參數一,
param2 參數二,
...);
// 範例
let a = setInterval(function(){
console.log("Hello");
}, 3000);
//清掉 Interval
setTimeout(function(){
clearInterval(a)
},20000)
15-1: 亂數
15-2: 三角函數
15-3: 環狀排列物件
Math.floor(Math.random() * 10) + 1;
// Math.floor 無條件捨去到整數
// 回傳一到十的亂數
定義: 0-1的亂數,包括零,不包括一!
.
function getRndInteger(min, max) {
return Math.floor(Math.random() *
(max - min) ) + min;
}
// 包括 min 不包括 max
.
function getRndInteger(min, max) {
return Math.floor(Math.random() *
(max - min + 1) ) + min;
}
// 包括 min 包括 max
.
// 放一個 rad 數字 360度需轉換
// Math.PI * a角度 / 180
Math.sin(3); // 0.1411200080598672
Math.sin(-3); // -0.1411200080598672
Math.sin(0); // 0
Math.sin(Math.PI); // 1.2246467991473532e-16
Math.sin(Math.PI / 2); // 1
// cos, tan 依此類推
.
.
16-1: window物件的方法
16-2: window的子物件
16-3: document的常用屬性
alert() // 跳出警示對話框
blur() // 視窗失焦
clearInterval() // 清除重複觸發某函式
clearTimeout() // 清除觸發一次某函式
close() // 關閉視窗
confirm() // 跳出確認對話框
focus() // 視窗取得焦點
print() // 執行列印
prompt() // 跳出詢問對話框
setInterval() // 間隔一段時間後重複觸發函式
setTimeout() // 間隔一段時間後觸發一次函式
.
.
//指令 //類型 //說明
URL // String // 網址
anchors // HTMLCollection // Anchor集合
characterSet // String // 網頁使用的編碼,同charset
cookie // String // Cookies
doctype // DocumentType // 文件類型
domain // String // 網域名稱
forms // HTMLCollection // 表單集合
head // HTMLHeadElement // Head元素
images // HTMLCollection // 圖片集合
links // HTMLCollection // 連結集合
referrer // String // 從哪兒來
title // String // 標頭名稱
Document 常用方法在7-1-1 有範例
.
17-1: 標籤內的事件處理器
17-2: addEventListener
17-3: onclick 與 addEventListener 比較
onclick // 當單擊
ondbclick // 當雙擊
onmousedown // 當鼠標按下
onmouseup // 當鼠標放開
onmousemove // 當鼠標在元素上移動
onmouseover // 當鼠標移入元素
onmouseout // 當鼠標移出元素
onkeydown // 當鍵盤按下 body 功能
onkeyup // 當鍵盤放開 body 功能
onkeypress // 當鍵盤按著(可持續) body 功能
onload // 當鍵盤按下 body,object 功能
onresize // 當文件調整長寬
onscroll // 當文件捲動
onblur // 當失焦
onchange // 當內容改變 input, select, textarea 功能
onfocus // 當聚焦
onreset // 當表單重置
onselect // 當選取 input, textarea 功能
onsubmit // 當送出表單
.
語法:
.
.
18-1: 什麼是 AJAX
18-2: XMLHttpRequest
18-3: fetch()方法
.
說明:
.
fetch API 讓 http 的處理更加簡單! 發送跟接收資料都可以!
.