JavaScript是一門為你的網(wǎng)站添加交互功能的編程語言。(例如:游戲,響應(yīng)按下或者以表單輸入的數(shù)據(jù),動態(tài)樣式,動畫等)。本文可以幫助您開始使用這種令人興奮的語言,并給你一個什么是可能的想法。
JavaScript(縮寫:JS)是一門成熟的動態(tài)編程語言,應(yīng)用于HTML文檔時,可以在網(wǎng)站上提供動態(tài)交互性。它是Mozilla項目聯(lián)合創(chuàng)始人,Mozilla基金會和Mozilla公司的Brendan Eich發(fā)明的。
JavaScript是非常通用的。你可以從簡單做起,比如輪播、相冊,浮動布局和按鈕點擊事件。隨著你學(xué)習(xí)的深入,你可以創(chuàng)建游戲、2d和3d動畫、數(shù)據(jù)庫驅(qū)動的綜合應(yīng)用程序,以及更多!
JavaScript本身是非常簡潔卻非常靈活的。開發(fā)者們編寫了非常多的工具補充JavaScript語言功能。使得花最小的代價獲得大量額外功能。這些功能包括:
因為這篇文章只是JavaScript的簡介,這個階段,我們不打算過于詳細的介紹JavaScript語言以及前面提及的工具。你可以之后在 JavaScript 章節(jié)和MDN的余下課程上學(xué)習(xí)更多的細節(jié)。
下面我們將介紹語言的一些核心部分,你也可以做一些關(guān)于瀏覽器API的練習(xí)。
上面的內(nèi)容聽起來非常激動人心,而且也應(yīng)該如此——JavaScript是最讓人激動的Web科技之一,而且你對它掌握的越多,你的網(wǎng)頁將進入一個更有創(chuàng)造力和更加強大的層次。
然而,JavaScript 比 HTML 和 CSS 學(xué)習(xí)起來更加復(fù)雜,所以你需要一步一步謹慎地跟隨我們。首先,我們將向你展示怎么添加一些基本的 JavaScript 腳本到你的頁面中來創(chuàng)造一個 "hello world"示例(編程世界的標準示例)。
注意:如果你沒有學(xué)習(xí)我們之前的課程,點擊下載示例代碼 然后將其作為你的出發(fā)點。
main.js
文件。index.html
文件,在</body>
閉合標簽之前輸入這一行代碼: <script src="scripts/main.js"></script>
<link>
元素功能相同——它將 JavaScript 引入了頁面,所以它將影響 HTML(包括 CSS 和其他頁面上的任何內(nèi)容)。 main.js
文件中:var myHeading = document.querySelector('h1'); myHeading.innerHTML = 'Hello world!';
index.html
。你應(yīng)該看到如下內(nèi)容:提示:我們將<script>
元素放在 HTML 文件底部的原因是,瀏覽器按照代碼在文件中的順序解析 HTML 。如果JavaScript最先被加載,HTML還未加載,JavaScript將無法作用于HTML,所以JavaScript無效,如果JavaScript代碼出現(xiàn)問題則HTML不會被加載。所以將JavaScript代碼放在底部是最好的選擇。
你的標題通過JavaScript被更改為了"Hello world!"。我們首先使用一個函數(shù)querySelector()
來獲取標題這個對象,然后將其儲存在一個叫myHeading
的變量中。這與我們 CSS 中的選擇符非常相像。如果你想對某個元素進行操作,首先你得先選擇它。
在那之后,我們將myHeading
的屬性innerHTML
(代表這個標題的內(nèi)容)賦予了"Hello world!"這個值。
來讓我們解釋一下 JavaScript 這門語言的基本特性,以便讓你們更好地了解它是怎么運作的。更棒的是,這些特性對編程語言來說很常見。如果你能夠了解這些基礎(chǔ),你應(yīng)該能更好地在編程的世界里徜徉!
注意:在這篇文章的學(xué)習(xí)中,將示例代碼輸入到你的瀏覽器的控制臺里看看會發(fā)生什么。要查看更多關(guān)于瀏覽器控制臺的信息,點擊 探索瀏覽器控制臺工具。
Variables 是你存儲數(shù)據(jù)的容器。要聲明一個變量你需要使用關(guān)鍵字var
,然后輸入任何你想要的名稱:
var myVariable;
提示:行末的分號表示語句結(jié)束,不過這個分號只有在單行內(nèi)需要分割語句時才是必須的。然而,一些人認為在每個語句后面加分號是一種好的風(fēng)格。這里為你提供了更多關(guān)于是否應(yīng)該加分號的規(guī)則 — 查看Your Guide to Semicolons in JavaScript獲取更多的細節(jié)。
提示:你幾乎可以以任何名稱來命名一個變量,不過我們有一些限制(點擊這里查看 變量命名規(guī)則 。) 如果你不確定,你可以 驗證你的變量名查看是否有效。
提示:JavaScript 是對大小寫敏感的——myVariable
與myvariable
是不同的。如果你的代碼出現(xiàn)問題了,查看一下大小寫有沒有錯誤!
定義一個變量之后,你可以賦予它一個值:
myVariable = 'Bob';
你可以通過變量名稱讀取變量:
myVariable;
你也可以將這些操作寫在一行:
var myVariable = 'Bob';
在給變量賦值之后,你可以改變變量的值:
var myVariable = 'Bob'; myVariable = 'Steve';
注意變量有不同的 數(shù)據(jù)類型 :
變量 | 解釋 | 示例 |
---|---|---|
String | 字符串,一段文本。要指示變量是字符串,你應(yīng)該將它們用引號包裹起來。 | var myVariable = 'Bob'; |
Number | 數(shù)字,一個數(shù)字。不用引號包圍。 | var myVariable = 10; |
Boolean | 布爾型,一個 True/False (真 / 假)值。 true /false 是 JS 里的特殊關(guān)鍵字,不需要引號。 | var myVariable = true; |
Array | 數(shù)組,一種允許你存儲多個值在一個引用里的結(jié)構(gòu)。 | var myVariable = [1,'Bob','Steve',10]; 調(diào)用數(shù)組的元素只需: myVariable[0] ,myVariable[1] ,等等。 |
Object | 對象,基本上 JavaScript 里的任何東西都是對象,而且都可以被儲存在變量里。將這個記在腦子里。 | var myVariable = document.querySelector('h1'); 上面所有示例都是對象。 |
那么為什么我們需要變量呢?好吧,在編程時要做任何有趣的事我們必須用到變量。如果值沒有改變,那么你將無法動態(tài)地做任何事,就像個性化一個祝福短信或是改變在圖片庫里展示的圖片。
你可以在 JavaScript 中添加注釋,就像你在 CSS 中做過的一樣。
/* Everything in between is a comment. */
如果你的注釋只有一行,我們經(jīng)常將它們更簡單地放在兩個斜杠之后,就像這樣:
// This is a comment
operator 運算符是一個根據(jù)兩個值(或變量)做出結(jié)果的代數(shù)符號。在下面的表里你可以看到一些最簡單的運算符,后面的示例你可以在瀏覽器控制臺里嘗試一下。
運算符 | 解釋 | 符號 | 示例 |
---|---|---|---|
加/連接 | 用來相加兩個數(shù)字,或者連接兩個字符串。 | + | 6 + 9; |
減、乘、除 | 這些運算符操作將與你期望它們在基礎(chǔ)數(shù)學(xué)中所做的一樣。 | - , * , / | 9 - 3; |
賦值運算符 | 你之前已經(jīng)見過這個符號了:它將一個值賦給一個變量 | = | var myVariable = 'Bob'; |
相等 | 它將測試兩個值是否相等,而且會返回一個 true /false (布爾型)值。 | === | var myVariable = 3; |
非,不等 | 經(jīng)常與相等運算一起使用,非運算符在JS中表示邏輯非——它也返回一個布爾值。 | ! , !== | 原本的值是 true ,但是返回了 false 因為之后我們做了非運算:
這里我們測試了"我的
|
還有很多運算符供我們探索,不過暫時我們只需要這么多。點擊 表達式和運算符 查看完整列表。
提示:計算時如果混合幾種數(shù)據(jù)類型可能導(dǎo)致奇怪的結(jié)果,所以請謹慎地正確地引用你的變量,然后得出你期望的結(jié)果。比如輸入"35" + "25"
到控制臺。為什么結(jié)果與你想象的不同?因為引號將數(shù)字轉(zhuǎn)換成了字符串,所以最終會連接兩個字符串而不是相加數(shù)字。如果你輸入35 + 25
,你會得到正確的結(jié)果。
語句是能夠讓你測試一個表達式是否返回 true 然后根據(jù)結(jié)果運行不同的代碼的結(jié)構(gòu)。最常用的語句形式是if ... else
。下面是一個例子:
var iceCream = 'chocolate'; if (iceCream === 'chocolate') { alert('Yay, I love chocolate ice cream!'); } else { alert('Awwww, but chocolate is my favorite...'); }
if ( ... )
里面的表達式就是測試 — 這里使用了運算符(上面所提到的)來比較變量iceCream
與字符串chocolate
是否相等。 如果返回true
,運行前面一塊的代碼。如果返回 false,跳過第一段直接運行else
之后的代碼。
Functions 是一種封裝你想重復(fù)使用的功能的方法,這樣你就可以在任何時候想使用其中的功能就通過函數(shù)名稱來調(diào)用而不用老是重復(fù)寫下整段代碼。你在上面已經(jīng)見過一些函數(shù)了,比如:
var myVariable = document.querySelector('h1');
alert('hello!');
這些函數(shù)是瀏覽器內(nèi)置的,你可以在任何時候使用。
如果你看到一些東西長得像變量名但是有括號 —()
— 在后面,這可能就是一個函數(shù)。函數(shù)通常包括 arguments — 一些必要的參數(shù)。它們在括號內(nèi)部, 如果有一個以上參數(shù)則使用逗號分開。
比如,alert()
函數(shù)在瀏覽器窗口內(nèi)彈出一個警告框,但是我們需要給參數(shù)傳入一個字符串以告訴函數(shù)應(yīng)該在警告框里寫什么。
好消息是你可以定義你自己的函數(shù) — 在下一個例子里我們會寫一個簡單的需要兩個參數(shù)來做乘法運算的函數(shù)。
function multiply(num1,num2) { var result = num1 * num2; return result; }
嘗試在控制臺運行這個函數(shù),然后自己嘗試幾次不同的參數(shù),比如:
multiply(4,7); multiply(20,20); multiply(0.5,3);
提示:return
語句告訴瀏覽器返回result
變量以便使用。這是很有必要的,因為函數(shù)內(nèi)定義的變量只能在函數(shù)內(nèi)使用。這叫做作用域 scoping (詳見 變量作用域)
在網(wǎng)頁上創(chuàng)建真正的交互,你需要使用事件 — 事件是能夠捕捉瀏覽器操作并且允許你運行代碼進行響應(yīng)的代碼結(jié)構(gòu)。最明顯的事件是 點擊事件,在鼠標點擊什么的時候被瀏覽器喚醒。為了演示這個操作,嘗試將下面的代碼輸入到控制臺,然后在當前頁面點擊:
document.querySelector('html').onclick = function() { alert('Ouch! Stop poking me!'); }
我們有許多方法來將一個事件與元素綁定。在這里我們選擇了 HTML 元素然后將onclick
屬性設(shè)置成包含單擊時我們想要運行的代碼的匿名函數(shù)。
注意到
document.querySelector('html').onclick = function() {};
相當于
var myHTML = document.querySelector('html'); myHTML.onclick = function() {};
只是更加簡潔。
現(xiàn)在我們已經(jīng)講述了一點 JavaScript 的基礎(chǔ)了,讓我們添加一些更酷的特性到示例網(wǎng)頁里來看看我們能做什么。
這一部分我們將添加另一個圖片到我們的站點,并且添加簡單的 JavaScript 使得單擊圖片時轉(zhuǎn)換圖片。
images
文件夾。打開main.js
文件,輸入下面的 JavaScript 代碼(如果你的 hello world JavaScript 仍然在這,刪除它們):
var myImage = document.querySelector('img'); myImage.onclick = function() { var mySrc = myImage.getAttribute('src'); if(mySrc === 'images/firefox-icon.png') { myImage.setAttribute ('src','images/firefox2.png'); } else { myImage.setAttribute ('src','images/firefox-icon.png'); } }
index.html
。選擇當你點擊圖片時,它應(yīng)該會轉(zhuǎn)換成另一張圖片!在這里,我們將 image 元素的引用存放在myImage
變量里。接下來,我們將這個變量的onclick
的事件與一個匿名函數(shù)綁定。選擇,每次圖片被點擊時:
src
屬性src
的值是否等于原始圖像的路徑: src
的值改為第二張圖片的路徑,強制在<image>
內(nèi)讀取另一張圖片。src
的值重新設(shè)置為原始圖片的路徑,將它返回到原先的樣子。接下來我們會添加另一段代碼,在用戶初次進入站點時將網(wǎng)頁的標題改成一段個性化的歡迎信息。歡迎信息會持續(xù)到用戶離開網(wǎng)頁。我們還會添加一個選項來在必要的時候改變用戶并且改變歡迎信息。
index.html
里,在<script>
元素前添加下一行代碼:<button>Change user</button>
main.js
里,在文件底部添加下面的代碼,必須一字不漏 — 這會抓取 按鈕 和 標題 的引用并將其存放在變量里:var myButton = document.querySelector('button'); var myHeading = document.querySelector('h1');
function setUserName() { var myName = prompt('Please enter your name.'); localStorage.setItem('name', myName); myHeading.innerHTML = 'Mozilla is cool, ' + myName; }函數(shù)包含了一個
prompt()
函數(shù), 會彈出一個對話框, 有一點像alert()
只不過prompt()
需要用戶輸入數(shù)據(jù),而且在用戶點擊 OK 后將數(shù)據(jù)存儲在變量里。在這里,我們要求用戶輸入姓名。接下來,我們調(diào)用一個叫localStorage
的API,它允許我們將數(shù)據(jù)存儲在瀏覽器里以供后續(xù)調(diào)用。我們使用 localStorage 的setItem()
函數(shù)來創(chuàng)建并將數(shù)據(jù)存儲在'name'參數(shù)里,然后將其值設(shè)置為包含用戶輸入的姓名的myName
變量。 最后,我們將標題的innerHTML
屬性設(shè)置成加上用戶姓名的字符串。if ... else
塊添加進去— 我們將這稱作初始化代碼,因為它在初次讀取時重置了應(yīng)用程序:if(!localStorage.getItem('name')) { setUserName(); } else { var storedName = localStorage.getItem('name'); myHeading.innerHTML = 'Mozilla is cool, ' + storedName; }這段代碼首先用一個非運算符(邏輯非)來檢查
name
數(shù)據(jù)是否存在。如果不存在,setUserName()
函數(shù)就會運行來創(chuàng)建它。如果存在(比如用戶在之前創(chuàng)建過)我們通過 getItem()調(diào)用存儲過的 name 然后將innerHTML
設(shè)置為加上用戶姓名的字符串,就像我們在setUserName()
里做的一樣。onclick
事件處理器綁定到 按鈕 上,這樣當我們點擊時,setUserName()
函數(shù)就會運行。這允許用戶在任何想要的時候通過點擊按鈕來設(shè)置新的 name 。 myButton.onclick = function() { setUserName(); }
現(xiàn)在當你第一次訪問網(wǎng)頁時,它將詢問你的用戶名然后向你發(fā)出一段有個性的信息。你可以在任何時候通過點擊按鈕來改變 name 。告訴你一個額外的福利,因為 name 是存放在 localStorage 里的,它會持續(xù)到網(wǎng)頁關(guān)閉,所以這段個性化的信息在你重新打開瀏覽器時將仍然在這!
如果你一直跟隨我們的指導(dǎo),那么到最后你應(yīng)該得到如下的一個頁面(你也可以在 這里 查看我們的版本):
如果你有遇到問題,你可以將你的代碼與我們GitHub上的 代碼 做對比。
在這里,我們只提到了非常有限的 HTML 知識,要查看更多,請訪問我們的 JavaScript指南。
更多建議: