整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          這里歸納總結(jié)全了:前端開發(fā)必須掌握的DOM對(duì)象操作

          這里歸納總結(jié)全了:前端開發(fā)必須掌握的DOM對(duì)象操作

          OM是什么

          • 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)。

          HTML DOM

          當(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ì)象屬性。

          HTML DOM Document 對(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 元素 (Element) 對(duì)象

          在 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ì)象

          在 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。

          HTML DOM 事件 (Event) 對(duì)象

          事件允許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。

          1. 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),提取元素及樣式等。

          2. 示例

          本篇示例將以下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文件如下。

          3. 總結(jié)

          本片介紹了使用OpenPDF將html文件轉(zhuǎn)換成PDF文件。同時(shí)也使用了自定義字體,外部樣式。但是以下幾點(diǎn)需要格外注意。

          • Java代碼中加載的字體名稱要和HTML引用的CSS樣式中的字體名相同 ({font-family:"msyh";})。
          • HTML文件標(biāo)簽節(jié)點(diǎn)必須閉合(<xxx></xxx>).否則解析會(huì)失敗。

          全部示例在此: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)化的。


          • q: 屬性,如q:baseq:idq:key
          • 包含特定框架信息的 HTML 注釋,如<!--qv q:id=0 q:key=AkbU84a8zes:-->
          • 序列化狀態(tài),如<script type="qwik/json"> {"ctx": ..., "objs":[{"count":"1"},0], "subs":[["2 #0 0 #1 data count"]]} </script>
          • 用于在客戶端恢復(fù)應(yīng)用程序執(zhí)行的 Qwik 腳本,如<script id="qwikloader"> ... </script>window.qwikevents.push("click")


          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


          主站蜘蛛池模板: 国产精品电影一区| 精品国产一区二区三区四区| 果冻传媒董小宛一区二区| 久久青草国产精品一区| 日本福利一区二区| 午夜影院一区二区| 日韩亚洲AV无码一区二区不卡| 波多野结衣中文字幕一区二区三区| 2020天堂中文字幕一区在线观| 自慰无码一区二区三区| 亚洲AV无码一区二区三区在线观看| 日本一道高清一区二区三区 | 精品国产毛片一区二区无码| 在线成人综合色一区| 3d动漫精品啪啪一区二区中文| 在线观看国产一区| 中文字幕精品无码一区二区| 久久国产香蕉一区精品| 国产成人一区在线不卡| 久久国产精品一区| 精品aⅴ一区二区三区| 国模无码人体一区二区| 中文字幕无码免费久久9一区9| 视频一区二区三区人妻系列| 一区二区三区免费看| 白丝爆浆18禁一区二区三区 | 日韩A无码AV一区二区三区| 精品人妻无码一区二区色欲产成人| 亚洲天堂一区二区三区| 精品无码成人片一区二区98| 亚洲Av永久无码精品一区二区| 亚洲av成人一区二区三区观看在线| 亚洲综合av一区二区三区不卡 | 国产美女av在线一区| 国产另类ts人妖一区二区三区| 久久免费视频一区| 色偷偷久久一区二区三区| 99久久精品午夜一区二区| 精品国产天堂综合一区在线| asmr国产一区在线| 另类一区二区三区|