DOM(Document Object Model 文檔對(duì)象模型)是W3C的標(biāo)準(zhǔn),是所有瀏覽器公共遵守的標(biāo)準(zhǔn)。
DOM的設(shè)計(jì)是以對(duì)象管理組織(OMG)的規(guī)約為基礎(chǔ)的,因此可以用于任何編程語言。最初人們把它認(rèn)為是一種讓JavaScript在瀏覽器間可移植的方法,不過DOM的應(yīng)用已經(jīng)遠(yuǎn)遠(yuǎn)超出這個(gè)范圍。
DOM定義了訪問 HTML 和 XML 文檔的標(biāo)準(zhǔn),是HTML和XML的應(yīng)用程序接口(API),它允許程序和腳本動(dòng)態(tài)地訪問和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式。Dom技術(shù)使得用戶頁面可以動(dòng)態(tài)地變化,如可以動(dòng)態(tài)地顯示或隱藏一個(gè)元素,改變它們的屬性,增加一個(gè)元素等,Dom技術(shù)使得頁面的交互性大大地增強(qiáng)。
當(dāng)網(wǎng)頁被加載時(shí),瀏覽器會(huì)創(chuàng)建頁面的文檔對(duì)象模型(Document Object Model)。HTML DOM 模型被構(gòu)造為對(duì)象的樹,這種結(jié)構(gòu)被稱為節(jié)點(diǎn)樹:
通過 HTML DOM,樹中的所有節(jié)點(diǎn)均可通過 JavaScript 進(jìn)行訪問。所有 HTML 元素(節(jié)點(diǎn))均可被修改,也可以創(chuàng)建或刪除節(jié)點(diǎn)。
節(jié)點(diǎn)父、子和同胞
節(jié)點(diǎn)樹中的節(jié)點(diǎn)彼此擁有層級(jí)關(guān)系。
父(parent)、子(child)和同胞(sibling)等術(shù)語用于描述這些關(guān)系。父節(jié)點(diǎn)擁有子節(jié)點(diǎn)。同級(jí)的子節(jié)點(diǎn)被稱為同胞(兄弟或姐妹)。
在節(jié)點(diǎn)樹中,頂端節(jié)點(diǎn)被稱為根(root)
每個(gè)節(jié)點(diǎn)都有父節(jié)點(diǎn)、除了根(它沒有父節(jié)點(diǎn))
一個(gè)節(jié)點(diǎn)可擁有任意數(shù)量的子
同胞是擁有相同父節(jié)點(diǎn)的節(jié)點(diǎn)
下面的圖片展示了節(jié)點(diǎn)樹的一部分,以及節(jié)點(diǎn)之間的關(guān)系:
編程接口
可通過 JavaScript (以及其他編程語言)對(duì) HTML DOM 進(jìn)行訪問。所有 HTML 元素被定義為對(duì)象,而編程接口則是對(duì)象方法和對(duì)象屬性。
當(dāng)瀏覽器載入 HTML 文檔, 它就會(huì)成為 document 對(duì)象。document 對(duì)象是HTML文檔的根節(jié)點(diǎn)與所有其他節(jié)點(diǎn)(元素節(jié)點(diǎn),文本節(jié)點(diǎn),屬性節(jié)點(diǎn), 注釋節(jié)點(diǎn))。Document 對(duì)象使我們可以從腳本中對(duì) HTML 頁面中的所有元素進(jìn)行訪問。提示:Document 對(duì)象是 Window 對(duì)象的一部分,可通過 window.document 屬性對(duì)其進(jìn)行訪問。
document.activeElement 屬性返回文檔中當(dāng)前獲得焦點(diǎn)的元素
document.addEventListener() 函數(shù)用于向文檔添加事件句柄
document.adoptNode(node) 函數(shù)從另外一個(gè)文檔返回 adapded 節(jié)點(diǎn)到當(dāng)前文檔
document.anchors 屬性集合返回了當(dāng)前頁面的所有超級(jí)鏈接數(shù)組
document.applets返回對(duì)文檔中所有 Applet 對(duì)象的引用
document.baseURI 屬性返回 HTML 文檔的基礎(chǔ)URI
document.body 屬性返回文檔的body元素
document.close()用于關(guān)閉瀏覽器窗口
document.cookie 屬性返回當(dāng)前文檔所有 鍵/值 對(duì)的所有 cookies
document.createAttribute() 函數(shù)用于創(chuàng)建一個(gè)指定名稱的屬性,并返回Attr 對(duì)象屬性
document.createComment() 函數(shù)可創(chuàng)建注釋節(jié)點(diǎn)
document.createDocumentFragment() 函數(shù)創(chuàng)建了一虛擬的節(jié)點(diǎn)對(duì)象,節(jié)點(diǎn)對(duì)象包含所有屬性和方法
document.createElement() 函數(shù)通過指定名稱創(chuàng)建一個(gè)元素
document.createTextNode() 函數(shù)可創(chuàng)建文本節(jié)點(diǎn)
document.doctype 屬性可返回與文檔相關(guān)的文檔類型聲明(Document Type Declaration)
document.documentElement 屬性以一個(gè)元素對(duì)象返回一個(gè)文檔的文檔元素
document.documentMode 屬性返回瀏覽器渲染文檔的模式
document.documentURI 屬性可設(shè)置或返回文檔的位置
document.domain 屬性可返回下載當(dāng)前文檔的服務(wù)器域
document.domConfig 屬性 返回normalizeDocument()被調(diào)用時(shí)所使用的配置
document.embeds 集合 返回文檔中所有嵌入的內(nèi)容(embed)集合
document.forms 集合返回當(dāng)前頁面所有表單的數(shù)組集合
document. getElementsByClassName() 函數(shù)返回文檔中所有指定類名的元素集合,作為 NodeList 對(duì)象
document.getElementById() 函數(shù)可返回對(duì)擁有指定 ID 的第一個(gè)對(duì)象的引用
document.getElementsByName() 函數(shù)可返回帶有指定名稱的對(duì)象的集合
document.getElementsByTagName() 函數(shù)可返回帶有指定標(biāo)簽名的對(duì)象的集合
document.images 集合返回當(dāng)前文檔中所有圖片的數(shù)組
document.implementation 屬性可返回處理該文檔的 DOMImplementation 對(duì)象
document.importNode() 函數(shù)把一個(gè)節(jié)點(diǎn)從另一個(gè)文檔復(fù)制到該文檔以便應(yīng)用
document.inputEncoding 屬性可返回文檔的編碼(在解析時(shí))
document.lastModified 屬性可返回文檔最后被修改的日期和時(shí)間
document.links 集合返回當(dāng)期文檔所有鏈接的數(shù)組
document.normalize() 函數(shù)合并相鄰的文本節(jié)點(diǎn)并刪除空的文本節(jié)點(diǎn)
document.normalizeDocument() 函數(shù)可以移除空文本節(jié)點(diǎn) , 并合并相鄰節(jié)點(diǎn)
document.open() 函數(shù)打開一個(gè)輸出流來收集 document.write() 或 document.writeln() 方法輸出的內(nèi)容
document.querySelector() 函數(shù)返回文檔中匹配指定 CSS 選擇器的一個(gè)元素
document.querySelectorAll() 函數(shù) document.querySelectorAll() 是 HTML5中引入的新方法,返回文檔中匹配的CSS選擇器的所有元素節(jié)點(diǎn)列表
document.readyState 屬性返回當(dāng)前文檔的狀態(tài)(載入中……)
document.referrer 屬性返回載入當(dāng)前文檔的來源文檔的URL
document.removeEventListener() 函數(shù)用于移除由 document.addEventListener() 方法添加的事件句柄
document.scripts 集合返回頁面中所有腳本的集合
document.strictErrorChecking 屬性可設(shè)置或返回是否強(qiáng)制進(jìn)行錯(cuò)誤檢查(error-checking)
document.title 屬性可返回當(dāng)前文檔的標(biāo)題( HTML title 元素中的文本)
document.URL 屬性可返回當(dāng)前文檔的 URL
document.write() 函數(shù)可向文檔寫入 HTML 表達(dá)式或 JavaScript 代碼
document.writeln() 函數(shù)與 write() 方法作用相同,外加可在每個(gè)表達(dá)式后寫一個(gè)換行符
在 HTML DOM 中, 元素對(duì)象代表著一個(gè) HTML 元素。元素對(duì)象 的 子節(jié)點(diǎn)可以是, 可以是元素節(jié)點(diǎn),文本節(jié)點(diǎn),注釋節(jié)點(diǎn)。NodeList 對(duì)象 代表了節(jié)點(diǎn)列表,類似于 HTML元素的子節(jié)點(diǎn)集合。所有主流瀏覽器都支持元素對(duì)象和NodeList 對(duì)象。
element.accessKey 屬性可設(shè)置或返回訪問單選按鈕的快捷鍵
element.addEventListener() 函數(shù)用于向指定元素添加事件句柄
element.appendChild() 函數(shù)http://techbrood.com/jsref?p=met-node-appendchild
element.attributes 屬性返回指定節(jié)點(diǎn)屬性的集合
element.childNodes 屬性返回包含被選節(jié)點(diǎn)的子節(jié)點(diǎn)的 NodeList
element.classlist 屬性返回元素的類名,作為 DOMTokenList 對(duì)象
element.className 屬性設(shè)置或返回元素的 class 屬性
element.clientHeight 屬性在頁面上返回內(nèi)容的可視高度(不包括邊框,邊距或滾動(dòng)條)
element.clientWidth 屬性在頁面上返回內(nèi)容的可視寬度(不包括邊框,邊距或滾動(dòng)條)
element.cloneNode() 函數(shù)可創(chuàng)建指定的節(jié)點(diǎn)的精確拷貝,拷貝所有屬性和值,該方法將復(fù)制并返回調(diào)用它的節(jié)點(diǎn)的副本。如果傳遞給它的參數(shù)是 true,它還將遞歸復(fù)制當(dāng)前節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)。否則,它只復(fù)制當(dāng)前節(jié)點(diǎn)。
element.compareDocumentPosition() 函數(shù)按照文檔順序,比較當(dāng)前節(jié)點(diǎn)與指定節(jié)點(diǎn)的文檔位置
element.contentEditable 屬性用于設(shè)置或返回元素的內(nèi)容是否可編輯
element.dir 屬性設(shè)置或返回元素的文字方向
element.firstChild 屬性返回被選節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn),如果選定的節(jié)點(diǎn)沒有子節(jié)點(diǎn)則該屬性返回NULL
element.focus() 函數(shù)用于為元素設(shè)置焦點(diǎn)(如果可以設(shè)置)
element.getAttribute() 函數(shù)通過名稱獲取屬性的值
element.getAttributeNode() 函數(shù)從當(dāng)前元素中通過名稱獲取屬性節(jié)點(diǎn)
element.getElementsByTagName() 函數(shù)可返回帶有指定標(biāo)簽名的對(duì)象的集合
element. getElementsByClassName() 函數(shù)返回文檔中所有指定類名的元素集合,作為 NodeList 對(duì)象
element.getFeature() 函數(shù)返回指定特征的執(zhí)行APIs對(duì)象
element.getUserData() 函數(shù)返回一個(gè)元素中關(guān)聯(lián)鍵值的對(duì)象
element.hasAttribute() 函數(shù)通過名稱獲取屬性的值
element.hasAttributes() 函數(shù)如果某節(jié)點(diǎn)有任何屬性時(shí)返回 true,否則返回 false
element.hasChildNodes() 函數(shù)可在某節(jié)點(diǎn)用于任何子節(jié)點(diǎn)時(shí)返回 true,否則返回 fals
element.hasfocus() 函數(shù)返回布爾值,用于檢測文檔(或文檔內(nèi)的任一元素)是否獲取焦點(diǎn)
element.id 屬性設(shè)置或者發(fā)回元素的id
element.innerHTML 屬性設(shè)置或返回表格行的開始和結(jié)束標(biāo)簽之間的 HTML
element.insertBefore() 函數(shù)可在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn)
element.isContentEditable 屬性返回元素的內(nèi)容是否可編輯
element.isDefaultNamespace() 函數(shù)如果指定的命名空間是默認(rèn)的 ,isDefaultNamespace() 方法返回 true,否則返回 false
element.isEqualNode() 函數(shù)用于檢查兩個(gè)節(jié)點(diǎn)是否相等
element.isSameNode() 函數(shù)可在某個(gè)節(jié)點(diǎn)與給定的節(jié)點(diǎn)是同一個(gè)節(jié)點(diǎn)時(shí)返回 true,否則返回 false
element.isSupported() 函數(shù)用于判斷當(dāng)前節(jié)點(diǎn)是否支持某個(gè)特性
element.lang 屬性設(shè)置或返回元素的語言
element.lastChild 屬性可返回文檔的最后一個(gè)子節(jié)點(diǎn)
element.namespaceURI 屬性為被選節(jié)點(diǎn)返回命名空間的 URI
element.nextSibling 屬性可返回某個(gè)元素之后緊跟的元素(處于同一樹層級(jí)中)
element.nodeName 屬性可依據(jù)節(jié)點(diǎn)的類型返回其名稱
element.nodeType 屬性屬性返回節(jié)點(diǎn)類型
element.nodeValue 屬性根據(jù)節(jié)點(diǎn)的類型設(shè)置或返回節(jié)點(diǎn)的值
element.normalize() 函數(shù)合并相鄰的文本節(jié)點(diǎn)并刪除空的文本節(jié)點(diǎn)
element.offsetHeight 屬性返回任何一個(gè)元素的高度包括邊框和填充,但不是邊距
element.offsetWidth 屬性返回元素的寬度,包括邊框和填充,但不是邊距
element.offsetLeft 屬性返回當(dāng)前元素的相對(duì)水平偏移位置的偏移容器
element.offsetParent 屬性返回元素的偏移容器
element.offsetTop 屬性返回當(dāng)前元素的相對(duì)垂直偏移位置的偏移容器
element.ownerDocument 屬性可返回某元素的根元素
element.parentNode 屬性可返回某節(jié)點(diǎn)的父節(jié)點(diǎn)
element.previousSibling 屬性可返回某節(jié)點(diǎn)之前緊跟的節(jié)點(diǎn)(處于同一樹層級(jí))
element.querySelector() 函數(shù)返回匹配指定 CSS 選擇器元素的第一個(gè)子元素
document.querySelectorAll() 函數(shù)返回匹配指定 CSS 選擇器元素的所有子元素節(jié)點(diǎn)列表
element.removeAttribute() 函數(shù)刪除指定的屬性
element.removeAttributeNode() 函數(shù)從元素中刪除指定的屬性節(jié)點(diǎn)
element.removeChild() 函數(shù)可從子節(jié)點(diǎn)列表中刪除某個(gè)節(jié)點(diǎn)
element.removeEventListener() 函數(shù)用于移除由 addEventListener() 方法添加的事件句柄
element.replaceChild() 函數(shù)可將某個(gè)子節(jié)點(diǎn)替換為另一個(gè),新節(jié)點(diǎn)可以是文本中已存在的,或者是你新創(chuàng)建的
element.scrollHeight 屬性返回整個(gè)元素的高度(包括帶滾動(dòng)條的隱蔽的地方)
element.scrollLeft 屬性返回當(dāng)前視圖中的實(shí)際元素的左邊緣和左邊緣之間的距離
element.scrollTop 屬性返回當(dāng)前視圖中的實(shí)際元素的頂部邊緣和頂部邊緣之間的距離
element.scrollWidth 屬性返回元素的整個(gè)寬度(包括帶滾動(dòng)條的隱蔽的地方)
element.setAttribute() 函數(shù)創(chuàng)建或改變某個(gè)新屬性,如果指定屬性已經(jīng)存在,則只設(shè)置該值
element.setAttributeNode() 函數(shù)用于添加新的屬性節(jié)點(diǎn)
element.setIdAttribute() 函數(shù)
element.setIdAttributeNode() 函數(shù)
element.setUserData() 函數(shù)在元素中為指定鍵值關(guān)聯(lián)對(duì)象
element.style 屬性設(shè)置或返回元素的樣式屬性
element.tabIndex 屬性可設(shè)置或返回單選按鈕的 tab 鍵控制次序
element.tagName 屬性返回元素的標(biāo)簽名
element.textContent 屬性設(shè)置或者返回指定節(jié)點(diǎn)的文本內(nèi)容
element.title 屬性設(shè)置或返回元素的標(biāo)題
element.toString() 函數(shù) 一個(gè)元素轉(zhuǎn)換成字符串
nodelist.item() 函數(shù)返回一個(gè)節(jié)點(diǎn)列表中指定索引的節(jié)點(diǎn)
nodelist.length 屬性返回節(jié)點(diǎn)集合的數(shù)目
在 HTML DOM 中, Attr 對(duì)象 代表一個(gè) HTML 屬性。所有主流瀏覽器都支持 Attr 對(duì)象和 NamedNodeMap 對(duì)象 (在HTML DOM中, NamedNodeMap對(duì)象表示一個(gè)無順序的節(jié)點(diǎn)列表, 我們可通過節(jié)點(diǎn)名稱來訪問 NamedNodeMap 中的節(jié)點(diǎn))
attr.isId 屬性如果屬性是 ID 類型(例如,包含了其所屬的元素的標(biāo)識(shí)符),則 isId 屬性返回 true,否則返回 false
name 屬性返回屬性名稱
value 屬性用于設(shè)置或者返回屬性的值。
specified 屬性如果在文檔中設(shè)置了屬性值,則specified屬性返回 true,如果是 DTD/Schema 中的默認(rèn)值,則返回 false
length 屬性可返回集合中節(jié)點(diǎn)的選項(xiàng)數(shù)目
getNamedItem() 函數(shù)返回節(jié)點(diǎn)列表中指定屬性名的值
item() 函數(shù)可返回節(jié)點(diǎn)列表中處于指定索引號(hào)的節(jié)點(diǎn)
removeNamedItem() 函數(shù)可刪除指定的節(jié)點(diǎn)
setNamedItem() 函數(shù)用于添加指定節(jié)點(diǎn)。如果節(jié)點(diǎn)已經(jīng)存在,它將被替換,并返回替換節(jié)點(diǎn)的值,否則將返回 null。
事件允許Javascript在HTML文檔元素中注冊不同事件處理程序。事件通常與函數(shù)結(jié)合使用,函數(shù)不會(huì)在事件發(fā)生前被執(zhí)行!
鼠標(biāo)事件
onclick事件會(huì)在元素被點(diǎn)擊時(shí)發(fā)生
oncontextmenu事件在元素中用戶右擊鼠標(biāo)時(shí)觸發(fā)并打開上下文菜單
ondblclick事件會(huì)在對(duì)象被雙擊時(shí)發(fā)生
onmousedown事件會(huì)在鼠標(biāo)按鍵被按下時(shí)發(fā)生。
onmouseenter事件在鼠標(biāo)指針移動(dòng)到元素上時(shí)觸發(fā)
onmouseleave事件在鼠標(biāo)移除元素時(shí)觸發(fā)
onmousemove事件會(huì)在鼠標(biāo)指針移出指定的對(duì)象時(shí)發(fā)生
onmouseover事件會(huì)在鼠標(biāo)指針移動(dòng)到指定的元素上時(shí)發(fā)生
onmouseout事件會(huì)在鼠標(biāo)指針移出指定的對(duì)象時(shí)發(fā)生
onmouseup事件會(huì)在鼠標(biāo)按鍵被松開時(shí)發(fā)生
鍵盤事件
onkeydown事件會(huì)在用戶按下一個(gè)鍵盤按鍵時(shí)發(fā)生
onkeypress事件會(huì)在鍵盤按鍵被按下并釋放一個(gè)鍵時(shí)發(fā)生
onkeyup事件會(huì)在鍵盤按鍵被松開時(shí)發(fā)生
框架/對(duì)象(Frame/Object)事件
onabort事件在用戶中止加載 或提交元素時(shí)觸發(fā)
onbeforeunload事件在即將離開當(dāng)前頁面(刷新或關(guān)閉)時(shí)觸發(fā)
onerror事件在加載外部文件(文檔或圖像)發(fā)生錯(cuò)誤時(shí)觸發(fā)
onhashchange事件在當(dāng)前 URL 的錨部分(以 '#' 號(hào)為開始) 發(fā)生改變時(shí)觸發(fā)
onload事件會(huì)在頁面或圖像加載完成后立即發(fā)生
onpageshow事件在用戶瀏覽網(wǎng)頁時(shí)觸發(fā)
onpagehide事件在用戶離開網(wǎng)頁時(shí)觸發(fā)
onresize事件會(huì)在窗口或框架被調(diào)整大小時(shí)發(fā)生
onscroll事件在元素滾動(dòng)條在滾動(dòng)時(shí)觸發(fā)
onunload事件在用戶退出頁面時(shí)發(fā)生
表單事件
onblur事件會(huì)在對(duì)象失去焦點(diǎn)時(shí)發(fā)生
onchange事件會(huì)在域的內(nèi)容改變時(shí)發(fā)生
onfocus事件在對(duì)象獲得焦點(diǎn)時(shí)發(fā)生
onfocusin事件在一個(gè)元素即將獲得焦點(diǎn)時(shí)觸發(fā)
onfocusout事件在元素即將失去焦點(diǎn)時(shí)觸發(fā)
oninput事件在用戶輸入時(shí)觸發(fā)
onreset事件在表單被重置后觸發(fā)
onsearch事件在用戶按下"ENTER(回車)" 按鍵或點(diǎn)擊 type="search" 的 元素的 "x(搜索)" 按鈕時(shí)觸發(fā)
onselect事件會(huì)在文本框中的文本被選中時(shí)發(fā)生
onsubmit事件在表單提交時(shí)觸發(fā)
剪貼板事件
oncopy事件在用戶拷貝元素上的內(nèi)容時(shí)觸發(fā)
oncut事件在用戶剪切元素的內(nèi)容時(shí)觸發(fā)
onpaste事件在用戶向元素中粘貼文本時(shí)觸發(fā)
打印事件
onafterprint事件在頁面打印后觸發(fā),或者打印對(duì)話框已經(jīng)關(guān)閉
onbeforeprint事件在頁面即將打印時(shí)觸發(fā) (在打印窗口出現(xiàn)前
拖動(dòng)事件
ondrag事件在元素或者選取的文本被拖動(dòng)時(shí)觸發(fā)
ondragend事件在用戶完成元素或首選文本的拖動(dòng)時(shí)觸發(fā)
ondragenter事件在拖動(dòng)的元素或選擇的文本進(jìn)入到有效的放置目標(biāo)時(shí)觸發(fā)
ondragleave事件在可拖動(dòng)的元素或選取的文本移出放置目標(biāo)時(shí)執(zhí)觸發(fā)
ondragover事件在可拖動(dòng)元素或選取的文本正在拖動(dòng)到放置目標(biāo)時(shí)觸發(fā)
ondragstart事件在用戶開始拖動(dòng)元素或選擇的文本時(shí)觸發(fā)
ondrop事件在可拖動(dòng)元素或選取的文本放置在目標(biāo)區(qū)域時(shí)觸發(fā)
多媒體(Media)事件
onabort事件在視頻/音頻(audio/video)終止加載時(shí)觸
oncanplay事件在用戶可以開始播放視頻/音頻(audio/video)時(shí)觸發(fā)。
oncanplaythrough事件在視頻/音頻(audio/video)可以正常播放且無需停頓和緩沖時(shí)觸發(fā)
ondurationchange事件在視頻/音頻(audio/video)的時(shí)長發(fā)生變化時(shí)觸發(fā)
onemptied當(dāng)期播放列表為空時(shí)觸發(fā)
onended事件在視頻/音頻(audio/video)播放結(jié)束時(shí)觸發(fā)
onerror事件在視頻/音頻(audio/video)數(shù)據(jù)加載期間發(fā)生錯(cuò)誤時(shí)觸發(fā)
onloadeddata事件在當(dāng)前幀的數(shù)據(jù)加載完成且還沒有足夠的數(shù)據(jù)播放視頻/音頻(audio/video)的下一幀時(shí)觸發(fā)
onloadedmetadata事件在指定視頻/音頻(audio/video)的元數(shù)據(jù)加載后觸發(fā)
onloadstart事件在瀏覽器開始尋找指定視頻/音頻(audio/video)觸發(fā)
onpause事件在視頻/音頻(audio/video)暫停時(shí)觸發(fā)
onplay事件在視頻/音頻(audio/video)開始播放時(shí)觸發(fā)
onplaying事件在視頻/音頻(audio/video)暫停或者在緩沖后準(zhǔn)備重新開始播放時(shí)觸發(fā)
onprogress事件在瀏覽器下載指定的視頻/音頻(audio/video)時(shí)觸發(fā)
onratechange事件在視頻/音頻(audio/video)的播放速度發(fā)生改變時(shí)觸發(fā)
onseeked事件在用戶重新定位視頻/音頻(audio/video)的播放位置后觸發(fā)
onseeking事件在用戶開始重新定位視頻/音頻(audio/video)時(shí)觸發(fā)
onstalled事件在瀏覽器獲取媒體數(shù)據(jù),但媒體數(shù)據(jù)不可用時(shí)觸發(fā)
onsuspend事件在瀏覽器讀取媒體數(shù)據(jù)中止時(shí)觸發(fā)
ontimeupdate事件在視頻/音頻(audio/video)當(dāng)前的播放位置發(fā)送改變時(shí)觸發(fā)
onvolumechangehttp://techbrood.com/jsref?p=event-onvolumechange
onwaiting事件在視頻由于要播放下一幀而需要緩沖時(shí)觸發(fā)
動(dòng)畫事件
animationend事件在 CSS 動(dòng)畫完成后觸發(fā)
animationiteration事件在 CSS 動(dòng)畫重新播放時(shí)觸發(fā)
animationstart事件在 CSS 動(dòng)畫開始播放時(shí)觸發(fā)
過渡事件
transitionend事件在 CSS 完成過渡后觸發(fā)
其他事件
onmessage該事件通過或者從對(duì)象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息時(shí)觸發(fā)
ononline事件在瀏覽器開始在線工作時(shí)觸發(fā)
onoffline事件在瀏覽器離線工作時(shí)觸發(fā)
onpopstate該事件在窗口的瀏覽歷史(history 對(duì)象)發(fā)生改變時(shí)觸發(fā)
onshow事件當(dāng) <menu> 元素在上下文菜單顯示時(shí)觸發(fā)
onstorage該事件在 Web Storage(HTML 5 Web 存儲(chǔ))更新時(shí)觸發(fā)
ontoggle事件在用戶打開或關(guān)閉 &lgt;details> 元素時(shí)觸發(fā)
onwheel事件在鼠標(biāo)滾輪在元素上下滾動(dòng)時(shí)觸發(fā)
嘍,今天是一篇HTML to PDF速食指南。
Java 轉(zhuǎn)換 HTML 到PDF有許多類庫,今天我們介紹一下第三方免費(fèi)的類庫OpenPDF。
OpenPDF是免費(fèi)的Java類庫 ,遵從LGPL 和 MPL協(xié)議,所以基本上能夠可以隨意使用。OpenPDF是基于iTEXT的,目前來說也是維護(hù)的比較好的Java操作PDF的開源軟件。
話不多說,且看所需要的依賴,
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
<dependency>
<groupId>com.openhtmltopdf</groupId>
<artifactId>openhtmltopdf-core</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>com.openhtmltopdf</groupId>
<artifactId>openhtmltopdf-pdfbox</artifactId>
<version>1.0.6</version>
</dependency>
jsoup可以將html文件轉(zhuǎn)換成輸入流等,也可以遍歷html的DOM節(jié)點(diǎn),提取元素及樣式等。
本篇示例將以下html文件轉(zhuǎn)換成pdf
<html>
<head>
<style>
.center_div {
border: 1px solid #404e94;
margin-left: auto;
margin-right: auto;
background-color: #f6d0ed;
text-align: left;
padding: 8px;
}
table {
width: 100%;
border: 1px solid black;
}
th, td {
border: 1px solid black;
}
body,html,input{font-family:"msyh";}
</style>
</head>
<body>
<div class="center_div">
<h1>Hello java North!</h1>
<div>
<p>convert html to pdf.</p>
</div>
<div>
<table>
<thead>
<th>ROLE</th>
<th>NAME</th>
<th>TITLE</th>
</thead>
<tbody>
<tr>
<td>MARKSMAN</td>
<td>ASHE</td>
<td>THE FROST ARCHER</td>
</tr>
<tr>
<td>MAGES</td>
<td>ANNIE</td>
<td>THE DARK CHILD</td>
</tr>
<tr>
<td>射手</td>
<td>凱塔琳</td>
<td>皮城女警</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>
以上html用瀏覽器打開如下,亂碼是因?yàn)橹形淖煮w不識(shí)別,下面轉(zhuǎn)換的時(shí)候會(huì)加載對(duì)應(yīng)的字體來進(jìn)行轉(zhuǎn)換。
使用Java轉(zhuǎn)換HTML到PDF代碼如下:
public class HtmlToPDFOpenSource {
public static void main(String[] args) throws IOException {
HtmlToPDFOpenSource htmlToPDFOpenSource=new HtmlToPDFOpenSource();
htmlToPDFOpenSource.generatePdfByOpenhtmltopdf();
}
private void generatePdfByOpenhtmltopdf() throws IOException {
File inputHtml=new File("E:\\javaNorth\\java-study-note\\javaOpenSource\\src\\main\\resources\\test.html");
//加載html文件
Document document=Jsoup.parse(inputHtml, "UTF-8");
document.outputSettings().syntax(Document.OutputSettings.Syntax.html);
//引入資源目錄,可以單獨(dú)引入css,圖片文件等
String baseUri=FileSystems.getDefault()
.getPath("javaOpenSource\\src\\main\\resources")
.toUri().toString();
try (OutputStream os=new FileOutputStream("javaOpenSource\\src\\main\\resources\\testOpenLeagueoflegends1.pdf")) {
PdfRendererBuilder builder=new PdfRendererBuilder();
builder.withUri("javaOpenSource\\src\\main\\resources\\testOpenLeagueoflegends1.pdf");
builder.toStream(os);
builder.withW3cDocument(new W3CDom().fromJsoup(document), baseUri);
//引入指定字體,注意字體名需要和css樣式中指定的字體名相同
builder.useFont(new File("javaOpenSource\\src\\main\\resources\\fonts\\msyh.ttf"),"msyh",1,BaseRendererBuilder.FontStyle.NORMAL, true);
builder.run();
}
}
}
使用Java代碼轉(zhuǎn)換成PDF如下(示例中使用了微軟雅黑中文字體):
上述html文件中增加如下外部樣式:
<link href="style.css" rel="stylesheet">
并在resources目錄下添加style.css文件,重新生成PDF文件如下。
本片介紹了使用OpenPDF將html文件轉(zhuǎn)換成PDF文件。同時(shí)也使用了自定義字體,外部樣式。但是以下幾點(diǎn)需要格外注意。
全部示例在此:https://github.com/javatechnorth/java-study-note/tree/master/javaOpenSource/src/main/java/pdf
文章來源:Java技術(shù)指北
者 | Bruno Couriol
譯者 | 馬可薇
策劃 | 丁曉昀
AngularJS 的創(chuàng)造者M(jìn)isko Hevery近期宣布了新網(wǎng)絡(luò)框架Qwik測試版本的推出,聲稱無論應(yīng)用程序有多大,Qwik 都能夠快速地構(gòu)建。在多數(shù)情況下,Qwik 會(huì)先下載 1KB 的 JavaScript,在需要的時(shí)候才會(huì)懶加載或預(yù)處理程序和應(yīng)用程序代碼。
在一次名為《如何從主線程中移除99%的JavaScript》的演講中,Hevery 介紹了 Qwik 背后的原理。
Qwik 的目標(biāo)很簡單,確保復(fù)雜的網(wǎng)站也能在谷歌頁面速度評(píng)分項(xiàng)上拿到 100/100……歸根究底,就是要讓互動(dòng)時(shí)間盡可能地縮短。
如你所見,行業(yè)中的大多數(shù)框架都能在優(yōu)化圖片和 CSS 上做到盡善盡美,但 JavaScript 方面卻又乏善可陳。因?yàn)檫@對(duì)于互聯(lián)網(wǎng)上的每個(gè)人來說都是系統(tǒng)性的問題,我的意思是說,問題根源在于工具而不是開發(fā)者。
用于優(yōu)化 JavaScript 交付速度的工具是 Qwik 關(guān)注的問題。
Misko 將 JavaScript 在互動(dòng)時(shí)間指標(biāo)上負(fù)面的表現(xiàn)歸因于水合(Hydration)作用。水合在連接服務(wù)器的渲染時(shí)出現(xiàn)。服務(wù)器接收到客戶端對(duì)頁面的請(qǐng)求后,做出對(duì)應(yīng)查詢以填充界面,并將結(jié)果返回客戶端。雖然對(duì)用戶來說,服務(wù)器端的頁面渲染速度通常要比客戶端渲染的頁面要快(如更快的首次內(nèi)容繪制),但頁面卻并不是立即就可交互的,客戶端還需要下載并執(zhí)行頁面上的 JavaScript 腳本。
在多數(shù)框架中,這種首次交付的 HTML 與應(yīng)用程序的 JavaScript 協(xié)調(diào)的過程稱作水合。在水合過程中,Web 應(yīng)用程序框架將事件處理程序和 DOM 元素相連接,并初始化應(yīng)用程序狀態(tài)。水合之后用戶操作會(huì)被事件處理程序捕捉,從而使頁面可交互。
Qwik 保留了服務(wù)器端的渲染,通過在服務(wù)器上運(yùn)行應(yīng)用程序以避免水合。它將所有相關(guān)狀態(tài)信息序列化,將頁面內(nèi)容和序列化的狀態(tài)一起以 HTML 的形式發(fā)送給客戶端。這些相關(guān)的狀態(tài)信息包括時(shí)間監(jiān)聽器、內(nèi)部數(shù)據(jù)結(jié)構(gòu),以及應(yīng)用狀態(tài)。借助序列化的狀態(tài),客戶端可以接力完成服務(wù)器端沒有執(zhí)行完的任務(wù)。
處理交互性的 JavaScript 加載默認(rèn)是延遲進(jìn)行的,一般是直到用戶實(shí)際使用交互時(shí)才啟動(dòng),也就是說一個(gè)按鈕的事件處理程序最晚可以在用戶點(diǎn)擊按鈕時(shí)加載。這種即時(shí)的 JavaScript 獲取加上預(yù)取策略,利用瀏覽器的本地能力,在不影響頁面交互性的前提下完成了文件的加載。
在 Qwik 文檔中有詳細(xì)的介紹:
Qwik 只會(huì)預(yù)取當(dāng)前頁面需要的代碼,避免下載與靜態(tài)組件相關(guān)的代碼。最壞的情況是 Qwik 預(yù)取的代碼量與現(xiàn)有框架的最佳情況相同,而在大多數(shù)情況下,Qwik 所預(yù)取的代碼只會(huì)比現(xiàn)有框架要少。
除主線程之外的其他線程都可以做到代碼預(yù)取,大多數(shù)瀏覽器甚至支持主線程之外的代碼 AST 語法預(yù)分析。
如果用戶在預(yù)取完成之前開始交互,瀏覽器會(huì)自動(dòng)優(yōu)先交互模塊于其他預(yù)取模塊。
Qwik 可以將應(yīng)用程序分解成部分,這些分塊可以按照用戶交互的概率高低順序進(jìn)行下載。
Qwik 網(wǎng)站為開發(fā)者提供了教程、實(shí)例,以及學(xué)習(xí)和嘗試 Qwik 的在線運(yùn)行平臺(tái)。以簡單的計(jì)數(shù)器為例,由一個(gè)按鈕和顯示按鈕點(diǎn)擊次數(shù)的文本框組成,實(shí)現(xiàn)方法如下:
import { component$, useStore } from '@builder.io/qwik';
export const App=component$(()=> {
const store=useStore({ count: 0 });
return (
<div>
<p>Count: {store.count}</p>
<p>
<button onClick$={()=> store.count++}>Click</button>
</p>
</div>
);
});
開發(fā)者可以通過 Qwik 的component$ API 創(chuàng)建可恢復(fù)組件,有狀態(tài)的組件可以通過useStore API 顯示其對(duì)某段狀態(tài)的依賴。在處理程序的名字后附加$ 字符創(chuàng)建可恢復(fù)的事件處理程序(如前文例子中的onclick$ )。通過這些手動(dòng)添加的提示,Qwik 可以將應(yīng)用程序文件打包,以實(shí)現(xiàn)并優(yōu)化 JavaScript 的懶加載。前文的計(jì)數(shù)器程序在服務(wù)器端渲染的 HTML 如下:
<!DOCTYPE html>
<html
q:container="paused"
q:version="0.11.1"
q:render="ssr"
q:base="/repl/21kry8ac4hl/build/"
>
<html>
<head q:head>
<title q:head>Tutorial</title>
</head>
<body>
<!--qv q:id=0 q:key=AkbU84a8zes:-->
<div>
<p>
Count:
<!--t=1-->0<!---->
</p>
<p>
<button
on:click="app_component_div_p_button_onclick_8dwua0cjar4.js#App_component_div_p_button_onClick_8dWUa0cJAr4[0]"
q:id="2"
>
Click
</button>
</p>
</div>
<!--/qv-->
</body>
</html>
<script type="qwik/json">
{"ctx":{"#2":{"r":"0!"}},"objs":[{"count":"1"},0],"subs":[["2 #0 0 #1 data count"]]}
</script>
<script id="qwikloader">
((e,t)=>{const n="__q_context__",o=window,r=new Set,i=t=>e.querySelectorAll(t),s=(e,t,n=t.type)=>{i("[on"+e+"\\:"+n+"]").forEach((o=>l(o,e,t,n)))},a=(e,t)=>new CustomEvent(e,{detail:t}),c=(t,n)=>(t=t.closest("[q\\:container]"),new URL(n,new URL(t.getAttribute("q:base"),e.baseURI))),l=async(t,o,r,i=r.type)=>{const s="on"+o+":"+i;t.hasAttribute("preventdefault:"+i)&&r.preventDefault();const a=t._qc_,l=null==a?void 0:a.li.filter((e=>e[0]===s));if(l&&l.length>0){for(const e of l)await e[1].getFn([t,r],(()=>t.isConnected))(r,t);return}const d=t.getAttribute(s);if(d)for(const o of d.split("\n")){const i=c(t,o),s=b(i),a=performance.now(),l=u(await import(i.href.split("#")[0]),s),d=e[n];if(t.isConnected)try{e[n]=[t,r,i],f("qsymbol",{symbol:s,element:t,reqTime:a}),await l(r,t)}finally{e[n]=d}}},f=(t,n)=>{e.dispatchEvent(a(t,n))},u=(e,t)=>{if(t in e)return e[t];for(const n of Object.values(e))if("object"==typeof n&&n&&t in n)return n[t]},b=e=>e.hash.replace(/^#?([^?[|]*).*$/,"$1")||"default",d=e=>e.replace(/([A-Z])/g,(e=>"-"+e.toLowerCase())),p=async e=>{let t=d(e.type),n=e.target;for(s("-document",e,t);n&&n.getAttribute;)await l(n,"",e,t),n=e.bubbles&&!0!==e.cancelBubble?n.parentElement:null},v=e=>{s("-window",e,d(e.type))},w=()=>{var n;const s=e.readyState;if(!t&&("interactive"==s||"complete"==s)&&(t=1,f("qinit"),(null!=(n=o.requestIdleCallback)?n:o.setTimeout).bind(o)((()=>f("qidle"))),r.has("qvisible"))){const e=i("[on\\:qvisible]"),t=new IntersectionObserver((e=>{for(const n of e)n.isIntersecting&&(t.unobserve(n.target),l(n.target,"",a("qvisible",n)))}));e.forEach((e=>t.observe(e)))}},q=(e,t,n,o=!1)=>e.addEventListener(t,n,{capture:o}),y=t=>{for(const n of t)r.has(n)||(q(e,n,p,!0),q(o,n,v),r.add(n))};if(!e.qR){const t=o.qwikevents;Array.isArray(t)&&y(t),o.qwikevents={push:(...e)=>y(e)},q(e,"readystatechange",w),w()}})(document);
</script>
<script>
window.qwikevents.push("click")
</script>
</html>
注意,HTML 文件是通過以下方式強(qiáng)化的。
Qwik 的在線代碼運(yùn)行平臺(tái)可以讓開發(fā)者了解到程序代碼是如何被切割打包的,還是用前面的計(jì)數(shù)器為例,客戶端的打包方式如下:
如截圖所示,計(jì)數(shù)器的應(yīng)用程序被分成了三個(gè)腳本。當(dāng)用戶點(diǎn)擊按鈕時(shí),動(dòng)態(tài)下載并執(zhí)行其中兩個(gè)腳本(Qwik 運(yùn)行時(shí)間和 click 事件處理程序的代碼)。
參考Qwik文檔了解具體執(zhí)行情況以及代碼拆分的原理。Qwik 的網(wǎng)站給出了大量包括教程、示例,以及演示在內(nèi)的信息,還有一個(gè)可互動(dòng)的在線代碼運(yùn)行平臺(tái)。Qwik 社區(qū)中同樣也有一個(gè)非常簡單的電子商務(wù)示例,一般對(duì)電子商務(wù)的廠商來說,頁面加載速度提高收入也會(huì)增加。
Qwik 團(tuán)隊(duì)目前由 AngularJS 的創(chuàng)造者 Mi?ko Hevery、基于 Go 語言 Web 架構(gòu) Gin 的創(chuàng)造者 Manu Almeida、Web組件編譯器Stencil的創(chuàng)造者 Adam Bradley 組成。
目前,Qwik 已推出測試版,且采用 MIT 許可開源,歡迎各位在遵循 Qwik行為準(zhǔn)則的前提下貢獻(xiàn)代碼。
原文鏈接:
New Qwik JavaScript Framework Seeks Faster Web Apps with Unique Approach: Resumability
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。