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