This is a paragraph with a list following it.
- Item 1
- Item 2
- Item 3
摘要:對的兩個主要拓展是選擇和。以下插入標記的拓展已經納入了規范。在寫模式下,會根據指定的字符串創建新的子樹,然后用這個子樹完全替換調用元素。在刪除帶有時間處理程序或引用了其他對象子樹時,就有可能導致內存占用問題。
盡管DOM作為API已經非常完善了,但為了實現更多功能,仍然會有一些標準或專有的拓展。2008年之前,瀏覽器中幾乎所有的拓展都是專有的,此后W3C著手將一些已經成為事實標準的專有拓展標準化,并寫入規范中。
對DOM的兩個主要拓展是Selectors API (選擇API)和HTML5。這兩個拓展都源自開發社區,而將某些常見做啊及API標準化,一直是眾望所歸。
選擇符APIjQuery的核心就是通過CSS選擇符查詢DOM文檔取得元素的引用,從而拋開了getElementById() 和 gettElementByTagName()。
Selectors API 是又W3C發起制定的一個標準,致力于讓瀏覽器原生支持CSS查詢。所有實現這一功能的JavaScript庫都會寫一個基礎的CSS解析器,然后再使用已有的DOM方法查詢文檔并找到匹配的節點。而把這個功能變成原生API之后,解析和樹查詢操作可以在瀏覽器內部通過編譯后的代碼完成,極大改善了性能。
querySelector()方法querySelector()方法接收一個CSS選擇符,返回與該模式匹配的第一個元素,如果沒有找到匹配的元素,返回null。
// 取得body元素 var body = document.querySelector("body"); // 取得ID為“myDiv”的元素 var myDiv = document.querySelector("#myDiv"); // 取得類為"selected"的第一個元素 var selected = document.querySelector(".selected"); // 取得類為"button"的第一個圖像元素 var selected = document.querySelector("img.button");
如果傳入了不支持的選擇符,會拋出錯誤。
querySelectorAll()方法和上面類似,但返回的不僅僅是匹配的第一個元素,而是一個NodeList的實例,如果沒有匹配,NodeList就是空的。
// 取得某div中所有em元素 var ems = document.getElementById("myDiv").querySelectorAll("em"); // 取得類為“selected”的所有元素 var selected = document.querySelectorAll(".selected"); // 取得所有p元素中的所有strong元素 var strongs = document.querySelectorAll("p strong");
取得返回NodeList中的每一個元素,可以使用item()方法,也可以使用方括號語法。
matchesSelector()方法Selector API Level2 規范為Element類型新增了一個matchesSelector()方法。接收一個參數,即CSS選擇符,如果調用元素與該選擇符匹配返回true,否則返回false。
截止2011年年中,還沒有瀏覽器支持該方法,不過有一些實驗性的實現。因此如果你想使用這個方法,最好編寫一個包裝函數:
function matchesSelector(element, selector) { if (element.matchesSelecotr) { return element.matchesSelecotr(selector) } else if (element.msMatchesSelecotr) { return element.msMatchesSelecotr(selector) } else if (element.mozMatchesSelecotr) { return element.mozMatchesSelecotr(selector) } else if (element.webkitMatchesSelecotr) { return element.webkitMatchesSelecotr(selector) } else { throw new Error("Not supported."); } }元素遍歷
對于元素間的空格,IE9及之前版本不會返回文本節點,而其他所有瀏覽器都會返回文本節點。為了彌補這一差異,而又同時保持DOM規范不變,Element Traversal 規范新定義了一組屬性。
childElementCount: 返回子元素(不包括文本節點和注釋)的個數
firstElementChild: 指向第一個子元素;firstChild的元素版
lastElementChild: 指向最后一個子元素;lastChild的元素版
previousElementSibling: 指向前一個同輩元素;previousSibling的元素版
nextElementSibling: 指向前一個同輩元素;nextSibling的元素版
// 跨瀏覽器遍歷某元素的所有子元素 // 老版的兼容性代碼 var i, len, child = element.firstChild; while(child != element.lastChild) { // 檢查是不是元素 if (child.nodeType == 1) { processChild(child); } child = child.nextSibling; } // 使用新版的方法 var i, len, child = element.firstChild; while(child != element.lastElementChild) { processChild(child); child = child.nextElementSibling; }
支持Element Traversal 規范的瀏覽器有 IE9+ Firefox3.5+ Safari4+ Chrome Opera10+
HTML5HTML5所有之前的版本對JavaScript接口的描述不過三言兩語,主要篇幅都用于定義標記,與JavaScript相關的內容一概交由DOM規范去定義。
HTML5規范則圍繞如何使用新增標記定義了大量JavaScript API。其中一些API與DOM重疊,定義了瀏覽器應該支持的DOM拓展。
由于HTML5涉及的面非常廣,本節只討論與DOM節點相關的內容。
與類(class)相關的擴充HTML5 新增了很多API,致力于簡化CSS類的用法。
getElementsByClassName()方法// 取得所有類中包含"username"和"current"的元素 // 類名的先后順序無所謂 var allCurrentUsernames = docment.getElementsByClassName("username current"); // 取得ID為"myDiv"的元素中帶有類名"selected"的所有元素 var selected = document.getElementById("myDiv").getElemenstByClassName("selected");
支持getElementsByClassName()方法的瀏覽器 IE9+ Firefox3+ Safari3.1+ Chrome Opera9.5+
classList屬性在操作類名時,需要通過className屬性添加、刪除和替換類名。因為className中是一個字符串,所以即使只是修改字符串一部分,也必須每次都設置整個字符串的值。
HTML5 新增了一種操作類名的方式,可以讓操作更簡單也更安全,那就是為所有元素添加了classList屬性。
classList屬性是新集合類型 DOMTokenList的實例。與其他DOM集合類似,DOMTokenList 有一個表示自己包含多少元素的length屬性,而要去的每個元素可以使用item()方法,或者方括號語法。此外,這個新類型還定義如下方法:
add(value): 將給定的字符串值添加到列表中。如果值已經存在,就不添加了。
contains(value): 表示列表中是否存在給定的值,如果存在返回true,反之false。
remove(value): 從列表中刪除給定的字符串。
toggle(value): 如果列表中已經存在給定的值,刪除它;如果沒有,添加它。
有了classList屬性,除非你需要刪除所有類名,或者完全重寫元素的class屬性,否則就用不到className屬性了。
支持classList的瀏覽器 Firefox3.6+ Chrome
焦點管理HTML5添加了輔助DOM焦點的功能。
document.activeElement屬性,始終會引用DOM中當前獲得了焦點的元素。元素獲得焦點的方式有頁面加載、用戶輸入(通常是通過Tab鍵)和在代碼中調用focus()方法。
var button = document.getElementById("myButton"); button.focus(); console.log(document.activeElement === button); // true
默認情況下,文檔剛剛加載完成時,document.activeElement中保存的是document.body元素的引用。文檔加載期間,document.activeElement的值為null
document.hasFocus()方法,這個方法用于確定文檔是否獲得了焦點。
var button = document.getElementById("myButton"); button.focus(); console.log(document.hasFocus()); // true
支持的瀏覽器 IE4+ Firefox3+ Safari4+ Chrome Opera8+
HTMLDocument的變化 readyState屬性
Document.readyState屬性有兩個可能的值:
loading正在加載文檔
complete已經加載完文檔
支持的瀏覽器 IE4+ Firefox3.6+ Safari Chrome Opera9+
if (document.readyState == "complete") { ... }兼容模式
自從IE6開始區分渲染頁面的模式是標準的還是混雜的,檢測頁面的兼容性就成為瀏覽器的必要功能。IE為此給document添加了一個名為compatMode的屬性,告訴開發人員瀏覽器采用了哪種渲染模式。
document.compatMode標準模式下等于"CSS1Compat",混雜模式下等于"BackCompat"。
最終HTML5將這個屬性納入標準
支持的瀏覽器 IE Firefox Safari3.1 Chrome Opera
if (document.compatMode == "CSS1Compat") { console.log("Standards mode"); } else { console.log("Quirks mode"); }head屬性
HTML5新增了document.head屬性,與docuemnt.body對應
支持的瀏覽器 Chrome Safari 5+
var head = document.head || document.getElementsByTagName("head")[0];字符集屬性
HTML5新增了幾個與文檔字符集有關的屬性
charset屬性表示文檔中實際使用的字符集,也可以用來指定新字符集。默認值是"UTF-16",可以通過元素、響應頭部或直接設置charset屬性修改這個值。
支持的瀏覽器 IE Safari Opera Chrome 。 Firefox 支持 document.Characterset。
console.log(document.charset); // "UTF-16" document.charset = "UTF-8";
defaultCharset表示根據默認瀏覽器及操作系統的設置,當前文檔默認的字符集應該是什么。如果文檔沒有使用默認的字符集,那charset和defaultCharset屬性值可能會不一樣。
if (document.charset != document.defaultCharset) { console.log("Custom character set being used."); }
支持的瀏覽器 IE Safari Chrome 。
自定義數據屬性HTML5 規定可以為元素添加非標準的屬性,但要添加前綴data- ,目的是為元素提供與渲染無關的信息,或者提供語義信息。這些屬性可以任意添加、隨便明明,只要以data-開頭即可。
添加了自定義屬性之后,可以通過元素的dataset屬性來訪問自定義屬性的值。dataset屬性的值時DOMStringMap的實例,也就是一個名值對的映射。在這個映射中,每個data-name形式的屬性都會有一個對應的屬性,只不過屬性沒有data-前綴。
var div = document.getElementById("myDiv"); // 取得自定義屬性的值 var appId = div.dataset.appId; var myName = div.dataset.myname; // 設置值 div.dataset.appId = 2345; div.dataset.myname = "Michael"; // 有沒有"myname"值呢? if (div.dataset.myname) { console.log("Hello, " + div.dataset.myname); }插入標記
雖然DOM為操作節點提供了細致入微的控制手段,但在需要給文檔插入大量HTML標記的情況下,通過DOM操作仍然非常麻煩,因為不僅要創建一系列DOM節點,還要小心按照正確的順序把它們連接起來。
相對而言,直接插入HTML字符串不僅更簡單,速度也更快。以下插入標記的DOM拓展已經納入了HTML5規范。
innerHTML屬性在讀模式下,innerHTML屬性返回與調用元素的所有子節點(包括元素、注釋和文本節點)對應的HTML標記。
在寫模式下,innerHTML會根據指定的值創建新的DOM樹,然后用這個DOM樹完全替換調用元素原先的所有子節點。
This is a paragraph with a list following it.
- Item 1
- Item 2
- Item 3
This is a paragraph with a list following it.
不同瀏覽器返回的文本格式不會有所不同。IE和Opera會將所有標簽轉換為大小寫形式,而Safari、Chrome、Firefox則會原原本本的按照原先文檔中(或指定這些標簽時)的格式返回HTML,包括空格和縮進。
在寫模式下,傳入innerHTML的值都會按照瀏覽器處理HTML的標注方式轉換為元素(同樣因瀏覽器而異)。如果設置的值僅是純文本而沒有HTML標簽,那么結果就是設置純文本。
div.innerHTML = "Hello world!"; div.innerHTML = "Hello & welcom, "reader"!"; // 以上操作得到:Hello & welcome, "reader"!
使用innerHTML屬性也有一些限制,大多數瀏覽器中通過innerHTML插入元素并不會執行其中的腳本。IE8及更早的版本是唯一能夠在這種情況下執行腳本的瀏覽器,但必須滿足2個條件:
元素指定defer屬性
元素必須位于(微軟所謂的)“有作用域的元素”(scoped element)之后。元素被認為是“無作用域的元素”(NoScoped element),也就是在頁面中看不到的元素,與元素或注釋類似。
沒有(不支持)innerHTML屬性的元素有:
IE8及更早版本 Firefox在內容類型為application/xhtml+xml的XHTML文檔中設置innerHTML有嚴格的限制。在XHTML文檔中使用innerHTML時,XHTML代碼必須完全符合要求。 在讀模式下,outerHTML返回調用它的元素及所有子節點的HTML標簽。 在寫模式下,outerHTML會根據指定的HTML字符串創建新的DOM子樹,然后用這個DOM子樹完全替換調用元素。 在元素上調用outerHTML會返回相同的代碼,包括元素本身。由于瀏覽器解析和解釋HTML標記的不同,結果可能會有所不同。 This is a paragraph with a list following it. This is a paragraph with a list following it. 使用outerHTML屬性,會替換調用的元素本身 This is a paragraph. 支持的瀏覽器 IE4+ Safari4+ Chrome Opera8+ Firefox8+
insertAdjacentHTML()接收兩個參數:插入位置和要插入的HTML文本。
第一個參數必須是下列之一: "beforebegin" 在當前元素之前插入一個緊鄰的同輩元素 "afterbegin" 在當前元素之下插入一個新的子元素或在第一個子元素之前再插入新的子元素 "beforeend" 在當前元素之下插入一個新的子元素或在最后一個子元素之后再插入新的子元素 "afterend" 在當前元素之后插入一個緊鄰的同輩元素 第二個參數是HTML字符串,如果瀏覽器無法解析該字符串,就會拋出錯誤。 Hello world! Hello world! Hello world! Hello world! 支持的瀏覽器 IE Firefox8+ Safari Opera Chrome 使用本節介紹的方法替換子節點可能會導致瀏覽器的內存占用問題,尤其是IE,問題更加明顯。 在刪除帶有時間處理程序或引用了其他JavaScript對象子樹時,就有可能導致內存占用問題。假設某個元素有一個時間處理程序(或者引用了一個JavaScript對象作為屬性),在使用前述某個屬性將該元素從文檔樹刪除后,元素與事件處理程序(或JavaScript對象)之間的綁定關系在內存中并沒有一并刪除。如果這種情況頻繁出現,頁面占用的內存數量就會明顯增加。 因此,在使用innerHTML outerHTML insertAdjacentHTML() 時,最好先手工刪除要被替換的元素的所有事件處理程序和JavaScript對象屬性(第13章將進一步討論事件處理程序)。 不過使用這幾個屬性,特別是innerHTML仍然還是可以為我們提供很多遍歷的。插入大量HTML標記時,設置innerHTML或outerHTML時就會創建一個HTML解析器,這個解析器是在瀏覽器級別的代碼(通常是C++編寫的)基礎上運行的,因此比執行JavaScript快的多。 創建和銷毀HTML解析器也會帶來性能損失,所以最好能夠將設置innerHTML或outerHTML的次數控制在合理的范圍內。 如何滾動頁面也是DOM規范沒有解決的一個問題。HTML5最終選擇了scrollIntoView()作為標準方法。
scrollIntoView()可以在所有HTML元素上調用,通過滾動瀏覽器窗口或某個容器元素,調用元素就可以出現在視口中。 如果傳入true作為參數,或者不傳任何參數,那么窗口滾動之后會讓調用元素的頂部與視口頂部盡可能的平齊。 如果傳入false作為參數,調用元素會盡可能全部出現在視口中,(可能的話,調用元素的底部會與視口頂部平齊)不過頂部不一定平齊。 當頁面發生變化時,一般會用這個方法來吸引用戶的注意力。實際上,為某個元素設置焦點也會導致瀏覽器滾動并顯示出獲得焦點的元素。 支持的瀏覽器 IE Firefox8+ Safari Opera 雖然所有瀏覽器開發商都知曉堅持標準的重要性,但在發現某項功能缺失時,這些開發商都會一如既往的向DOM中添加專有拓展,以彌補功能上的不足。 表面上看不太友好,但實際上專有拓展為Web開發領域提供了很多重要的功能,這些功能最終都在HTML5規范中得以標準化。 即便如此,仍然還有大量專有的DOM拓展沒有成為標準。編寫本書時,它們還是專有功能,而且只得到了少數瀏覽器的支持
IE8引入了一個新的概念叫“文檔模式”(document mode)。頁面的文檔模式決定了可以使用什么功能。換言之,文檔模式決定了你可以使用哪個級別的CSS,可以在JavaScript中使用哪些API,以及如何對待文檔類型(doctype)。到了IE9總有有以下4種文檔模式: IE5: 以混雜模式渲染頁面(IE5的默認模式就是混雜模式)。IE8及更高版本中的新功能都無法使用。 IE7: 以IE7標準模式渲染頁面。IE8及更高版本中的新功能都無法使用 IE8: 以IE8標準模式渲染頁面。IE8新功能都能用,包括 Selectors API 、更多CSS2級選擇符和某些CSS3功能,還有一些HTML5功能。不能使用IE9中的新功能。 IE9: 以IE9標準模式渲染頁面。IE9新功能都能用,包括 ECMAScript 5 、完整的CSS3級,更多HTML5功能。 要強制瀏覽器以某種模式渲染頁面,可以使用HTTP頭部信息X-UA-Compatible或等價的標簽來設置。
這里的IE版本(IEVersion)有以下不同的值,不一定與上述4中文檔模式對應。
Edge: 始終以最新的文檔模式來渲染頁面。忽略文檔類型聲明。
EmulateIE9: 如果有文檔類型聲明,則以IE9標準模式渲染,否則將文檔模式設置為IE5。
EmulateIE8: 如果有文檔類型聲明,則以IE8標準模式渲染,否則將文檔模式設置為IE5。
EmulateIE7: 如果有文檔類型聲明,則以IE7標準模式渲染,否則將文檔模式設置為IE5。
9: 強制以IE9標準模式渲染頁面,忽略文檔類型聲明
8: 強制以IE8標準模式渲染頁面,忽略文檔類型聲明
7: 強制以IE7標準模式渲染頁面,忽略文檔類型聲明
5: 強制將文檔模式設置為IE5,忽略文檔類型聲明
document.documentMode 屬性可以知曉給定頁面使用的是什么文檔模式,它會返回文檔模式的版本號(在IE9中,可能返回的版本號為5、7、8、9) IE9之前的版本處理空白符與其他瀏覽器有差異,因此出現了children屬性。這個屬性是HTMLCollection的實例,只包含元素中同樣還是元素的子節點。除此之外,children 與 childNodes沒有區別。 IE8及更早版本的children屬性中也會包含注釋節點,但IE9之后的版本只返回元素節點。 支持的瀏覽器 IE5 Firefox 3.5 Safari2(有bug) Safari3 Opera8 和Chrome
contains() 祖先節點調用這個方法,接收一個參數是要檢查的后代節點。如果祖先節點包含傳入的后代節點返回true,否則false。 支持的瀏覽器 IE9+ Firefox Safari Opera Chrome 使用DOM Level 3 compareDocumentPosition()也能夠確定節點間的關系。 這個方法確定兩個節點間的關系,返回表示該關系的位掩碼(bitmask) 支持的瀏覽器 IE9+ Firefox Safari Opera9.5 Chrome 為模仿contains()方法,應該關注的是掩碼16.可以對compareDocumentPosition()的結果執行按位與。 執行上面的代碼后,結果會變成20(表示“居后”的4加上表示“被包含”的16)。對掩碼16執行安慰操作會返回一個非零數值,而兩個邏輯非操作符會將該數值轉換成布爾值。 注意: 回值可以是值的組合。例如,返回 20 意味著在 p2 在 p1 內部(16),并且 p1 在 p2 之前(4)。 使用一些瀏覽器及能力檢測,就可以寫出如下所示的一個通用的contains函數:
IE原來有innerHTML和outerHTML已被HTML5納入規范。但另外兩個插入文本的專有屬性則沒有這么好的運氣。 innerText outerText
scrollIntoView()納入規范后,仍有幾個專有方法可以在不同瀏覽器中使用。下列都是對HTMLElement類型的擴展,因此在所有元素中都可以調用:
scrollIntoViewIfNeeded(alignCenter): 只在當前元素在視口中不可見的情況下,才滾動瀏覽器窗口或容器元素,最終讓它可見。如果當前元素可見,這個方法什么都不會做。如果將可選的alignCenter參數設置為true,則表示盡量將元素顯示在視口中部(垂直方向)。Safari和Chrome實現了這個方法
scrollByLines(lineCount): 將元素的內容滾動到指定的行高,lineCount可以是正值也可以是負值。Safari和Chrome實現了這個方法
scrollByPages(lineCount): 將元素的內容滾動到指定的頁面高度,具體高度由元素的高度決定。Safari和Chrome實現了這個方法 需要注意的是,scrollIntoView()和scrollIntoViewIfNeeded()的作用對象是元素的容器,而scrollByLines()和scrollByPages()影響的是元素自身
scrollIntoView()是唯一一個所有瀏覽器都支持的方法,因此最常用。 文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。 轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109699.html 摘要:表示應該立即下載腳本,但不應妨礙頁面中的其他操作可選。表示通過屬性指定的代碼的字符集。表示腳本可以延遲到文檔完全被解析和顯示之后再執行。實際上,服務器在傳送文件時使用的類型通常是,但在中設置這個值卻可能導致腳本被忽略。
第1章 JavaScript 簡介
雖然JavaScript和ECMAScript通常被人們用來表達相同的含義,但JavaScript的含義比ECMA-262要多得多... 摘要:用戶代理檢測用戶代理檢測是爭議最大的客戶端檢測技術。第二個要檢測是。由于實際的版本號可能會包含數字小數點和字母,所以捕獲組中使用了表示非空格的特殊字符。版本號不在后面,而是在后面。除了知道設備,最好還能知道的版本號。
檢測Web客戶端的手段很多,各有利弊,但不到萬不得已就不要使用客戶端檢測。只要能找到更通用的方法,就應該優先采用更通用的方法。一言蔽之,先設計最通用的方案,然后再使用特定... 摘要:年月級規范成為的推薦標準,為基本的文檔結構及查詢提供了接口。這意味著中的對象與原生對象的行為或活動特點并不一致。結果第一條注釋就會成為中的第一個子節點。由于跨域安全限制,來自不同子域的頁面無法通過通信。
DOM(文檔對象模型)是針對HTML和XML文檔的一個API(應用程序編程接口)。DOM描繪了一個層次化的節點樹,允許開發人員添加、移除和修改頁面的某一部分。DOM脫胎于Netsc... 摘要:技術的核心是對象即。收到響應后,響應的數據會自動填充對象的屬性,相關的屬性有作為響應主體被返回的文本。收到響應后,一般來說,會先判斷是否為,這是此次請求成功的標志。中的版本會將設置為,而中原生的則會將規范化為。會在取得時報告的值為。
Ajax(Asynchronous Javascript + XML)技術的核心是XMLHttpRequest對象,即: XHR。雖然名字中包含XML,但... 閱讀 821·2023-04-25 19:49 閱讀 3756·2021-09-30 09:47 閱讀 2741·2021-09-13 10:21 閱讀 2680·2021-08-24 10:04 閱讀 3168·2019-08-30 15:55 閱讀 2296·2019-08-30 15:55 閱讀 2399·2019-08-30 15:54 閱讀 3471·2019-08-30 13:53
div.outerHTML = "
// 作為前一個同輩元素插入
element.insertAdjacentHTML("beforebegin", "
document.documentElement.contains(document.body); // true
掩碼
節點關系
1
無關(給定的節點不在當前文檔中)
2
居前(給定的節點在DOM樹中位于參考節點之前)
4
居后(給定的節點在DOM樹中位于參考節點之后)
8
包含(給定的節點是參考節點的祖先)
16
包含(給定的節點是參考節點的后代)
var result = document.documentElement.compareDocumentPosition(document.body);
console.log(!!(result & 16));
function contains(refNode, otherNode) {
if (typeof refNode.contains == "function" &&
(!client.engine.webkit || client.engine.webkit >= 522)) {
// 瀏覽器支持contains方法直接使用
return refNode.contains(otherNode);
} else if (typeof refNode.compareDocumentPosition == "function") {
// 瀏覽器支持compareDocumentPosition方法
// 用返回結果和16進行按位與,再轉換成布爾值返回
return !!(refNode.compareDocumentPosition(otherNode) & 16);
} else {
// 針對Safari設計的驗證方法
// 在文檔樹中向上遞歸驗證是否有refNode
// 到達文檔樹頂端,parentNode 的值為null,循環結束
var node = otherNode.parentNode;
do {
if (node === refNode) {
return true;
} else {
node = node.parentNode;
}
} while (node !== null);
return false;
}
}
插入文本
// 將頁面主體滾動5行
document.body.scrollByLines(5);
// 在當前元素不可見的時候,讓它進入瀏覽器的視口
document.images[0].scrollIntoViewIfNeeded();
// 將頁面主體往回滾動1頁
document.body.scrollByPages(-1);
相關文章
《JavaScript高級程序設計》(第3版)讀書筆記 第1~2章
《JavaScript高級程序設計》(第3版)讀書筆記 第9章 客戶端檢測
《JavaScript高級程序設計》(第3版)讀書筆記 第10章 DOM
Ajax與Comet-JavaScript高級程序設計第21章讀書筆記(1)
發表評論
0條評論
luck
男|高級講師
TA的文章
閱讀更多
pycharm配置tensorflow
STM32 硬件IIC OLED
數脈科技:9月中秋特惠優惠促銷,全場首月5折,阿里云華為云10MbpsCN2,首月165元,自營CN
SoftShellWeb:圣何塞/臺灣/荷蘭VPS促銷,$3.00/月起,KVM虛擬化,自帶DDOS
前端開發API及規范
在微信小程序中創建屬于自己的個性彈框
視窗單位-vw/vh/vmin/vmax
C3的坑之inline-block