<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                #### 第3章: #### JavaScript ##### JavaScript 能夠改變 HTML 內容 ![](https://www.runoob.com/images/pic_htmltree.gif) 通過可編程的對象模型,JavaScript 獲得了足夠的能力來創建動態的 HTML。 * JavaScript 能夠改變頁面中的所有 HTML 元素 * JavaScript 能夠改變頁面中的所有 HTML 屬性 * JavaScript 能夠改變頁面中的所有 CSS 樣式 * JavaScript 能夠對頁面中的所有事件做出反應 HTML DOM 元素對象 在 HTML DOM (Document Object Model) 中, 每個元素(或者非元素)都是節點 : * 文檔本身就是一個文檔對象 * 所有 HTML 元素都是元素節點 * 所有 HTML 屬性都是屬性節點 * 插入到 HTML 元素文本是文本節點 * 注釋是注釋節點 #### 3.1 Document 節點對象 HTML文檔使用以下屬性和方法: | 屬性 / 方法 | 描述 | | --- | --- | | document.activeElement | 返回當前獲取焦點元素 | | document.addEventListener() | 向文檔添加句柄 | | document.adoptNode(node) | 從另外一個文檔返回 adapded 節點到當前文檔。 | | document.anchors | 返回對文檔中所有 Anchor 對象的引用。 | | document.applets | 返回對文檔中所有 Applet 對象的引用。**注意:** HTML5 已不支持 元素。 | | document.baseURI | 返回文檔的絕對基礎 URI | | document.body | 返回文檔的body元素 | | document.close() | 關閉用 document.open() 方法打開的輸出流,并顯示選定的數據。 | | document.cookie | 設置或返回與當前文檔有關的所有 cookie。 | | document.createAttribute() | 創建一個屬性節點 | | document.createComment() | createComment() 方法可創建注釋節點。 | | document.createDocumentFragment() | 創建空的 DocumentFragment 對象,并返回此對象。 | | document.createElement() | 創建元素節點。 | | document.createTextNode() | 創建文本節點。 | | document.doctype | 返回與文檔相關的文檔類型聲明 (DTD)。 | | document.documentElement | 返回文檔的根節點 | | document.documentMode | 返回用于通過瀏覽器渲染文檔的模式 | | document.documentURI | 設置或返回文檔的位置 | | document.domain | 返回當前文檔的域名。 | | document.domConfig | **已廢棄**。返回 normalizeDocument() 被調用時所使用的配置。 | | document.embeds | 返回文檔中所有嵌入的內容(embed)集合 | | document.forms | 返回對文檔中所有 Form 對象引用。 | | document.getElementsByClassName() | 返回文檔中所有指定類名的元素集合,作為 NodeList 對象。 | | document.getElementById() | 返回對擁有指定 id 的第一個對象的引用。 | | document.getElementsByName() | 返回帶有指定名稱的對象集合。 | | document.getElementsByTagName() | 返回帶有指定標簽名的對象集合。 | | document.images | 返回對文檔中所有 Image 對象引用。 | | document.implementation | 返回處理該文檔的 DOMImplementation 對象。 | | document.importNode() | 把一個節點從另一個文檔復制到該文檔以便應用。 | | document.inputEncoding | 返回用于文檔的編碼方式(在解析時)。 | | document.lastModified | 返回文檔被最后修改的日期和時間。 | | document.links | 返回對文檔中所有 Area 和 Link 對象引用。 | | document.normalize() | 刪除空文本節點,并連接相鄰節點 | | document.normalizeDocument() | 刪除空文本節點,并連接相鄰節點的 | | document.open() | 打開一個流,以收集來自任何 document.write() 或 document.writeln() 方法的輸出。 | | document.querySelector() | 返回文檔中匹配指定的CSS選擇器的第一元素 | | document.querySelectorAll() | document.querySelectorAll() 是 HTML5中引入的新方法,返回文檔中匹配的CSS選擇器的所有元素節點列表 | | document.readyState | 返回文檔狀態 (載入中……) | | document.referrer | 返回載入當前文檔的文檔的 URL。 | | document.removeEventListener() | 移除文檔中的事件句柄(由 addEventListener() 方法添加) | | document.renameNode() | 重命名元素或者屬性節點。 | | document.scripts | 返回頁面中所有腳本的集合。 | | document.strictErrorChecking | 設置或返回是否強制進行錯誤檢查。 | | document.title | 返回當前文檔的標題。 | | document.URL | 返回文檔完整的URL | | document.write() | 向文檔寫 HTML 表達式 或 JavaScript 代碼。 | | document.writeln() | 等同于 write() 方法,不同的是在每個表達式之后寫一個換行符。 | **HTML文檔對象可以避免使用這些節點對象和屬性:** | 屬性 / 方法 | 避免的原因 | | --- | --- | | document.attributes | 文檔沒有該屬性 | | document.hasAttributes() | 文檔沒有該屬性 | | document.nextSibling | 文檔沒有下一節點 | | document.nodeName | 這個通常是 #document | | document.nodeType | 這個通常是 9(DOCUMENT\_NODE) | | document.nodeValue | 文檔沒有一個節點值 | | document.ownerDocument | 文檔沒有主文檔 | | document.ownerElement | 文檔沒有自己的節點 | | document.parentNode | 文檔沒有父節點 | | document.previousSibling | 文檔沒有兄弟節點 | | document.textContent | 文檔沒有文本節點 | ##### 獲取DOM 元素節點的方法 getElementById 返回指定id的DOM元素節點對象 getElementsByClassName 返回指定class的DOM元素節點對象 getElementsByName 返回指定name的DOM元素節點對象 getElementsByTagName 返回指定元素名稱的DOM元素節點對象 getElementsByTagNameNS ~~~ <html> <head> <script type="text/javascript"> function getValue() { var x=document.getElementById("myHeader") alert(x.innerHTML) } </script> </head> <body> ? <h1 id="myHeader" onclick="getValue()">這是提示的文本</h1> <p>上面綁定的點擊事件</p> ? </body> </html> ~~~ ##### DOM對象的屬性和方法 以下屬性和方法可適用于所有 HTML 元素: | 屬性 / 方法 | 描述 | | --- | --- | | *element*.accessKey | 設置或返回accesskey一個元素 | | *element*.addEventListener() | 向指定元素添加事件句柄 | | *element*.appendChild() | 為元素添加一個新的子元素 | | *element*.attributes | 返回一個元素的屬性數組 | | *element*.childNodes | 返回元素的一個子節點的數組 | | *element*.children | 返回元素的子元素的集合 | | *element*.classList | 返回元素的類名,作為 DOMTokenList 對象。 | | *element*.className | 設置或返回元素的class屬性 | | *element*.clientHeight | 在頁面上返回內容的可視高度(不包括邊框,邊距或滾動條) | | *element*.clientWidth | 在頁面上返回內容的可視寬度(不包括邊框,邊距或滾動條) | | *element*.cloneNode() | 克隆某個元素 | | *element*.compareDocumentPosition() | 比較兩個元素的文檔位置。 | | *element*.contentEditable | 設置或返回元素的內容是否可編輯 | | *element*.dir | 設置或返回一個元素中的文本方向 | | *element*.firstChild | 返回元素的第一個子節點 | | *element*.focus() | 設置文檔或元素獲取焦點 | | *element*.getAttribute() | 返回指定元素的屬性值 | | *element*.getAttributeNode() | 返回指定屬性節點 | | *element*.getElementsByTagName() | 返回指定標簽名的所有子元素集合。 | | *element*. getElementsByClassName() | 返回文檔中所有指定類名的元素集合,作為 NodeList 對象。 | | *element*.getFeature() | 返回指定特征的執行APIs對象。 | | *element*.getUserData() | 返回一個元素中關聯鍵值的對象。 | | *element*.hasAttribute() | 如果元素中存在指定的屬性返回 true,否則返回false。 | | *element*.hasAttributes() | 如果元素有任何屬性返回true,否則返回false。 | | *element*.hasChildNodes() | 返回一個元素是否具有任何子元素 | | *element*.hasFocus() | 返回布爾值,檢測文檔或元素是否獲取焦點 | | *element*.id | 設置或者返回元素的 id。 | | *element*.innerHTML | 設置或者返回元素的內容。 | | *element*.insertBefore() | 現有的子元素之前插入一個新的子元素 | | *element*.isContentEditable | 如果元素內容可編輯返回 true,否則返回false | | *element*.isDefaultNamespace() | 如果指定了namespaceURI 返回 true,否則返回 false。 | | *element*.isEqualNode() | 檢查兩個元素是否相等 | | *element*.isSameNode() | 檢查兩個元素所有有相同節點。 | | *element*.isSupported() | 如果在元素中支持指定特征返回 true。 | | *element*.lang | 設置或者返回一個元素的語言。 | | *element*.lastChild | 返回的最后一個子節點 | | *element*.namespaceURI | 返回命名空間的 URI。 | | *element*.nextSibling | 返回該元素緊跟的一個節點 | | *element*.nextElementSibling | 返回指定元素之后的下一個兄弟元素(相同節點樹層中的下一個元素節點)。 | | *element*.nodeName | 返回元素的標記名(大寫) | | *element*.nodeType | 返回元素的節點類型 | | *element*.nodeValue | 返回元素的節點值 | | *element*.normalize() | 使得此成為一個"normal"的形式,其中只有結構(如元素,注釋,處理指令,CDATA節和實體引用)隔開Text節點,即元素(包括屬性)下面的所有文本節點,既沒有相鄰的文本節點也沒有空的文本節點 | | *element*.offsetHeight | 返回任何一個元素的高度包括邊框和填充,但不是邊距 | | *element*.offsetWidth | 返回元素的寬度,包括邊框和填充,但不是邊距 | | *element*.offsetLeft | 返回當前元素的相對水平偏移位置的偏移容器 | | *element*.offsetParent | 返回元素的偏移容器 | | *element*.offsetTop | 返回當前元素的相對垂直偏移位置的偏移容器 | | *element*.ownerDocument | 返回元素的根元素(文檔對象) | | *element*.parentNode | 返回元素的父節點 | | *element*.previousSibling | 返回某個元素緊接之前元素 | | *element*.previousElementSibling | 返回指定元素的前一個兄弟元素(相同節點樹層中的前一個元素節點)。 | | *element*.querySelector() | 返回匹配指定 CSS 選擇器元素的第一個子元素 | | document.querySelectorAll() | 返回匹配指定 CSS 選擇器元素的所有子元素節點列表 | | *element*.removeAttribute() | 從元素中刪除指定的屬性 | | *element*.removeAttributeNode() | 刪除指定屬性節點并返回移除后的節點。 | | *element*.removeChild() | 刪除一個子元素 | | *element*.removeEventListener() | 移除由 addEventListener() 方法添加的事件句柄 | | *element*.replaceChild() | 替換一個子元素 | | *element*.scrollHeight | 返回整個元素的高度(包括帶滾動條的隱蔽的地方) | | *element*.scrollLeft | 返回當前視圖中的實際元素的左邊緣和左邊緣之間的距離 | | *element*.scrollTop | 返回當前視圖中的實際元素的頂部邊緣和頂部邊緣之間的距離 | | *element*.scrollWidth | 返回元素的整個寬度(包括帶滾動條的隱蔽的地方) | | *element*.setAttribute() | 設置或者改變指定屬性并指定值。 | | *element*.setAttributeNode() | 設置或者改變指定屬性節點。 | | *element*.setIdAttribute() | | | *element*.setIdAttributeNode() | | | *element*.setUserData() | 在元素中為指定鍵值關聯對象。 | | *element*.style | 設置或返回元素的樣式屬性 | | *element*.tabIndex | 設置或返回元素的標簽順序。 | | *element*.tagName | 作為一個字符串返回某個元素的標記名(大寫) | | *element*.textContent | 設置或返回一個節點和它的文本內容 | | *element*.title | 設置或返回元素的title屬性 | | *element*.toString() | 一個元素轉換成字符串 | | *nodelist*.item() | 返回某個元素基于文檔樹的索引 | | *nodelist*.length | 返回節點列表的節點數目。 | ##### Attr 對象 在 HTML DOM 中, **Attr 對象** 代表一個 HTML 屬性。 HTML屬性總是屬于HTML元素。 ##### NamedNodeMap 對象 在 HTML DOM 中, the **NamedNodeMap 對象** 表示一個無順序的節點列表。 我們可通過節點名稱來訪問 NamedNodeMap 中的節點。 所有主流瀏覽器都支持 Attr 對象和 NamedNodeMap 對象。 | 屬性 / 方法 | 描述 | | --- | --- | | *attr*.isId | 如果屬性是 ID 類型,則 isId 屬性返回 true,否則返回 false。 | | *attr*.name | 返回屬性名稱 | | *attr*.value | 設置或者返回屬性值 | | *attr*.specified | 如果屬性被指定返回 true ,否則返回 false | | *nodemap*.getNamedItem() | 從節點列表中返回的指定屬性節點。 | | *nodemap*.item() | 返回節點列表中處于指定索引號的節點。 | | *nodemap*.length | 返回節點列表的節點數目。 | | *nodemap*.removeNamedItem() | 刪除指定屬性節點 | | *nodemap*.setNamedItem() | 設置指定屬性節點(通過名稱) | #### 3.2 DOM事件 HTML DOM 事件允許Javascript在HTML文檔元素中注冊不同事件處理程序。 鼠標事件 | 屬性 | 描述 | | --- | --- | | onclick | 當用戶點擊某個對象時調用的事件句柄。 | | oncontextmenu | 在用戶點擊鼠標右鍵打開上下文菜單時觸發 | | ondblclick | 當用戶雙擊某個對象時調用的事件句柄。 | | onmousedown | 鼠標按鈕被按下。 | | onmouseenter | 當鼠標指針移動到元素上時觸發。 | | onmouseleave | 當鼠標指針移出元素時觸發 | | onmousemove | 鼠標被移動。 | | onmouseover | 鼠標移到某元素之上。 | | onmouseout | 鼠標從某元素移開。 | | onmouseup | 鼠標按鍵被松開。 | 點擊事件例子: ~~~ <!DOCTYPE html> <html lang="en"> <head> ? <script> ? ? ? function al(){ ? ? ? ? ? alert(1); ? ? ? } ? </script> </head> <body> <p onclick="al()">a</p> </body> </html> ~~~ :-: ![](https://img.kancloud.cn/66/47/66474f492c61ffc8ce1d15f48f736210_518x221.png) :-: ![](https://img.kancloud.cn/f7/a4/f7a4206ab62181323b9a3c39d8ff2768_517x236.png) 上面我們為`<p>`元素添加了點擊事件綁定了al()函數。所以點擊`<p>`元素時會觸發點擊事件執行al()方法。 鍵盤事件 | 屬性 | 描述 | | --- | --- | | onkeydown | 某個鍵盤按鍵被按下。 | | onkeypress | 某個鍵盤按鍵被按下并松開。 | | onkeyup | 某個鍵盤按鍵被松開。 | 鼠標按下事件例子: ~~~ <!DOCTYPE html> <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ? <head> ? ? ? <meta charset="utf-8"> ? ? ? <script> ? ? ? ? ? function tryDown(){ ? ? ? ? ? ? ? alert("你已按下"); ? ? ? ? ? } ? ? ? </script> ? </head> <body> <p>嘗試按下一個鍵</p> <input type="text" onkeydown="tryDown()"> </body> </html> ~~~ :-: ![](https://img.kancloud.cn/13/20/132062ae6180a2b8acf03313a4a2770c_517x226.png) :-: ![](https://img.kancloud.cn/6e/5f/6e5f7b67b52a4762ef80405c58c40c5c_516x230.png) 上面我們為`<input>`元素添加鼠標按下事件并綁定tryDown()方法。將光標移動到`<input>`元素上再按下一個鍵時就會觸發tryDown()方法。 框架/對象(Frame/Object)事件 | 屬性 | 描述 | | --- | --- | | onabort | 圖像的加載被中斷。 ( ) | | onbeforeunload | 該事件在即將離開頁面(刷新或關閉)時觸發 | | onerror | 在加載文檔或圖像時發生錯誤。 ( , 和 ) | | onhashchange | 該事件在當前 URL 的錨部分發生修改時觸發。 | | onload | 一張頁面或一幅圖像完成加載。 | | onpageshow | 該事件在用戶訪問頁面時觸發 | | onpagehide | 該事件在用戶離開當前網頁跳轉到另外一個頁面時觸發 | | onresize | 窗口或框架被重新調整大小。 | | onscroll | 當文檔被滾動時發生的事件。 | | onunload | 用戶退出頁面。 ( 和 ) | 表單事件 | 屬性 | 描述 | | --- | --- | | onblur | 元素失去焦點時觸發 | | onchange | 該事件在表單元素的內容改變時觸發( , , , 和 ) | | onfocus | 元素獲取焦點時觸發 | | onfocusin | 元素即將獲取焦點時觸發 | | onfocusout | 元素即將失去焦點時觸發 | | oninput | 元素獲取用戶輸入時觸發 | | onreset | 表單重置時觸發 | | onsearch | 用戶向搜索域輸入文本時觸發 ( ) | | onselect | 用戶選取文本時觸發 ( 和 ) | | onsubmit | 表單提交時觸發 | 剪貼板事件 | 屬性 | 描述 | | --- | --- | | oncopy | 該事件在用戶拷貝元素內容時觸發 | | oncut | 該事件在用戶剪切元素內容時觸發 | | onpaste | 該事件在用戶粘貼元素內容時觸發 | 打印事件 | 屬性 | 描述 | | --- | --- | | onafterprint | 該事件在頁面已經開始打印,或者打印窗口已經關閉時觸發 | | onbeforeprint | 該事件在頁面即將開始打印時觸發 | 拖動事件 | 事件 | 描述 | | --- | --- | | ondrag | 該事件在元素正在拖動時觸發 | | ondragend | 該事件在用戶完成元素的拖動時觸發 | | ondragenter | 該事件在拖動的元素進入放置目標時觸發 | | ondragleave | 該事件在拖動元素離開放置目標時觸發 | | ondragover | 該事件在拖動元素在放置目標上時觸發 | | ondragstart | 該事件在用戶開始拖動元素時觸發 | | ondrop | 該事件在拖動元素放置在目標區域時觸發 | 多媒體(Media)事件 | 事件 | 描述 | | --- | --- | | onabort | 事件在視頻/音頻(audio/video)終止加載時觸發。 | | oncanplay | 事件在用戶可以開始播放視頻/音頻(audio/video)時觸發。 | | oncanplaythrough | 事件在視頻/音頻(audio/video)可以正常播放且無需停頓和緩沖時觸發。 | | ondurationchange | 事件在視頻/音頻(audio/video)的時長發生變化時觸發。 | | onemptied | 當期播放列表為空時觸發 | | onended | 事件在視頻/音頻(audio/video)播放結束時觸發。 | | onerror | 事件在視頻/音頻(audio/video)數據加載期間發生錯誤時觸發。 | | onloadeddata | 事件在瀏覽器加載視頻/音頻(audio/video)當前幀時觸發觸發。 | | onloadedmetadata | 事件在指定視頻/音頻(audio/video)的元數據加載后觸發。 | | onloadstart | 事件在瀏覽器開始尋找指定視頻/音頻(audio/video)觸發。 | | onpause | 事件在視頻/音頻(audio/video)暫停時觸發。 | | onplay | 事件在視頻/音頻(audio/video)開始播放時觸發。 | | onplaying | 事件在視頻/音頻(audio/video)暫停或者在緩沖后準備重新開始播放時觸發。 | | onprogress | 事件在瀏覽器下載指定的視頻/音頻(audio/video)時觸發。 | | onratechange | 事件在視頻/音頻(audio/video)的播放速度發送改變時觸發。 | | onseeked | 事件在用戶重新定位視頻/音頻(audio/video)的播放位置后觸發。 | | onseeking | 事件在用戶開始重新定位視頻/音頻(audio/video)時觸發。 | | onstalled | 事件在瀏覽器獲取媒體數據,但媒體數據不可用時觸發。 | | onsuspend | 事件在瀏覽器讀取媒體數據中止時觸發。 | | ontimeupdate | 事件在當前的播放位置發送改變時觸發。 | | onvolumechange | 事件在音量發生改變時觸發。 | | onwaiting | 事件在視頻由于要播放下一幀而需要緩沖時觸發。 | 動畫事件 | 事件 | 描述 | | --- | --- | | animationend | 該事件在 CSS 動畫結束播放時觸發 | | animationiteration | 該事件在 CSS 動畫重復播放時觸發 | | animationstart | 該事件在 CSS 動畫開始播放時觸發 | 過渡事件 | 事件 | 描述 | | --- | --- | | transitionend | 該事件在 CSS 完成過渡后觸發。 | 其他事件 | 事件 | 描述 | | --- | --- | | onmessage | 該事件通過或者從對象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息時觸發 | | onmousewheel | 已廢棄。 使用 onwheel 事件替代 | | ononline | 該事件在瀏覽器開始在線工作時觸發。 | | onoffline | 該事件在瀏覽器開始離線工作時觸發。 | | onpopstate | 該事件在窗口的瀏覽歷史(history 對象)發生改變時觸發。 | | onshow | 該事件當 元素在上下文菜單顯示時觸發 | | onstorage | 該事件在 Web Storage(HTML 5 Web 存儲)更新時觸發 | | ontoggle | 該事件在用戶打開或關閉 元素時觸發 | | onwheel | 該事件在鼠標滾輪在元素上下滾動時觸發 | #### 事件對象 常量 | 靜態變量 | 描述 | | --- | --- | | CAPTURING-PHASE | 當前事件階段為捕獲階段(1) | | AT-TARGET | 當前事件是目標階段,在評估目標事件(1) | | BUBBLING-PHASE | 當前的事件為冒泡階段 (3) | 屬性 | 屬性 | 描述 | | --- | --- | | bubbles | 返回布爾值,指示事件是否是起泡事件類型。 | | cancelable | 返回布爾值,指示事件是否可擁可取消的默認動作。 | | currentTarget | 返回其事件監聽器觸發該事件的元素。 | | eventPhase | 返回事件傳播的當前階段。 | | target | 返回觸發此事件的元素(事件的目標節點)。 | | timeStamp | 返回事件生成的日期和時間。 | | type | 返回當前 Event 對象表示的事件的名稱。 | 方法 | 方法 | 描述 | | --- | --- | | initEvent() | 初始化新創建的 Event 對象的屬性。 | | preventDefault() | 通知瀏覽器不要執行與事件關聯的默認動作。 | | stopPropagation() | 不再派發事件。 | #### 目標事件對象 方法 | 方法 | 描述 | | --- | --- | | addEventListener() | 允許在目標事件中注冊監聽事件(IE8 = attachEvent()) | | dispatchEvent() | 允許發送事件到監聽器上 (IE8 = fireEvent()) | | removeEventListener() | 運行一次注冊在事件目標上的監聽事件(IE8 = detachEvent()) | 事件監聽對象 方法 | 方法 | 描述 | | --- | --- | | handleEvent() | 把任意對象注冊為事件處理程序 | #### 文檔事件對象 方法 | 方法 | 描述 | | --- | --- | | createEvent() | | #### 鼠標/鍵盤事件對象 屬性 | 屬性 | 描述 | | --- | --- | | altKey | 返回當事件被觸發時,"ALT" 是否被按下。 | | button | 返回當事件被觸發時,哪個鼠標按鈕被點擊。 | | clientX | 返回當事件被觸發時,鼠標指針的水平坐標。 | | clientY | 返回當事件被觸發時,鼠標指針的垂直坐標。 | | ctrlKey | 返回當事件被觸發時,"CTRL" 鍵是否被按下。 | | Location | 返回按鍵在設備上的位置 | | charCode | 返回onkeypress事件觸發鍵值的字母代碼。 | | key | 在按下按鍵時返回按鍵的標識符。 | | keyCode | 返回onkeypress事件觸發的鍵的值的字符代碼,或者 onkeydown 或 onkeyup 事件的鍵的代碼。 | | which | 返回onkeypress事件觸發的鍵的值的字符代碼,或者 onkeydown 或 onkeyup 事件的鍵的代碼。 | | metaKey | 返回當事件被觸發時,"meta" 鍵是否被按下。 | | relatedTarget | 返回與事件的目標節點相關的節點。 | | screenX | 返回當某個事件被觸發時,鼠標指針的水平坐標。 | | screenY | 返回當某個事件被觸發時,鼠標指針的垂直坐標。 | | shiftKey | 返回當事件被觸發時,"SHIFT" 鍵是否被按下。 | 方法 | 方法 | 描述 | | --- | --- | | initMouseEvent() | 初始化鼠標事件對象的值 | | initKeyboardEvent() | 初始化鍵盤事件對象的值 | ##### 計時事件 通過使用 JavaScript,我們有能力做到在一個設定的時間間隔之后來執行代碼,而不是在函數被調用后立即執行。我們稱之為計時事件。 在 JavaScritp 中使用計時事件是很容易的,兩個關鍵方法是: * setInterval() - 間隔指定的毫秒數不停地執行指定的代碼。 ~~~ var myVar=setInterval(function(){myTimer()},1000); function myTimer() { ? var d=new Date(); ? var t=d.toLocaleTimeString(); ? document.getElementById("demo").innerHTML=t; } ~~~ * setTimeout() - 在指定的毫秒數后執行指定代碼。 ~~~ setTimeout(function(){alert("Hello")},3000); ~~~ clearInterval() 方法用于停止 setInterval() 方法執行的函數代碼。 clearTimeout() 方法用于停止執行setTimeout()方法的函數代碼。 #### 3.3 其他對象 ##### Console 對象 Console 對象提供了訪問瀏覽器調試模式的信息到控制臺。 | 方法 | 描述 | | --- | --- | | assert() | 如果斷言為 false,則在信息到控制臺輸出錯誤信息。 | | clear() | 清除控制臺上的信息。 | | count() | 記錄 count() 調用次數,一般用于計數。 | | error() | 輸出錯誤信息到控制臺 | | group() | 在控制臺創建一個信息分組。 一個完整的信息分組以 console.group() 開始,console.groupEnd() 結束 | | groupCollapsed() | 在控制臺創建一個信息分組。 類似 console.group() ,但它默認是折疊的。 | | groupEnd() | 設置當前信息分組結束 | | info() | 控制臺輸出一條信息 | | log() | 控制臺輸出一條信息 | | table() | 以表格形式顯示數據 | | time() | 計時器,開始計時間,與 timeEnd() 聯合使用,用于算出一個操作所花費的準確時間。 | | timeEnd() | 計時結束 | | trace() | 顯示當前執行的代碼在堆棧中的調用路徑。 | | warn() | 輸出警告信息,信息最前面加一個黃色三角,表示警告 | ##### CSS 樣式聲明對象 CSSStyleDeclaration 對象屬性 | 屬性 | 描述 | | --- | --- | | cssText | 設置或返回樣式聲明文本,cssText 對應的是 HTML 元素的 style 屬性。 | | length | 返回樣式中包含多少條聲明。 | | parentRule | 返回包含當前規則的規則。 | ~~~ var elmnt = document.getElementsByTagName("h1")[0]; var x = elmnt.style.cssText; ~~~ CSSStyleDeclaration 對象方法 | 方法 | 描述 | | --- | --- | | getPropertyPriority() | 返回指定的 CSS 屬性是否設置了 "important!" 屬性。 | | getPropertyValue() | 返回指定的 CSS 屬性值。 | | item() | 通過索引方式返回 CSS 聲明中的 CSS 屬性名。 | | removeProperty() | 移除 CSS 聲明中的 CSS 屬性。 | | setProperty() | 在 CSS 聲明塊中新建或者修改 CSS 屬性。 | ~~~ var style = document.getElementById("ex1").style; var propname = style.item(0); alert(propname); ~~~ ##### HTMLCollection對象 下表列出了 HTMLCollection 對象中的屬性和方法: | 屬性 / 方法 | 描述 | | --- | --- | | item() | 返回 HTMLCollection 中指定索引的元素。 | | length | 返回 HTMLCollection 中元素的數量。 | | namedItem() | 返回 HTMLCollection 中指定 ID 或 name 屬性的元素。 | #### 3.4 Window - 瀏覽器對象模型 BOM ##### Window 對象 所有瀏覽器都支持 window 對象。它表示瀏覽器窗口。 所有 JavaScript 全局對象、函數以及變量均自動成為 window 對象的成員。 全局變量是 window 對象的屬性。 全局函數是 window 對象的方法。 ##### Window 尺寸 * window.innerHeight - 瀏覽器窗口的內部高度(包括滾動條) * window.innerWidth - 瀏覽器窗口的內部寬度(包括滾動條) * window.open() - 打開新窗口 * window.close() - 關閉當前窗口 * window.moveTo() - 移動當前窗口 * window.resizeTo() - 調整當前窗口的尺寸 * screen.availWidth - 可用的屏幕寬度 * screen.availHeight - 可用的屏幕高度 * location.hostname 返回 web 主機的域名 * location.pathname 返回當前頁面的路徑和文件名 * location.port 返回 web 主機的端口 (80 或 443) * location.protocol 返回所使用的 web 協議(http: 或 https:) * history.back() - 與在瀏覽器點擊后退按鈕相同 * history.forward() - 與在瀏覽器中點擊向前按鈕相同 * history.go(-1) -倒退1頁 ##### Window Navigator window.navigator 對象在編寫時可不使用 window 這個前綴。 ~~~ <div id="example"></div> <script> txt = "<p>瀏覽器代號: " + navigator.appCodeName + "</p>"; txt+= "<p>瀏覽器名稱: " + navigator.appName + "</p>"; txt+= "<p>瀏覽器版本: " + navigator.appVersion + "</p>"; txt+= "<p>啟用Cookies: " + navigator.cookieEnabled + "</p>"; txt+= "<p>硬件平臺: " + navigator.platform + "</p>"; txt+= "<p>用戶代理: " + navigator.userAgent + "</p>"; txt+= "<p>用戶代理語言: " + navigator.systemLanguage + "</p>"; document.getElementById("example").innerHTML=txt; </script> ~~~ ##### 警告框 ~~~ window.alert("sometext"); ~~~ ##### 確認框 ~~~ window.confirm("sometext"); ~~~ ##### 提示輸入 ~~~ window.prompt("sometext","defaultvalue"); ~~~ #### 3.5 Javascript Cookie及本地存儲 ##### 3.5.1 Cookie 當 web 服務器向瀏覽器發送 web 頁面時,在連接關閉后,服務端不會記錄用戶的信息。 Cookie 的作用就是用于解決 "如何記錄客戶端的用戶信息": * 當用戶訪問 web 頁面時,他的名字可以記錄在 cookie 中。 * 在用戶下一次訪問該頁面時,可以在 cookie 中讀取用戶訪問記錄。 創建cookie ~~~ document.cookie="username=John Doe"; ~~~ 修改cookie ~~~ document.cookie="username=John Smith; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/"; ~~~ 刪除cookie ~~~ document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT"; ~~~ 設置 cookie值的函數 ~~~ function setCookie(cname,cvalue,exdays) { var d = new Date(); d.setTime(d.getTime()+(exdays*24*60*60*1000)); var expires = "expires="+d.toGMTString(); document.cookie = cname + "=" + cvalue + "; " + expires; } ~~~ 獲取 cookie 值的函數 ~~~ function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { ? var c = ca[i].trim(); ? if (c.indexOf(name)==0) return c.substring(name.length,c.length); } return ""; } ~~~ 例子: ~~~ <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script> ? window.onload = function () { ? ? ? function setCookie(cname, cvalue, exdays) { ? ? ? ? ? var d = new Date(); ? ? ? ? ? d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); ? ? ? ? ? var expires = "expires=" + d.toGMTString(); ? ? ? ? ? document.cookie = cname + "=" + cvalue + "; " + expires; ? ? ? } ? ? ? ? function getCookie(cname) { ? ? ? ? ? var name = cname + "="; ? ? ? ? ? var ca = document.cookie.split(';'); ? ? ? ? ? for (var i = 0; i < ca.length; i++) { ? ? ? ? ? ? ? var c = ca[i].trim(); ? ? ? ? ? ? ? if (c.indexOf(name) == 0) return c.substring(name.length, c.length); ? ? ? ? ? } ? ? ? ? ? return ""; ? ? ? } ? ? ? ? setCookie('a', '10', 10); ? ? ? alert(getCookie('a')); ? } </script> </head> </html> ~~~ :-: ![](https://img.kancloud.cn/96/11/9611e01db2c17705f088b30d85130410_523x272.png) :-: ![](https://img.kancloud.cn/97/2e/972ee072586c61ead63f6b0e5bbff628_520x380.png) 我們發現已經成功設置Cookie:a=10。 ##### 3.5.2 本地存儲 localStorage 對象存儲的是沒有截止日期的數據。當瀏覽器被關閉時數據不會被刪除,在下一天、周或年中,都是可用的。 ~~~ // 存儲 localStorage.setItem("lastname", "Gates"); // 取回 document.getElementById("result").innerHTML = localStorage.getItem("lastname"); ~~~ sessionStorage 對象等同 localStorage 對象,不同之處在于只對一個 session 存儲數據。如果用戶關閉具體的瀏覽器標簽頁,數據也會被刪除。 ~~~ if (sessionStorage.clickcount) { ? sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1; } else { ? sessionStorage.clickcount = 1; } document.getElementById("result").innerHTML = "在本 session 中,您已經點擊這個按鈕 " + sessionStorage.clickcount + " 次。"; ~~~ #### 3.6 JavaScript 用法 HTML中的javascript腳本必須位于`<script>` `</script>`標簽之間 腳本可以放置于`<body>` 和 `<head>`部分中 ~~~ <!DOCTYPE html> <html> <head> <script> function myFunction() { ? document.getElementById("demo").innerHTML="我的第一個 JavaScript 函數"; } </script> </head> <body> <h1>我的 Web 頁面</h1> <p id="demo">一個段落</p> <button type="button" onclick="myFunction()">嘗試一下</button> </body> </html> ~~~ ##### 外部引用 ~~~ <!DOCTYPE html> <html> <body> <script src="myScript.js"></script> </body> </html> ~~~ ##### JavaScript 變量 ~~~ var x, length x = 5 length = 6 ~~~ ##### JavaScript 操作符 ~~~ x = 5 y = 6 z = (x + y) * 10 ~~~ | 類型 | 實例 | 描述 | | --- | --- | --- | | 賦值,算術和位運算符 | \= + - \* / | 在 JS 運算符中描述 | | 條件,比較及邏輯運算符 | \== != | 在 JS 比較運算符中描述 | ##### JavaScript 注釋 ~~~ // 我不會執行 ~~~ ##### JavaScript 語句標識符 JavaScript 語句通常以一個 語句標識符 為開始,并執行該語句。 語句標識符是保留關鍵字不能作為變量名使用。 下表列出了 JavaScript 語句標識符 (關鍵字) : | 語句 | 描述 | | --- | --- | | break | 用于跳出循環。 | | catch | 語句塊,在 try 語句塊執行出錯時執行 catch 語句塊。 | | continue | 跳過循環中的一個迭代。 | | do ... while | 執行一個語句塊,在條件語句為 true 時繼續執行該語句塊。 | | for | 在條件語句為 true 時,可以將代碼塊執行指定的次數。 | | for ... in | 用于遍歷數組或者對象的屬性(對數組或者對象的屬性進行循環操作)。 | | function | 定義一個函數 | | if ... else | 用于基于不同的條件來執行不同的動作。 | | return | 退出函數 | | switch | 用于基于不同的條件來執行不同的動作。 | | throw | 拋出(生成)錯誤 。 | | try | 實現錯誤處理,與 catch 一同使用。 | | var | 聲明一個變量。 | | while | 當條件語句為 true 時,執行語句塊。 | #### 3.7 JavaScript 數據類型 在 JavaScript 中有 6 種不同的數據類型: * string * number * boolean * object * function * symbol 3 種對象類型: * Object * Date * Array 2 個不包含任何值的數據類型: * null * undefined ##### JavaScript 字符串 ~~~ var answer="It's alright"; var answer="He is called 'Johnny'"; var answer='He is called "Johnny"'; ~~~ ##### JavaScript 數字 ~~~ var x1=34.00; ? ? //使用小數點來寫 var x2=34; ? ? ? ? //不使用小數點來寫 var y=123e5; ? ? // 12300000 var z=123e-5; ? ? // 0.00123 ~~~ ##### JavaScript 布爾 ~~~ var x=true; var y=false; ~~~ ##### JavaScript 數組 ~~~ var cars=new Array(); cars[0]="Saab"; cars[1]="Volvo"; cars[2]="BMW"; ? var cars=new Array("Saab","Volvo","BMW"); ? var cars=["Saab","Volvo","BMW"]; ~~~ ##### JavaScript 對象 ~~~ var person={firstname:"John", lastname:"Doe", id:5566}; ? ? var person={ firstname : "John", lastname : "Doe", id ? ? ? : 5566 }; ~~~ 對象屬性有兩種尋址方式: ~~~ name=person.lastname; name=person["lastname"]; ~~~ ##### Undefined 和 Null Undefined 這個值表示變量不含有值。 可以通過將變量的值設置為 null 來清空變量。 ##### 聲明變量類型 ~~~ var carname=new String; var x= new Number; var y= new Boolean; var cars= new Array; var person= new Object; ~~~ ##### typeof 操作符 用于獲得數據類型。 ~~~ typeof "John" // 返回 string typeof 3.14 // 返回 number typeof false // 返回 boolean typeof [1,2,3,4] // 返回 object typeof {name:'John', age:34} // 返回 object ~~~ ##### undefined 和 null 的區別 null 和 undefined 的值相等,但類型不等 在 JavaScript 中 null 表示 "什么都沒有" 在 JavaScript 中, undefined 是一個沒有設置值的變量。 ~~~ typeof undefined // undefined typeof null // object null === undefined // false null == undefined // tru ~~~ **String()** 可以將數字轉換為字符串。 ~~~ String(x) // 將變量 x 轉換為字符串并返回 String(123) // 將數字 123 轉換為字符串并返回 String(100 + 23) // 將數字表達式轉換為字符串并返回 String(false) // 返回 "false" String(true) // 返回 "true" String(new Date()) // 返回 Thu Jul 17 2014 15:38:19 GMT+0200 (W. Europe Daylight Time) ~~~ Number 方法 **toString()** 也是有同樣的效果。 ~~~ x.toString() (123).toString() (100 + 23).toString() ~~~ Date 方法 **toString()** 也有相同的效果。 ~~~ obj = new Date() obj.toString() // 返回 Thu Jul 17 2014 15:38:19 GMT+0200 (W. Europe Daylight Time) ~~~ **Number()** 可以將字符串轉換為數字。 ~~~ Number("3.14") // 返回 3.14 Number(" ") // 返回 0 Number("") // 返回 0 Number("99 88") // 返回 NaN Number(false) // 返回 0 Number(true) // 返回 1 d = new Date(); Number(d) // 返回 1404568027739 ~~~ 日期方法 **getTime()** 也有相同的效果。 ~~~ d = new Date(); d.getTime() // 返回 1404568027739 ~~~ ##### 一元運算符 + **Operator +** 可用于將變量轉換為數字: ~~~ var y = "5"; // y 是一個字符串 var x = + y; // x 是一個數字 ~~~ 如果變量不能轉換,它仍然會是一個數字,但值為 NaN (不是一個數字): ~~~ var y = "John"; // y 是一個字符串 var x = + y; // x 是一個數字 (NaN) ~~~ ##### 自動轉換類型 ~~~ 5 + null // 返回 5 null 轉換為 0 "5" + null // 返回"5null" null 轉換為 "null" "5" + 1 // 返回 "51" 1 轉換為 "1" "5" - 1 // 返回 4 "5" 轉換為 5 ~~~ #### 3.8 JavaScript 對象 真實生活中的對象,屬性和方法 | 對象 | 屬性 | 方法 | | -- | --- | --- | | ![](https://img.kancloud.cn/9f/11/9f11815dc2382a2f347f69524d16d3de_97x107.png)|lastModify=1627150258) | man.name = Tom man.age= 30 man.weight = 80kg man.color = black | man.eat() man.walk() man.study() man.stop() | 所有人都有這些屬性,但是每個人的屬性都不盡相同。 所有人都擁有這些方法,但是它們被執行的時間都不盡相同。 ##### 對象定義 ~~~ var person = { firstName:"Tom", lastName:"Doe", age:50, eyeColor:"blue" fun:function(){ alert(1); } }; ~~~ ##### 訪問對象屬性 ~~~ person.lastName; person["lastName"]; ~~~ ##### 對象方法 ~~~ name = person.fullName(); name = person.fullName;(不加括號會將函數字符串作為屬性返回) ~~~ ##### JavaScript 函數語法 函數就是包裹在花括號中的代碼塊,前面使用了關鍵詞 function: ~~~ function method() { // code } ~~~ ##### 調用帶參數的函數 聲明函數 ~~~ function myFunction(var1,var2) { code } ~~~ 使用函數 ~~~ var x = myFunction(argument1,argument2); ~~~ ##### 帶有返回值的函數 在使用 return 語句時,函數會停止執行,并返回指定的值。 ~~~ function myFunction() { var x=5; return x; } ~~~ #### 3.9 JavaScript 變量 ##### 3.9.1 變量 ##### 局部 JavaScript 變量 在 JavaScript 函數內部聲明的變量(使用 var)是局部變量,所以只能在函數內部訪問它。(該變量的作用域是局部的)。 您可以在不同的函數中使用名稱相同的局部變量,因為只有聲明過該變量的函數才能識別出該變量。 只要函數運行完畢,本地變量就會被刪除。 ##### 全局 JavaScript 變量 在函數外聲明的變量是*全局*變量,網頁上的所有腳本和函數都能訪問它。 ##### JavaScript 變量的生存期 JavaScript 變量的生命期從它們被聲明的時間開始。 局部變量會在函數運行以后被刪除。 全局變量會在頁面關閉后被刪除。 ##### 向未聲明的 JavaScript 變量分配值 如果您把值賦給尚未聲明的變量,該變量將被自動作為 window 的一個屬性。 如這條語句: carname="Volvo"; ##### 3.9.2 變量的作用域 變量在函數內聲明,變量為局部作用域。 ~~~ // 此處不能調用 carName 變量 function myFunction() { var carName = "Volvo"; // 函數內可調用 carName 變量 } ~~~ ##### JavaScript 全局變量 ~~~ var carName = " Volvo"; // 此處可調用 carName 變量 function myFunction() { // 函數內可調用 carName 變量 } ~~~ 如果變量在函數內沒有聲明(沒有使用 var 關鍵字),該變量為全局變量。 ~~~ // 此處可調用 carName 變量 function myFunction() { carName = "Volvo"; // 此處可調用 carName 變量 } ~~~ ##### 3.9.3 JavaScript 變量生命周期 JavaScript 變量生命周期在它聲明時初始化。 局部變量在函數執行完畢后銷毀。 全局變量在頁面關閉后銷毀。 ##### 3.9.4 let 和 const let 聲明的變量只在 let 命令所在的代碼塊內有效。 const 聲明一個只讀的常量,一旦聲明,常量的值就不能改變。 在 ES6 之前,JavaScript 只有兩種作用域: **全局變量** 與 **函數內的局部變量**。 在 ES6 之前,是沒有塊級作用域的概念的。 ES6 可以使用 let 關鍵字來實現塊級作用域。 let 聲明的變量只在 let 命令所在的代碼塊 **{}** 內有效,在 **{}** 之外不能訪問。 ~~~ { let x = 2; } // 這里不能使用 x 變量 ~~~ const 用于聲明一個或多個常量,聲明時必須進行初始化,且初始化后值不可再修改: ~~~ const PI = 3.141592653589793; PI = 3.14; // 報錯 PI = PI + 10; // 報錯 ~~~ #### 3.10 運算符 JavaScript 算術運算符 | 運算符 | 描述 | 例子 | x 運算結果 | y 運算結果 | | --- | --- | --- | --- | --- | | + | 加法 | x=y+2 | 7 | 5 | | \- | 減法 | x=y-2 | 3 | 5 | | \* | 乘法 | x=y\*2 | 10 | 5 | | / | 除法 | x=y/2 | 2.5 | 5 | | % | 取模(余數) | x=y%2 | 1 | 5 | | ++ | 自增 | x=++y | 6 | 6 | | x=y++ | 5 | 6 | | | | \-- | 自減 | x=--y | 4 | 4 | | x=y-- | 5 | 4 | | | ##### 賦值運算符 賦值運算符用于給 JavaScript 變量賦值。 | 運算符 | 例子 | 等同于 | 運算結果 | | --- | --- | --- | --- | | \= | x=y | | x=5 | | += | x+=y | x=x+y | x=15 | | \-= | x-=y | x=x-y | x=5 | | \*= | x\*=y | x=x\*y | x=50 | | /= | x/=y | x=x/y | x=2 | | %= | x%=y | x=x%y | x=0 | ##### 用于字符串的 + 運算符 ~~~ txt1="What a very"; txt2="nice day"; txt3=txt1+txt2; 運算結果txt3的值為What a verynice day ~~~ ##### 對字符串和數字進行加法運算 ~~~ x=5+5; y="5"+5; z="Hello"+5; 運算結果 10 55 Hello5 ~~~ ##### 比較運算符 比較運算符在邏輯語句中使用,以測定變量或值是否相等。 x=5,下面的表格解釋了比較運算符: | 運算符 | 描述 | 比較 | 返回值 | | --- | --- | --- | --- | | \== | 等于 | x==8 | *false* | | x==5 | *true* | | | | \=== | 絕對等于(值和類型均相等) | x==="5" | *false* | | x===5 | *true* | | | | != | 不等于 | x!=8 | *true* | | !== | 不絕對等于(值和類型有一個不相等,或兩個都不相等) | x!=="5" | *true* | | x!==5 | \*false | | | | \> | 大于 | x>8 | *false* | | < | 小于 | x<8 | *true* | | \>= | 大于或等于 | x>=8 | *false* | | <= | 小于或等于 | | | ##### 邏輯運算符 邏輯運算符用于測定變量或值之間的邏輯。 給定 x=6 以及 y=3,下表解釋了邏輯運算符: | 運算符 | 描述 | 例子 | | --- | --- | --- | | && | and | (x 1) 為 true | | || | or | (x==5 || y==5) 為 false | | ! | not | !(x==y) 為 true | #### 3.11 流程控制 ##### if 語句 只有當指定條件為 true 時,該語句才會執行代碼。 ~~~ if (condition) { 當條件為 true 時執行的代碼 } ~~~ ##### if...else 語句 請使用 if....else 語句在條件為 true 時執行代碼,在條件為 false 時執行其他代碼。 ~~~ if (condition) { 當條件為 true 時執行的代碼 } else { 當條件不為 true 時執行的代碼 } ~~~ ##### if...else if...else 語句 使用 if....else if...else 語句來選擇多個代碼塊之一來執行。 ~~~ if (condition1) { 當條件 1 為 true 時執行的代碼 } else if (condition2) { 當條件 2 為 true 時執行的代碼 } else { 當條件 1 和 條件 2 都不為 true 時執行的代碼 } ~~~ ##### 三元表達式 ~~~ voteable=(age<18)?"年齡太小":"年齡已達到"; ~~~ ##### JavaScript switch 語句 請使用 switch 語句來選擇要執行的多個代碼塊之一。 ~~~ switch(n) { case 1: 執行代碼塊 1 break; case 2: 執行代碼塊 2 break; default: 與 case 1 和 case 2 不同時執行的代碼 } ~~~ default 關鍵詞 ~~~ var d=new Date().getDay(); switch (d) { case 6:x="今天是星期六"; break; case 0:x="今天是星期日"; break; default: x="期待周末"; } document.getElementById("demo").innerHTML=x; ~~~ ##### JavaScript 循環 一般寫法 ~~~ document.write(cars[0] + "<br>"); document.write(cars[1] + "<br>"); document.write(cars[2] + "<br>"); document.write(cars[3] + "<br>"); document.write(cars[4] + "<br>"); document.write(cars[5] + "<br>"); ~~~ for循環 ~~~ for (var i=0;i<cars.length;i++) { document.write(cars[i] + "<br>"); } ~~~ For/In 循環 遍歷對象屬性 ~~~ var person={fname:"Bill",lname:"Gates",age:56}; for (x in person) // x 為屬性名 { txt=txt + person[x]; } ~~~ ##### while 循環 while 循環會在指定條件為真時循環執行代碼塊。 ~~~ while (條件) { 需要執行的代碼 } ~~~ ##### do/while 循環 do/while 循環是 while 循環的變體。該循環會在檢查條件是否為真之前執行一次代碼塊,然后如果條件為真的話,就會重復這個循環。 ~~~ do { x=x + "The number is " + i + "<br>"; i++; } while (i<5); ~~~ ##### break 和 continue 語句 break 語句用于跳出循環。 continue 用于跳過循環中的一個迭代。 ##### break 語句 break 語句可用于跳出循環。 break 語句跳出循環后,會繼續執行該循環之后的代碼(如果有的話): break語句可以跳出swich()。 ~~~ for (i=0;i<10;i++) { if (i==3) { break; } x=x + "The number is " + i + "<br>"; } ~~~ ##### continue 語句 中斷循環中的迭代,如果出現了指定的條件,然后繼續循環中的下一個迭代。 ~~~ for (i=0;i<=10;i++) { if (i==3) continue; x=x + "The number is " + i + "<br>"; } ~~~ #### 3.12 JavaScript 正則表達式 正則表達式是由一個字符序列形成的搜索模式。當你在文本中搜索數據時,你可以用搜索模式來描述你要查詢的內容。正則表達式可以是一個簡單的字符,或一個更復雜的模式。正則表達式可用于所有文本搜索和文本替換的操作。 ##### 使用字符串方法 在 JavaScript 中,正則表達式通常用于兩個字符串方法 : search() 和 replace()。 **search() 方法** 用于檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串,并返回子串的起始位置。 **replace() 方法** 用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。 ##### search() 方法使用正則表達式 ~~~ var str = "Visit Runoob!"; var n = str.search(/Runoob/i); ~~~ ##### search() 方法使用字符串 ~~~ var str = "Visit Runoob!"; var n = str.search("Runoob"); ~~~ ##### replace() 方法使用正則表達式 ~~~ var str = document.getElementById("demo").innerHTML; var txt = str.replace(/microsoft/i,"Runoob"); ~~~ ##### replace() 方法使用字符串 ~~~ var str = document.getElementById("demo").innerHTML; var txt = str.replace("Microsoft","Runoob"); ~~~ ##### 正則表達式修飾符 **修飾符** 可以在全局搜索中不區分大小寫: | 修飾符 | 描述 | | --- | --- | | i | 執行對大小寫不敏感的匹配。 | | g | 執行全局匹配(查找所有匹配而非在找到第一個匹配后停止)。 | | m | 執行多行匹配。 | ##### 正則表達式模式 方括號用于查找某個范圍內的字符: | 表達式 | 描述 | | --- | --- | | \[abc\] | 查找方括號之間的任何字符。 | | \[0-9\] | 查找任何從 0 至 9 的數字。 | | (x|y) | 查找任何以 | 分隔的選項。 | 元字符是擁有特殊含義的字符: | 元字符 | 描述 | | --- | --- | | \\d | 查找數字。 | | \\s | 查找空白字符。 | | \\b | 匹配單詞邊界。 | | \\uxxxx | 查找以十六進制數 xxxx 規定的 Unicode 字符。 | 量詞: | 量詞 | 描述 | | --- | --- | | n+ | 匹配任何包含至少一個 *n* 的字符串。 | | n\* | 匹配任何包含零個或多個 *n* 的字符串。 | | n? | 匹配任何包含零個或一個 *n* 的字符串。 | #### 3.13 拋出錯誤(throw) ##### JavaScript try 和 catch **try** 語句允許我們定義在執行時進行錯誤測試的代碼塊。 **catch** 語句允許我們定義當 try 代碼塊發生錯誤時,所執行的代碼塊。 JavaScript 語句 **try** 和 **catch** 是成對出現的。 ~~~ try { ... //異常的拋出 } catch(e) { ... //異常的捕獲與處理 } finally { ... //結束處理 } ~~~ ##### finally 語句 ~~~ function myFunction() { var message, x; message = document.getElementById("p01"); message.innerHTML = ""; x = document.getElementById("demo").value; try { if(x == "") throw "值是空的"; if(isNaN(x)) throw "值不是一個數字"; x = Number(x); if(x > 10) throw "太大"; if(x < 5) throw "太小"; } catch(err) { message.innerHTML = "錯誤: " + err + "."; } finally { document.getElementById("demo").value = ""; } } ~~~ #### 3.14 this關鍵字 面向對象語言中 this 表示當前對象的一個引用。 但在 JavaScript 中 this 不是固定不變的,它會隨著執行環境的改變而改變。 * 在方法中,this 表示該方法所屬的對象。 * 如果單獨使用,this 表示全局對象。 * 在函數中,this 表示全局對象。 * 在函數中,在嚴格模式下,this 是未定義的(undefined)。 * 在事件中,this 表示接收事件的元素。 * 類似 call() 和 apply() 方法可以將 this 引用到任何對象。 ~~~ var person = { firstName: "John", lastName : "Doe", id : 5566, fullName : function() { return this.firstName + " " + this.lastName; } }; ~~~ 在對象方法中, this 指向調用它所在方法的對象。 在上面一個實例中,this 表示 person 對象。 fullName 方法所屬的對象就是 person。 ~~~ fullName : function() { return this.firstName + " " + this.lastName; } ~~~ 單獨使用 this,則它指向全局(Global)對象。 在瀏覽器中,window 就是該全局對象為 \[**object Window**\]: ~~~ var x = this; ~~~ 在函數中,函數的所屬者默認綁定到 this 上。 在瀏覽器中,window 就是該全局對象為 \[**object Window**\]: ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <h2>JavaScript <b>this</b> 關鍵字</h2> <p>實例中,<b>this</b> 表示 myFunction 函數的所有者:</p> <p id="demo"></p> <script> document.getElementById("demo").innerHTML = myFunction(); function myFunction() { return this; } </script> </body> </html> ~~~ 在 HTML 事件句柄中,this 指向了接收事件的 HTML 元素: ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>教程</title> </head> <body> <h2>JavaScript <b>this</b> 關鍵字</h2> <button onclick="this.style.display='none'">點我后我就消失了</button> </body> </html> ~~~ #### 3.15 JSON * JSON 英文全稱 **J**ava**S**cript **O**bject **N**otation * JSON 是一種輕量級的數據交換格式。 * JSON是獨立的語言 **\*** * JSON 易于理解。 ~~~ {"sites":[ {"name":"Runoob", "url":"www.runoob.com"}, {"name":"Google", "url":"www.google.com"}, {"name":"Taobao", "url":"www.taobao.com"} ]} ~~~ ##### JSON 對象 JSON 對象保存在大括號內。 就像在 JavaScript 中, 對象可以保存多個 鍵/值 對: ~~~ {"name":"Runoob", "url":"www.baidu.com"} ~~~ ##### javascript:void(0) 我們經常會使用到 javascript:void(0) 這樣的代碼,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢? javascript:void(0) 中最關鍵的是 **void** 關鍵字, **void** 是 JavaScript 中非常重要的關鍵字,該操作符指定要計算一個表達式但是不返回值。 下面的函數(方法)沒有return(沒有返回值)。 ~~~ function getValue(){ var a,b,c; a = void ( b = 5, c = 7 ); document.write('a = ' + a + ' b = ' + b +' c = ' + c ); } ~~~ #### 3.16 異步 異步(Asynchronous, async)是與同步(Synchronous, sync)相對的概念。 在我們學習的傳統單線程編程中,程序的運行是同步的(同步不意味著所有步驟同時運行,而是指步驟在一個控制流序列中按順序執行)。而異步的概念則是不保證同步的概念,也就是說,一個異步過程的執行將不再與原有的序列有順序關系。 簡單來理解就是:同步按你的代碼順序執行,異步不按照代碼順序執行,異步的執行效率更高。 以上是關于異步的概念的解釋,接下來我們通俗地解釋一下異步:異步就是從主線程發射一個子線程來完成任務。 ![](https://www.runoob.com/wp-content/uploads/2020/07/async-sync.png) ##### 異步 AJAX Ajax 的核心是 XMLHttpRequest 對象。 除了 setTimeout 函數以外,異步回調廣泛應用于 AJAX 編程。 ~~~ var xhr = new XMLHttpRequest(); xhr.onload = function () { // 輸出接收到的文字數據 document.getElementById("demo").innerHTML=xhr.responseText; } xhr.onerror = function () { document.getElementById("demo").innerHTML="請求出錯"; } // 發送異步 GET 請求 xhr.open("GET", "https://www.abc.com/try/ajax/ajax_info.txt", true); xhr.send(); ~~~ AJAX - 向服務器發送請求 如需向服務器發送請求,我們使用 XMLHttpRequest 對象的 open() 和 send() 方法: ~~~ xhttp.open("GET", "ajax_info.txt", true); xhttp.send(); ~~~ | 方法 | 描述 | | --- | --- | | open(*method*, *url*, *async*) | 規定請求的類型*method*:請求的類型:GET 還是 POST*url*:服務器(文件)位置*async*:true(異步)或 false(同步) | | send() | 向服務器發送請求(用于 GET) | | send(*string*) | 向服務器發送請求(用于 POST) | AJAX - 服務器響應 onreadystatechange 屬性 readyState 屬性存留 XMLHttpRequest 的狀態。 onreadystatechange 屬性定義當 readyState 發生變化時執行的函數。 status 屬性和 statusText 屬性存有 XMLHttpRequest 對象的狀態。 | 屬性 | 描述 | | --- | --- | | onreadystatechange | 定義了當 readyState 屬性發生改變時所調用的函數。 | | readyState | 保存了 XMLHttpRequest 的狀態。0: 請求未初始化1: 服務器連接已建立2: 請求已接收3: 正在處理請求4: 請求已完成且響應已就緒 | | status | 200: "OK"403: "Forbidden"404: "Page not found" | | statusText | 返回狀態文本(例如 "OK" 或 "Not Found") | 每當 readyState 發生變化時就會調用 onreadystatechange 函數。 當 readyState 為 4,status 為 200 時,響應就緒: ~~~ function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("demo").innerHTML = this.responseText; } }; xhttp.open("GET", "ajax_info.txt", true); xhttp.send(); } ~~~ 服務器響應屬性 | 屬性 | 描述 | | --- | --- | | responseText | 獲取字符串形式的響應數據 | | responseXML | 獲取 XML 數據形式的響應數據 | 服務器響應方法 | 方法 | 描述 | | --- | --- | | getResponseHeader() | 從服務器返回特定的頭部信息 | | getAllResponseHeaders() | 從服務器返回所有頭部信息 |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看