摘要:所有全局對象函數(shù)以及變量均自動成為對象的成員。消息彈出窗口對象使用簡單方便,但因其交互方式生硬,通常只用于調(diào)試??梢栽谥袆?chuàng)建三種消息框警告框確認框提示框。習慣上,通過選擇符得到的集合一般命名為以起始的字符串,例如。
avascript 等于 ECMAScript + 宿主環(huán)境。宿主環(huán)境提供了一系列的全局對象,例如Node.js提供的require, console等;瀏覽器提供的DOM、BOM對象。本節(jié)課我們便來了解瀏覽器,熟悉客戶端腳本開發(fā)和調(diào)試。
1.HTML中引入JSJavascript 已經(jīng)成為 Web 頁面邏輯的默認腳本語言,可以直接在 HTML 文件中引入而不需表明腳本語言。Javascript 使用 標簽引入,該標簽可以出現(xiàn)在 中,也可以出現(xiàn)在 中。
在HTML4中,標簽需要指定腳本類型:type="text/javascript"。現(xiàn)在已經(jīng)不必這樣做了。JavaScript 是 HTML5 默認的腳本語言。
在HTML中引入Javascript有兩種方式:內(nèi)嵌JavaScript和外部JavaScript文件。
1.1 內(nèi)嵌JavaScript內(nèi)嵌JavaScript(Inline JavaScript)是指在HTML中添加標簽,并將JavaScript代碼直接寫在標簽的內(nèi)容中。
script is embeded in HTML
將上述代碼另存為embeded-script.html并用瀏覽器打開它,你將會看到一個彈出窗口。
1.2 外部腳本在介紹CSS時提到,為了分離HTML中的樣式,我們把所有樣式規(guī)則都移到獨立的CSS文件中,然后在HTML中加以引入。這使得HTML更加容易理解和維護,同時也對搜索引擎、屏幕閱讀器更加友好。
外部腳本也是一樣的道理,除了在極少數(shù)情況下(少量的JavaScript、Google Analytics等),JavaScript總是應(yīng)當作為外部資源來引入到HTML中。
為了方便維護和復(fù)用,我們常常將不同語言的代碼分離到不同的文件。更重要的是,這樣的組織方式會讓你的代碼更優(yōu)雅!
只需要將標簽內(nèi)容留空,并添加src屬性:
// file: script.js console.log("I"ll give you an alert!"); alert("This is an alert.");
script.js has been imported.
分別保存上述兩個文件,置于同一目錄下并打開HTML,會有相同的效果。
HTML為典型的流文檔。即:自上而下分成一行一行, 并在每行中按從左至右依次排放元素。正因為HTML流式文檔的特征,其中的也是按從上到下的順序執(zhí)行的。HTML之所以采用這樣的設(shè)計是因為互聯(lián)網(wǎng)架設(shè)之初網(wǎng)絡(luò)速度很有限,流式文檔可以在載入的過程中就可以逐步地顯示。**
2.DOM文檔對象模型(Document Object Model,DOM)是中立于平臺和語言的接口,它允許程序和腳本動態(tài)地訪問和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式。同樣地,DOM 也是 W3C(萬維網(wǎng)聯(lián)盟)的標準。換句話將,DOM 定義了訪問 HTML 和 XML 文檔的標準。
我們關(guān)心的 HTML DOM 則是 DOM 的延伸,它包括 HTML 的標準對象模型、HTML 的標準編程接口、W3C DOM 標準。HTML DOM 定義了所有 HTML 元素的對象和屬性,以及訪問它們的方法。
說了這么多,上述關(guān)于 DOM 和 HTML DOM 的概念或許在你有一定 Web 開發(fā)經(jīng)歷時才會理解?,F(xiàn)在你可以認為 DOM 就是用來定義如何組織 HTML 結(jié)構(gòu)、如何操作 HTML 元素的。當然,我們指的是從Javascript中操作 HTML 元素。
HTML DOM 將 HTML 文檔視作樹結(jié)構(gòu)。這種結(jié)構(gòu)就是我們常講的 DOM 樹:
如果你需要更多關(guān)于DOM的信息,請參考 W3C Schrool 的 DOM 教程。
2.1 節(jié)點、屬性與內(nèi)容整個 HTML 文檔是由樹狀組織的節(jié)點及其屬性構(gòu)成的。那么如何在Javascript中操作它呢?請看例子:
// file: dom.js // 獲得id為fruits的節(jié)點 var ul = document.getElementById("fruits"), carrot = ul.firstElementChild; ul.removeChild(carrot); var pear = document.createElement("li"); // 設(shè)置pear的style屬性 pear.setAttribute("style", "color: red"); // 設(shè)置pear的內(nèi)容 pear.innerHTML = "pear" ul.appendChild(pear);
這段代碼給出了一個簡單的操作DOM元素過程。找到id為fruits的標簽并刪除其第一個子節(jié)點;然后創(chuàng)建一個新的元素pear并添加到中。更多 DOM 操作的方法請參考 W3C School: DOM 方法。
正是 DOM 事件使得頁面可以與用戶進行交互,例如點擊、移入、移出、滾動等。同樣地,來個例子:
Mouse Over Me !
// file: event.js function over(obj) { obj.innerHTML="mouse is over!!!" } function out(obj) { obj.innerHTML="mouse is out..." } window.onload = function(){ var div = document.getElementById("block"); div.setAttribute("style", "background:lightgreen; width:200px;height:50px; margin: 50px;"); };
通過設(shè)置HTML元素的屬性,可以設(shè)置其事件處理函數(shù)。我們在 那么window.onload是什么呢?注意到我們在中引入了event.js,然而因為HTML是流式文檔,在執(zhí)行event.js時, 而window便是我們接下來要介紹的 BOM。 瀏覽器對象模型 (Browser Object Model,BOM) 使 JavaScript 有能力與瀏覽器“對話”。雖然尚無正式標準,但大多現(xiàn)代瀏覽器都實現(xiàn)了相同的交互方法和屬性。其功能包括:操作瀏覽器窗口、瀏覽歷史與導(dǎo)航、Cookie操作、各類提醒框等。 window 是瀏覽器中一個特殊的對象。所有 JavaScript 全局對象、函數(shù)以及變量均自動成為 window 對象的成員。全局變量是 window 對象的屬性。全局函數(shù)是 window 對象的方法。 window.location對象用于訪問當前 URL,或者導(dǎo)航到新的頁面。location有如下幾個屬性: hostname:web 主機的域名 pathname:當前頁面的路徑和文件名 port:web 主機的端口 protocol:所使用的 web 協(xié)議(http:// 或 https://) href:當前url,對它賦值可以實現(xiàn)重定向 reload():這是一個方法,調(diào)用后會刷新當前頁面 除了window.location外,還有window.history提供瀏覽器歷史的操作,常用的有: history.back():與在瀏覽器點擊后退按鈕相同 history.forward():與在瀏覽器中點擊按鈕向前相同 彈出窗口對象使用簡單方便,但因其交互方式生硬,通常只用于調(diào)試??梢栽?JavaScript 中創(chuàng)建三種消息框:警告框、確認框、提示框。 alert("some message"):警告框,點擊確定按鈕才能繼續(xù)進行操作; confirm("something"):確認框,點擊確定或者取消才能繼續(xù)進行操作,相應(yīng)地,返回值為true或false; prompt("something"):提示框,輸入內(nèi)容,并點擊確認或取消才能繼續(xù)進行操作,相應(yīng)地,返回輸入內(nèi)容,或者null(如果取消)。 注意這些彈窗都會阻塞當前的Javascript進程。 console我們已經(jīng)很熟悉了,除了常用的console.log()外,還有console.error(),console.info(),console.debug()等用以日志分級的函數(shù)。 console我們在Node.js的課程中已經(jīng)多次使用,但console并非 ECMAScript 標準提供的對象。只是瀏覽器和 Node.js 都實現(xiàn)都提供了這樣的全局對象而已。 AJAX(Asynchronous JavaScript and XML,異步的 JavaScript 和 XML),是用來與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁的技術(shù),避免了重新加載整個頁面。 可以說AJAX是現(xiàn)代化的頁面的標志,可用來創(chuàng)建動態(tài)性極強的 web 界面,現(xiàn)在我們來學(xué)習它!絕大多數(shù)瀏覽器都提供了 XMLHttpRequest 對象來完成 AJAX。為了理解 AJAX 是如何工作的,我們還是首先看一個案例: 這里有一個按鈕,點擊按鈕將會向服務(wù)器請求當前時間,服務(wù)器返回后將時間顯示在下面。每次點擊按鈕時間都會更新,但頁面不會刷新。 為了實現(xiàn)上述的效果,首先需要在頁面上顯示類似這樣的元素: 點擊按鈕時將會調(diào)用ajaxload()函數(shù),在該函數(shù)中進行 AJAX 請求: 更多關(guān)于 readyState 的信息,參見W3C School:ReadyState 上述的代碼在ajax.html中。除此之外,我們還需要一個服務(wù)器來處理這些請求。當請求根目錄/時,返回這個 HTML 文件;當請求/date時,返回當前時間。下面服務(wù)器代碼ajax.js: 這段代碼的意圖應(yīng)該比較容易理解吧?我們在下面的Chrome調(diào)試中,會詳細地介紹這些代碼產(chǎn)生的效果。 到這里,我們已經(jīng)介紹了常用的幾個瀏覽器全局變量。window下的全局變量還有: innerHeight/innerWidth:瀏覽器窗口內(nèi)部高度/寬度; navigator:包含有關(guān)訪問者瀏覽器的信息; screen:訪問者屏幕的寬度,以像素計; setTimeout()/clearTimeout():定時器/取消定時; document.cookie:現(xiàn)在多數(shù)網(wǎng)站使用Cookie來識別用戶。 一般的網(wǎng)站都會包含客戶端腳本,這些腳本的數(shù)量甚至比服務(wù)器代碼還要多,尤其是單頁APP這種交互性優(yōu)秀的站點。 jQuery 是一個javascript基礎(chǔ)框架,極大地方便了客戶端腳本的編寫,這里只做簡要介紹,此后的項目開發(fā)中,你會見到眾多的jQuery代碼。jQuery提供的API包括: DOM操作:選擇、讀取和更改DOM元素的內(nèi)容、屬性; AJAX:異步網(wǎng)絡(luò)請求; 動畫效果:滑動、延遲、淡入淡出等; 事件處理:鍵盤/鼠標事件、瀏覽器事件、表單事件等; 表單:表單的提交、表單的序列化、控件焦點變化等。 為了表現(xiàn)jQuery的強大,我們引入jQuery,使用jQuery重新實現(xiàn) DOM 一節(jié)中的參考代碼dom.html和dom.js。首先在dom-jquery.js之前引入jquery.js: 如果你是初識jQuery,可能會奇怪$是什么。其實$在javascript中是一個合法的標識符,也就是說$可以用來命名變量。 jQuery 提供的全局變量:$,它稱為 jQuery 對象。習慣上,通過 jQuery 選擇符得到的集合一般命名為以$起始的字符串,例如 $ul。 $ul是一個集合,只不過它只有一個元素。如果使用 $li = $("li"),那么該集合便會有3個元素,jQuery的所有方法都是對整個集合進行操作的。 Chrome和Firefox是Web開發(fā)中常用的調(diào)試工具,我們以Chrome為例。使用以下的任何一種方式都可以打開Chrome調(diào)試窗口: 在任何一個頁面上,點擊右鍵,選擇“審查元素”; 快捷鍵F12; 設(shè)置 -> 更多工具 -> 開發(fā)者工具。 打開的調(diào)試窗口中,有8個標簽頁。常用的有 Elements、Network、Sources、Console。 Elements 中,我們可以查看頁面元素,在左側(cè)可以點選某一個元素,該元素會在頁面上高亮,同時在右側(cè)顯示該元素的所有樣式。這些樣式還是可編輯的。 Network 中,可以查看當前頁面的所有網(wǎng)絡(luò)請求。比如 AJAX 一節(jié)中我們會發(fā)送多個請求,在 Network 標簽頁中,可以看到訪問頁面時的請求,以及點擊按鈕獲取數(shù)據(jù)時的請求,如下圖所示: 從上圖中可以看到這兩個請求: 第一個請求的URL是localhost,方法為 GET,響應(yīng)狀態(tài)碼為 200,響應(yīng)的Content-Type為text/html,響應(yīng)大小為712B,文件大小為567B(其余為協(xié)議頭所占空間),載入時間為13毫秒。 第二個請求Content-Type為text/plain,這是在服務(wù)器代碼中決定的。另外其initiator即初始化該請求的代碼,在首頁(index)的第14行,我們這一行的代碼為: text/html指示瀏覽器這是一個HTML文件,瀏覽器便會把它渲染為一個Web文檔。如果將Content-Type設(shè)置為text/plain,瀏覽器則會直接顯示HTML源碼。 不僅如此,我們還可以點擊第二個請求來查看其詳情,如下圖: 右側(cè)詳情窗口中有5個標簽頁,常用的是 Headers、Preview、Response。其中 Headers 中給出了請求和響應(yīng)的所有頭字段;Response 則給出了響應(yīng)體的內(nèi)容,這里是: 它就是xhr.responseText的值。 Sources標簽頁下,可以查看當前網(wǎng)站的HTML,及其引入的所有CSS、Javascript文件。重要的是,在Javascript文件中的任何一行,我們都可以設(shè)置斷點,腳本將會在這一行停下來。觸發(fā)斷點時,我們可以查看斷點所在的作用域內(nèi)的所有變量的值,如下圖所示: 右側(cè)窗格顯示了局部變量、監(jiān)視變量以及調(diào)用棧。右側(cè)窗格的上方有繼續(xù)、下一步、進入函數(shù)、跳出函數(shù)、禁用斷點等按鈕。 還可以切換至Console,在當前作用域下執(zhí)行任何Javascript語句。 Console與Node.js的控制臺類似,這是一個Javascript的交互式環(huán)境。在這里可以執(zhí)行任何Javascript語句,如圖: 上圖中我們首先執(zhí)行了: 控制臺中輸出了這個語句的返回值。接著執(zhí)行: 我們便在控制臺看到了一則錯誤,其內(nèi)容為test error。 在斷點觸發(fā)時(例如上圖中的情況),在控制臺可以訪問當前作用域的任何對象,讀取或設(shè)置它們的值,甚至在這里調(diào)用作用域內(nèi)的任何函數(shù)。如圖便是輸出了上述斷點觸發(fā)時的xhr對象。 本文由Harttle創(chuàng)作,轉(zhuǎn)載需署名作者且注明文章出處 文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87725.html
3.1 導(dǎo)航
更多瀏覽器導(dǎo)航的BOM對象可以參考W3C School:location、W3C School:history。
4.AJAX
function ajaxload(){
var result = document.getElementById("result");
// 創(chuàng)建一個 AJAX 請求
var xhr = new XMLHttpRequest();
// 打開URL:/date
xhr.open("GET", "/date", true);
// xhr 狀態(tài)改變的處理函數(shù)
xhr.onreadystatechange=function(){
// 狀態(tài)為4表示響應(yīng)已就緒;狀態(tài)碼200表示成功的響應(yīng)
if (xhr.readyState==4 && xhr.status==200)
// 顯示響應(yīng)文本
result.innerHTML=xhr.responseText;
}
xhr.send();
}
// file: ajax.js
var http = require("http"),
fs = require("fs"),
html = fs.readFileSync("./ajax.html", "utf8");
http.createServer(function (req, res) {
switch(req.url){
case "/":
res.writeHead(200, {"Content-Type": "text/html"});
res.write(html)
break;
case "/date":
var date = new Date();
res.writeHead(200, {"Content-Type": "text/plain"});
res.write(date.toString())
break;
}
res.end();
}).listen(1337, "127.0.0.1")
...
...
// file: dom-jquery.js
// 選擇 id 為 fruits 的元素集合(該集合中只有一個元素,即 ul )
var $ul = $("#fruits");
// 找到該元素的第一個子元素(即 li)并將其移除
$ul.find(":first-child").remove();
// 創(chuàng)建一個 li 元素,并設(shè)置其 color 樣式為 red,其內(nèi)容為 pear
var $pear = $("
xhr.send();
Mon Mar 30 2015 21:32:17 GMT+0800 (CST)
6.4 Console
new Date()
console.error("test error")
摘要:然后將構(gòu)造函數(shù)的原型設(shè)為,便實現(xiàn)了對象繼承。首先,我們定義一個構(gòu)造函數(shù),并在其中定義一個局部變量。這里的是局部變量,其作用域仍然存在是閉包現(xiàn)象,而非對象屬性。 Javascript是動態(tài)的,弱類型的,解釋執(zhí)行的程序設(shè)計語言。 Javascript極其靈活,支持多種程序設(shè)計范式:面向?qū)ο蟆⒅噶钍?、函?shù)式。JavaSCript最初被用于瀏覽器腳本,現(xiàn)在已經(jīng)是所有主流瀏覽器的默認腳本語言。瀏...
摘要:面向?qū)ο笕筇卣骼^承性多態(tài)性封裝性接口。第五階段封裝一個屬于自己的框架框架封裝基礎(chǔ)事件流冒泡捕獲事件對象事件框架選擇框架。核心模塊和對象全局對象,,,事件驅(qū)動,事件發(fā)射器加密解密,路徑操作,序列化和反序列化文件流操作服務(wù)端與客戶端。 第一階段: HTML+CSS:HTML進階、CSS進階、div+css布局、HTML+css整站開發(fā)、 JavaScript基礎(chǔ):Js基礎(chǔ)教程、js內(nèi)置對...
摘要:面向?qū)ο笕筇卣骼^承性多態(tài)性封裝性接口。第五階段封裝一個屬于自己的框架框架封裝基礎(chǔ)事件流冒泡捕獲事件對象事件框架選擇框架。核心模塊和對象全局對象,,,事件驅(qū)動,事件發(fā)射器加密解密,路徑操作,序列化和反序列化文件流操作服務(wù)端與客戶端。 第一階段: HTML+CSS:HTML進階、CSS進階、div+css布局、HTML+css整站開發(fā)、 JavaScript基礎(chǔ):Js基礎(chǔ)教程、js內(nèi)置對...
閱讀 2735·2021-11-22 15:22
閱讀 1643·2021-11-22 14:56
閱讀 3620·2021-09-22 15:12
閱讀 2408·2021-09-02 15:41
閱讀 2128·2021-08-27 16:26
閱讀 1118·2019-08-30 15:55
閱讀 2144·2019-08-29 17:30
閱讀 672·2019-08-29 16:26