# javascript快速入門6--Script標簽與訪問HTML頁面
## Script標簽
script標簽用于在HTML頁面中嵌入一些可執的腳本
```
<script>
//some script goes here
</script>
```
script標簽有三個特殊的屬性(當然,像id,class這樣的屬性它也是有的,HTML頁面中幾乎每個元素都可以有class,id屬性)
```
<script language="JavaScript">//language屬性指明標簽里包含的腳本所使用的語言
//它有三個常見的取值JavaScript,JScript,VBScript
//some script goes here
</script> //對于JScript只有IE能夠識別,其它瀏覽器會忽略這個標簽其里面的內容
//而對于VBScript,只有Windows上的IE能夠識別,運行
//然而language屬性后來在XHTML中被type屬性替代了 <script type="text/javascript">//取值也變了,text/javascript,text/jscript,text/vbscript
//some script goes here
</script>
```
在Web瀏覽器中,我們只會使用JavaScript,type屬性設置為text/javascript.事實上,由于JavaScript十分流行,它幾乎成了腳本的代名詞,而在Web瀏覽器中,即使script標簽不加任何屬性,瀏覽器也會把它當成JavaScript
```
<script> alert("Hello!"); </script> //上面的那段代碼將會按JavaScript的方式運行
//即使有IE中,不加聲明的script塊也會當成JavaScript執行,而不是VBScript <script> msgbox "Hello!"
</script> //上面的代碼在IE中也會報錯,IE也會將其當成JavaScript執行
```
以前在HTML頁面中,一些標簽常會加一些諸如onclick,onmouseover這樣的屬性,這是一種事件綁定(關于事件,我們之后會詳細講解的,不要急).用于指定當HTML頁面某個元素上發生了什么事的時候去執行的JavaScript代碼(當然也可以是其它客戶端腳本)
```
<img src="../images/stack_heap.jpg" alt="內存堆棧" onclick="alert('你把我點疼了!')" />
```
上面的代碼將在HTML頁面上顯示一個圖像,當你用鼠標點擊一下時,會出現一個彈窗,顯示'你把我點疼了!',onclick屬性的值其實是一段JavaScript代碼;這就是事件,下面是其它一些簡單的事件
* onclick ,當鼠標點擊一下時執行一次
* onmouseover ,當鼠標放上去時執行一次
* onmouseout ,當鼠標移出去時執行一次
* onmousedown ,當鼠標按下時執行一次
* onmouseup ,當鼠標在上面松開(彈起)時執行一次
* onmousedblclick ,當鼠標雙擊時執行一次
* onload ,當對象加載完成時執行一次
以前網上十分流行的稱之為RollverImages(翻轉圖像)的效果其實就是組合onmouseover,onmouseout這樣的事件和簡單的JavaScript代碼實現的
```
<img src="../images/stack_heap.jpg" alt="內存堆棧" onmouseover="this.src='../images/over.jpg'" onmouseout="this.src='../images/out.jpg'" />
```
你可能知道,onmouseover這類的屬性中的字符串將會在事件發生時當成腳本來執行,但上面的那些代碼看上去十分模糊
```
//為了便于查看,我們將它們提取出來放在下面
this.src='../images/over.jpg'
this.src='../images/out.jpg'
```
分析上面的代碼,我們發現,這其實是在給一個對象this的屬性src賦值,但問題是我們并沒有聲明過一個叫this的對象!其實this對象是一個一直存在的一個對象,它不能被聲明(this是關鍵字).這里,this就是指"這個",指這個標簽!對于HTML中的元素,JavaScript會自動將其解析成一個對象.對于下面的img標簽,會解析成下面一個對象:
```
<img src="../images/stack_heap.jpg" alt="內存堆棧" onclick="alert('Hello!')" /> //注意,實際上this是不能手動賦值,也不能手動聲明的,這里僅僅是演示
this = {
src:"../images/stack_heap.jpg",
alt:"內存堆棧",
onclick:"alert('Hello!')",
tagName:"IMG"
};
//其實不止這些屬性
```
上面,img標簽會被解析成一個對象,具有src,alt等屬性,src,alt屬性是我們寫在HTML里面的,而tagName則是系統自動生成的,它表示標簽的標簽名!我們可以用下面的代碼進行測試:
```
<img src="../images/stack_heap.jpg" alt="內存堆棧" onclick="alert(this.src);alert(this.tagName);" />
```
自然,我們也可以修改它的值,于是翻轉圖象的效果就這樣成功了
對于這樣的行內事件綁定,有一些注意點.
```
<head>
<script>
function myFn() {
alert("圖象加載完成了!");
} </script>
</head> //.............若干若干代碼之后 <img src="../images/stack_heap.jpg" alt="內存堆棧" onload="myFn()" />//當圖象加載成功時執行一個函數
```
上面的代碼執行是沒問題的,然而將順序翻轉一下(script可以放在任何合法的地方)
```
<img src="../images/stack_heap.jpg" alt="內存堆棧" onload="myFn()" />//當圖象加載成功時執行一個函數
//.............若干若干代碼之后 <script>
function myFn() {
alert("圖象加載完成了!");
} </script>
```
HTML頁面按照從上往下的順序加載執行,當圖象加載成功后,就去執行onload里的內容(一個自定義函數),但由于script標簽在下面若干代碼之后,所以還沒被加載,因此會出錯"myFn is undefined";這就是為什么要將script標簽放在head部分的原因,因為head在body前面,當body里的元素加載完成時,head中的script肯定加載完成了
但后來有了XHTML,有了"三層分離",W3C推出了DOM2,我們需要使用另一種方式綁定事件,獲取HTML頁面元素.再以上面的圖像為例:
```
<head>
<script>
var img = document.getElementById("myImg");//我們通過ID來獲取它
//document.getElementById方法有個參數,一個字符串ID
//然后,img就表示了那個圖像標簽對象
img.onclick = myFn; /*我們不是把JavaScript代碼以字符串符值給它的onclick屬性
而是直接賦值給它一個函數名
你也會說,為什么不是img.onclick=myFn();
因為現在是在JavaScript代碼區域中
加"()"表示執行這個函數,然后將這個函數的返回值賦給了img.onclick*/
function myFn() {
alert("圖象加載完成了!");
} </script>
</head> //....... <img src="../images/stack_heap.jpg" id="myImg" alt="內存堆棧" /> //我們不再加onclick屬性了,而是給它起了個ID
```
但上面的代碼執行了仍會出錯,因為HTML從上往下加載,當加載到script時,body部分在下面,還沒有被加載,而JavaScript在瀏覽加載到時就會自動執行.這時,頁面上的ID為myImg的img還沒被加載到,所以會出錯;document.getElementById方法需要一個字符串形式的ID,而如果頁面上沒有ID為這個的元素,它則會返回null(空對象);而在下面一行,img.onclick這一句使用了一個空對象,所以會在這里出錯!至于解決方法,其實只是將傳統的行內事件綁定的script位置反過來放.將script放在所以HTML元素后面!
```
<img src="../images/stack_heap.jpg" id="myImg" alt="內存堆棧" /> //..................若干代碼之后 <script>
var img = document.getElementById("myImg"); //這個時候,由于script標簽放置的位置處在img標簽之后,加載到script時img標簽肯定加載完成了
img.onclick = myFn; function myFn() {
alert("圖象加載完成了!");
} </script>
```
但標準仍然推薦將script放在head部分!那么,這就要用到另一個事件onload
```
window.onload = initAll;//將所有代碼寫在一個函數之中,然后注冊到window對象的onload事件屬性上
//window表示窗口對象,只要窗口打開,它就始終存在,當頁面加載完成后,會觸發window對象上的onload事件
function initAll() { var img = document.getElementById("myImg");
img.onclick = myFn; function myFn() {
alert("圖象加載完成了!");
}
}
```
這樣,代碼就不出錯了,不管將腳本放在什么位置,initAll只有當頁面加載完成后才會被執行
## 訪問HTML頁面:<abbr title="HTML 文檔對象模型">HTML DOM</abbr>
HTML DOM將整個頁面當成一個document對象,HTML里的標簽都要通過document對象來訪問.而文檔中的每個標簽,又會轉換成一個對象
```
<p class="demo" title="第一個段落:DOM樹" id="p1">我們用一個p標簽來演示</p>
```
它又會被轉換成下面這個對象
```
//總該記得對象字面量語法吧
{
tagName:"p",
className:"demo",
title:"第一個段落:DOM樹",
id:"p1",
innerHTML:"我們用一個p標簽來演示" } //你也許會奇怪,為什么標簽的class屬性會變成對象的className屬性而不是class.
//class是JavaScript保留字!!!
//tagName表示它的標簽名,而innerHTML表示它里面的HTML代碼
```
瀏覽將HTML標簽轉換成這樣的對象后,在JavaScript中訪問該標簽的屬性或里面的內容就簡單多了,但問題是如何訪問到這個對象!!
```
//首先要給該標簽加個ID,然后使用document.getElementById方法就能夠訪問到它了
window.onload = initAll;//注意,要將所要訪問HTML頁面的代碼都放在window的onload事件處理上!
function initAll() { var p = document.getElementById("p1");
alert(p.className);
alert(p.tagName);
alert(p.title);
alert(p.id);
alert(p.innerHTML);
}
```
訪問HTML頁面就這么簡單!獲取一個元素之后,不但可以讀取它的屬性值,還可以設置它的屬性值!
```
window.onload = initAll; function initAll() { var p = document.getElementById("p1");
p.title="JavaScript";
p.className="load";//我們可以更改它的樣式
}
```
利用這些,我們已經能做出一些激動人心的事了!
```
//一些CSS
.over { color:red; background:blue; font-size:larger;
} .out { color:black; background:white; font-size:smaller;
} .click { color:yellow; background:yellow; font-size:12px;
}
```
```
//HTML代碼 <p id="p1" class="out">一大行文字,它們都是普通的文字!</p>
```
```
//JavaScript代碼
window.onload = initAll; function initAll() { var p = document.getElementById("p1");
p.onclick=clickFn;//這里的事件注冊方式除了比行內注冊方式少了括號,其它的是一樣的
p.onmouseover = overFn;
p.onmouseout = outFn;
} function clickFn() { this.className="click";//這里,this也是可用的
//注意是className,而不是class
} function overFn() { this.className="over";
} function outFn() { this.className="out";
}
```
當然,獲取頁面元素不止這一種方法.document.getElementsByTagName方法也能獲取頁面元素,顧名思意,它是通過HTML的標簽來獲取元素的,而不是ID. 因為一張HTML頁面,一個ID名稱是唯一的,而標簽名則大多數是相同的,所以,getElementsByTagName方法只有一個參數,即一個字符串形式的標簽名(tagName),而返回值則是一個類似數組的HTML元素列表
```
window.onload = initAll;//仍然要寫在window.onload事件處理函數中
function initAll() { var pList = document.getElementsByTagName("P"); //為什么要用大寫的P?其實用小寫p也可以,不區分大小寫,但由于對象的tagName總報告的是大寫的,就....
alert(pList.length);//與數組相似,length報告有多少個元素,頁面上有多少個p標簽,就報告多少
alert(pList[0].innerHTML);//這樣來訪問第一個p元素
}
```
另外,對于document.getElementsByTagName方法,還可以傳一個"*"號作為參數,以獲取頁面的所有元素,類似于CSS里面的通配符
```
window.onload = initAll; function initAll() {
var allThings = document.body.getElementsByTagName("*");
//可在任何DOM元素上調用getElementsByTagName方法,在body上調用此方法時,body外的標簽不會獲取到
alert(allThings.length);//頁面上有多少個標簽,就報告多少(包含DOCTYPE)
alert(allThings[3].innerHTML);//這樣來訪問第四個元素
}
```
## 其它-javascript:偽協議
偽協議不同于因特網上所真實存在的如http://,https://,ftp://,而是為關聯應用程序而使用的.如:tencent://(關聯QQ),data:(用base64編碼來在瀏覽器端輸出二進制文件),還有就是javascript:
我們可以在瀏覽地址欄里輸入"javascript:alert('JS!');",點轉到后會發現,實際上是把javascript:后面的代碼當JavaScript來執行,并將結果值返回給當前頁面
類似,我們可以在a標簽的href屬性中使用javascript偽協議
```
<a href="javascript:alert('JS!');"></a> //點擊這面的鏈接,瀏覽器并不會跳轉到任何頁面,而是顯示一個彈窗
```
但javascript:偽協議有個問題,它會將執行結果返回給當然的頁面
```
<a href="javascript:window.prompt('輸入內容將替換當前頁面!','');">A</a>
```
解決方法很簡單
```
<a href="javascript:window.prompt('輸入內容將替換當前頁面!','');undefined;">A</a> //將undefined加到最后
```
盡管javascript偽協議提供了一定的靈活性,但在頁面中盡量不要使用!而對于調試JavaScript,javascript偽協議則顯得十分有用!
- 介紹
- HTML/CSS 教程
- 第 1 章 HTML5 概述
- 第 2 章 基本格式
- 第 3 章 文本元素
- 第 4 章 超鏈接和路徑
- 第 5 章 分組元素
- 第 6 章 表格元素
- 第 7 章 文檔元素
- 第 8 章 嵌入元素
- 第 9 章 音頻和視頻
- 第 10 章 表單元素[上]
- 第 10 章 表單元素[中]
- 第 10 章 表單元素[下]
- 第 11 章 全局屬性和其他
- 第 12 章 CSS 入門
- 第 13 章 CSS 選擇器[上]
- 第 14 章 CSS 顏色與度量單位
- 第 15 章 CSS 文本樣式[上]
- 第 15 章 CSS 文本樣式[下]
- 第 16 章 CSS 盒模型[上]
- 第 16 章 CSS 盒模型[下]
- 第 17 章 CSS 邊框與背景[上]
- 第 17 章 CSS 邊框與背景[下]
- 第 18 章 CSS 表格與列表
- 第 19 章 CSS 其他樣式
- 第 20 章 CSS3 前綴和 rem
- 第 21 章 CSS3 文本效果
- 第 21 章 CSS3 文本效果
- 第 23 章 CSS3 邊框圖片效果
- 第 24 章 CSS3 變形效果[下]
- 第 25 章 CSS3 過渡效果
- 第 26 章 CSS3 動畫效果
- 第 27 章 CSS 傳統布局[上]
- 第 27 章 CSS 傳統布局[下]
- 第 28 章 CSS3 多列布局
- 第 29 章 CSS3 彈性伸縮布局[上]
- 第 29 章 CSS3 彈性伸縮布局[中]
- 第 29 章 CSS3 彈性伸縮布局[下]
- 第 30 章 使用 Emmet 插件
- Bootstrap 教程
- 第 1 章 Bootstrap 介紹
- 第 2 章 排版樣式
- 第 3 章 表格和按鈕
- 第 4 章 表單和圖片
- 第 5 章 柵格系統
- 第 6 章 輔組類和響應式工具
- 第 7 章 圖標菜單按鈕組件
- 第 8 章 輸入框和導航組件
- 第 9 章 路徑分頁標簽和徽章組件
- 第 10 章 巨幕頁頭縮略圖和警告框組件
- 第 11 章 進度條媒體對象和 Well 組件
- 第 12 章 列表組面板和嵌入組件
- 第 13 章 模態框插件
- 第 14 章 下拉菜單和滾動監聽插件
- 第 15 章 標簽頁和工具提示插件
- 第 16 章 彈出框和警告框插件
- 第 17 章 按鈕和折疊插件
- 第 18 章 輪播插件
- 第 19 章 附加導航插件
- 第 20 章 項目實戰--響應式導航[1]
- 第 20 章 項目實戰--響應式輪播圖[2]
- 第 20 章 項目實戰--首頁內容介紹[上][3]
- 第 20 章 項目實戰--首頁內容介紹[下][4]
- 第 20 章 項目實戰--資訊內容[5,6]
- 第 20 章 項目實戰--案例和關于[7]
- javaScript 教程
- javascript快速入門1--JavaScript前世今生,HelloWorld與開發環境
- javascript快速入門2--變量,小學生數學與簡單的交互
- javascript快速入門3--分支判斷與循環
- javascript快速入門4--函數與內置對象
- javascript快速入門5--數組與對象
- javascript快速入門6--Script標簽與訪問HTML頁面
- javascript快速入門7--ECMAScript語法基礎
- javascript快速入門8--值,類型與類型轉換
- javascript快速入門9--引用類型
- javascript快速入門10--運算符,語句
- javascript快速入門11--正則表達式
- javascript快速入門12--函數式與面向對象
- javascript快速入門13--BOM——瀏覽器對象模型(Browser Object Model)
- javascript快速入門14--DOM基礎
- javascript快速入門15--節點
- javascript快速入門15--表單
- javascript快速入門16--表格
- javascript快速入門17--事件
- javascript快速入門18--樣式
- javascript快速入門19--定位
- javascript快速入門20--Cookie
- javascript快速入門21--DOM總結
- javascript快速入門22--Ajax簡介
- javascript快速入門23--XHR—XMLHttpRequest對象
- javascript快速入門24--XML基礎
- javascript快速入門25--瀏覽器中的XML
- javascript快速入門26--XPath
- javascript快速入門27--XSLT基礎
- PHP 教程
- 第一章 如何加載運行已發布的PHP項目
- 第二章 PHP基礎
- 第三章 操作符與控制結構
- 第四章 數學運算
- 第五章 數組
- 第六章 目錄與文件
- 第七章 自定義函數
- 第八章 字符串處理
- 第九章 正則表達式
- 第十章 日期與時間
- 第十一章 表單與驗證
- 第十二章 會話控制
- 第十三章 上傳文件
- 第十四章 處理圖像
- 第十五章 MySQL 數據庫
- 第十六章 PHP 操作MySQL
- 第十七章 面向對象基礎
- 第十八章 面向對象的特性
- 第十九章 面向對象的工具