摘要:有級(jí)級(jí)級(jí)共個(gè)級(jí)別。事件類型事件類型鼠標(biāo)事件鍵盤(pán)事件事件事件處理器執(zhí)行代碼的程序在事件發(fā)生時(shí)會(huì)對(duì)事件做出響應(yīng)。在標(biāo)簽中使用事件處理器的語(yǔ)法是標(biāo)簽事件處理器代碼事件處理程序事件就是用戶或?yàn)g覽器自身執(zhí)行的某種動(dòng)作。
DOM介紹
D(文檔)可以理解為整個(gè)Web加載的網(wǎng)頁(yè)文檔,O(對(duì)象)可以理解為類似window對(duì)象只來(lái)的東西,可以調(diào)用屬性和方法,這里我們說(shuō)的是document對(duì)象,M(模型)可以理解為網(wǎng)頁(yè)文檔的樹(shù)形結(jié)構(gòu),DOM樹(shù)由節(jié)點(diǎn)構(gòu)成
節(jié)點(diǎn)種類:元素節(jié)點(diǎn)、文本節(jié)點(diǎn)和屬性節(jié)點(diǎn)
DOM(文檔對(duì)象模型)是 HTML 和 XML 的應(yīng)用程序接口(API)。DOM代表著被加載到瀏覽器窗口里的當(dāng)前網(wǎng)頁(yè):瀏覽器向我們提供了當(dāng)前網(wǎng)頁(yè)的地圖(或者說(shuō)模型),而我們可以通過(guò)js去讀取這張地圖。
BOM 主要處理瀏覽器窗口和框架,不過(guò)通常瀏覽器特定的 JavaScript 擴(kuò)展都被看做 BOM 的一部分。這些擴(kuò)展包括:
彈出新的瀏覽器窗口 移動(dòng)、關(guān)閉瀏覽器窗口以及調(diào)整窗口大小 提供 Web 瀏覽器詳細(xì)信息的定位對(duì)象 提供用戶屏幕分辨率詳細(xì)信息的屏幕對(duì)象 對(duì) cookie 的支持 IE 擴(kuò)展了 BOM,加入了 ActiveXObject 類,可以通過(guò) JavaScript 實(shí)例化 ActiveX 對(duì)象
window對(duì)象對(duì)應(yīng)著瀏覽器窗口本身,這個(gè)對(duì)象的屬性和方法通常被稱為BOM
DOM包含:window
Window對(duì)象包含屬性:document、location、navigator、screen、history、frames Document根節(jié)點(diǎn)包含子節(jié)點(diǎn):forms、location、anchors、images、links
從window.document已然可以看出,DOM的最根本的對(duì)象是BOM的window對(duì)象的子對(duì)象。
區(qū)別:DOM描述了處理網(wǎng)頁(yè)內(nèi)容的方法和接口,BOM描述了與瀏覽器進(jìn)行交互的方法和接口。
根據(jù)W3C DOM規(guī)范,DOM是HTML與XML的應(yīng)用編程接口(API),DOM將整個(gè)頁(yè)面映射為一個(gè)由層次節(jié)點(diǎn)組成的文件。有1級(jí)、2級(jí)、3級(jí)共3個(gè)級(jí)別。
先來(lái)看看下面代碼:
DOM javascript DOM
對(duì)HTML元素進(jìn)行操作,可添加、改變或移除css樣式等
將HTML代碼分解為DOM節(jié)點(diǎn)層次圖:
**HTML文檔可以說(shuō)由節(jié)點(diǎn)構(gòu)成的集合,DOM節(jié)點(diǎn)有:** 1. 元素節(jié)點(diǎn):上圖中、、等都是元素節(jié)點(diǎn),即標(biāo)簽。 2. 文本節(jié)點(diǎn):向用戶展示的內(nèi)容,如
W3C提供了比較方便的定位節(jié)點(diǎn)的方法和屬性,如下所示:
| 方法 | 說(shuō)明 |
| ------------- |:-------------:|
| getElementById() | 獲取特定ID元素的節(jié)點(diǎn) |
| getElementsByTagName() | 獲取相同元素的節(jié)點(diǎn)列表 |
| getElementsByName | 獲取相同名稱的節(jié)點(diǎn)列表 |
| getAttribute() | 獲取特定元素節(jié)點(diǎn)屬性的值 |
| setAttribute() | 設(shè)置特定元素節(jié)點(diǎn)屬性的值 |
| removeAttribute() | 移除特定元素節(jié)點(diǎn)屬性 |
節(jié)點(diǎn)屬性 | |
nodeName | 返回一個(gè)字符串,其內(nèi)容是節(jié)點(diǎn)的名字 |
nodeType | 返回一個(gè)整數(shù),這個(gè)數(shù)值代表給定節(jié)點(diǎn)的類型 |
nodeValue | 返回給定節(jié)點(diǎn)的當(dāng)前值 |
| 屬性 |說(shuō)明 |
| ------------- |:-------------:|
| tagName | 獲取原酸節(jié)點(diǎn)的標(biāo)簽名 |
| innerHTML | 獲取元素節(jié)點(diǎn)的內(nèi)容 |
遍歷節(jié)點(diǎn)樹(shù) | |
childNodes | 返回一個(gè)數(shù)組,這個(gè)數(shù)組由給定元素的子節(jié)點(diǎn)構(gòu)成 |
firstChild | 返回第一個(gè)子節(jié)點(diǎn) |
lastChild | 返回最后一個(gè)子節(jié)點(diǎn) |
parentNode | 返回一個(gè)給定節(jié)點(diǎn)的父節(jié)點(diǎn) |
nextSibling | 返回給定節(jié)點(diǎn)的下一個(gè)子節(jié)點(diǎn) |
previousSibling | 返回給定節(jié)點(diǎn)的上一個(gè)子節(jié)點(diǎn) |
DOM操作 | |
creatElement(element) | 創(chuàng)建一個(gè)新的元素節(jié)點(diǎn) |
creatTextNode() | 創(chuàng)建一個(gè)包含給定文本的新文本節(jié)點(diǎn) |
appendChild() | 指定節(jié)點(diǎn)的最后一個(gè)節(jié)點(diǎn)列表后添加一個(gè)新的子節(jié) |
insertBefore() | 將一個(gè)給定節(jié)點(diǎn)插入到一個(gè)給定元素節(jié)點(diǎn)的給定子節(jié)點(diǎn)的前面 |
removeChild() | 從一個(gè)給定元素中刪除子節(jié)點(diǎn) |
replaceChild() | 把一個(gè)給定父元素里的一個(gè)子節(jié)點(diǎn)替換為另外一個(gè)節(jié)點(diǎn) |
DOM通過(guò)創(chuàng)建樹(shù)來(lái)表示文檔,描述了處理網(wǎng)頁(yè)內(nèi)容的方法和接口,從而使開(kāi)發(fā)者對(duì)文檔的內(nèi)容和結(jié)構(gòu)具有空前的控制力,用DOM API可以輕松地刪除、添加和替換節(jié)點(diǎn)。
1. 訪問(wèn)節(jié)點(diǎn)`var oHtml = document.documentElement;` //返回存在于 XML 以及 HTML 文檔中的文檔根節(jié)點(diǎn),oHtml包含了一個(gè)表示的HTMLElement對(duì)象 `document.body` //是對(duì) HTML 頁(yè)面的特殊擴(kuò)展,提供了對(duì) 標(biāo)簽的直接訪問(wèn) `document.getElementById("ID")` //通過(guò)指定的 ID 來(lái)返回元素,getElementById() 無(wú)法工作在 XML 中,IE6還會(huì)返回name為指定ID的元素 `document.getElementByName("name")`//獲取所有name特性等于指定值的元素,不過(guò)在IE6和Opera7.5上還會(huì)返回id為給定名稱的元素且僅檢查和 `var x=document.getElementsByTagName("p");` //使用指定的標(biāo)簽名返回所有的元素列表NodeList,索引號(hào)從0開(kāi)始。當(dāng)參數(shù)是一個(gè)星號(hào)的時(shí)候,IE6并不返回所有的元素,必須用document.all來(lái)替代 2. Node節(jié)點(diǎn)的特性和方法
firstChild //Node,指向在childNodes列表中的第一個(gè)節(jié)點(diǎn) lastChild //Node,指向在childNodes列表中的最后一個(gè)節(jié)點(diǎn) parentNode //Node,指向父節(jié) ownerDocument //Document,指向這個(gè)節(jié)點(diǎn)所屬的文檔 firstChild //Node,指向在childNodes列表中的第一個(gè)節(jié)點(diǎn) lastChild //Node,指向在childNodes列表中的最后一個(gè)節(jié)點(diǎn) parentNode //Node,指向父節(jié)點(diǎn) childNodes //NodeList,所有子節(jié)點(diǎn)的列表 previousSibling /Node,/指向前一個(gè)兄弟節(jié)點(diǎn):如果這個(gè)節(jié)點(diǎn)就是第一個(gè)節(jié)點(diǎn),那么該值為 null `nextSibling` //Node,指向后一個(gè)兄弟節(jié)點(diǎn):如果這個(gè)節(jié)點(diǎn)就是最后一個(gè)節(jié)點(diǎn),那么該值為null `hasChildNodes()` //Boolean,當(dāng)childNodes包含一個(gè)或多個(gè)節(jié)點(diǎn)時(shí),返回真值3.DOM事件
DOM同時(shí)兩種事件模型:冒泡型事件和捕獲型事件 冒泡型事件:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)的順序觸發(fā)4.事件處理函數(shù)/監(jiān)聽(tīng)函數(shù)Click Me觸發(fā)的順序是:div、body、html(IE 6.0和Mozilla 1.0)、document、window(Mozilla 1.0) 捕獲型事件:與冒泡事件相反的過(guò)程,事件從最不精確的對(duì)象開(kāi)始觸發(fā),然后到最精確 上面例子觸發(fā)的順序是:document、div DOM事件模型最獨(dú)特的性質(zhì)是,文本節(jié)點(diǎn)也觸發(fā)事件(在IE中不會(huì))。
**事件處理函數(shù)/監(jiān)聽(tīng)函數(shù)** 在JavaScript中: var oDiv = document.getElementById("div1"); oDiv.onclick = function(){ //onclick只能用小寫(xiě),默認(rèn)為冒泡型事件 alert("Clicked!"); } 在HTML中: //onclick大小寫(xiě)任意IE事件處理程序 attachEvent()和detachEvent()
在IE中,每個(gè)元素和window對(duì)象都有兩個(gè)方法:attachEvent()和detachEvent(),這兩個(gè)方法接受兩個(gè)相同的參數(shù),事件處理程序名稱和事件處理程序函數(shù),如:
[object].attachEvent("name_of_event_handler","function_to_attach") [object].detachEvent("name_of_event_handler","function_to_remove") var fnClick = function(){ alert("Clicked!"); } oDiv.attachEvent("onclick", fnClick); //添加事件處理函數(shù) oDiv.attachEvent("onclick", fnClickAnother); // 可以添加多個(gè)事件處理函數(shù) oDiv.detachEvent("onclick", fnClick); //移除事件處理函數(shù)
在使用attachEvent()方法的情況下,事件處理程序會(huì)在全局作用域中運(yùn)行,因此this等于window。
跨瀏覽器的事件處理程序addHandler()和removeHandler()
addHandler()方法屬于一個(gè)叫EventUntil()的對(duì)象,這兩個(gè)方法均接受三個(gè)相同的參數(shù),要操作的元素,事件名稱和事件處理程序函數(shù)。
事件類型**事件類型** 鼠標(biāo)事件:click、dbclick、mousedown、mouseup、mouseover、mouseout、mousemove 鍵盤(pán)事件:keydown、keypress、keyup HTML事件:load、unload、abort、error、select、change、submit、reset、 resize、scroll、focus、blur事件處理器
執(zhí)行JavaScript 代碼的程序在事件發(fā)生時(shí)會(huì)對(duì)事件做出響應(yīng)。為了響應(yīng)一個(gè)特定事件
而被執(zhí)行的代碼稱為事件處理器。
在HTML標(biāo)簽中使用事件處理器的語(yǔ)法是:
事件處理程序
事件就是用戶或?yàn)g覽器自身執(zhí)行的某種動(dòng)作。比如click,mouseup,keydown,mouseover等都是事件的名字。而響應(yīng)某個(gè)事件的函數(shù)就叫事件處理程序(事件監(jiān)聽(tīng)器),事件處理程序以on開(kāi)頭,因此click的事件處理程序就是onclick
DOM 0級(jí)事件處理程序DOM 0級(jí)事件處理程序:把一個(gè)函數(shù)賦值給一個(gè)事件的處理程序?qū)傩?/p>
var btn2=document.getElementById("btn2");獲得btn2按鈕對(duì)象 btn2.onclick //給btn2添加onclick屬性,屬性又觸發(fā)了一個(gè)事件處理程序 btn2.onclick=function(){ } //添加匿名函數(shù) btn2.onclick=null //刪除onclick屬性如何阻止冒泡?
阻止冒泡有以下方法:
e.cancelBubble=true; e.stopPropagation(); return false;innerText、innerHTML、outerHTML、outerText
innerText、innerHTML、outerHTML、outerText innerText: 表示起始標(biāo)簽和結(jié)束標(biāo)簽之間的文本 innerHTML: 表示元素的所有元素和文本的HTML代碼 如:DOM 2級(jí)事件處理程序Hello world的innerText為Hello world,innerHTML為Hello world outerText: 與前者的區(qū)別是替換的是整個(gè)目標(biāo)節(jié)點(diǎn),問(wèn)題返回和innerText一樣的內(nèi)容 outerHTML: 與前者的區(qū)別是替換的是整個(gè)目標(biāo)節(jié)點(diǎn),返回元素完整的HTML代碼,包括元素本身
DOM 2級(jí)事件定義了兩個(gè)方法,用于指定和刪除事件處理程序的操作。addEventListener()和removeEventListener()
addEventListener()和removeEventListener()在DOM中,addEventListener()和removeEventListener()用來(lái)分配和移除事件處理函數(shù),與IE不同的是,這些方法需要三個(gè)參數(shù):事件名稱,要分配的函數(shù)和處理函數(shù)是用于冒泡階段(false)還是捕獲階段(true),默認(rèn)為冒泡階段false [object].addEventListener("name_of_event",fnhander,bcapture) [object].removeEventListener("name_of_event",fnhander,bcapture) var fnClick = function(){ alert("Clicked!"); } oDiv.addEventListener("onclick", fnClick, false); //添加事件處理函數(shù) oDiv.addEventListener("onclick", fnClickAnother, false); // 與IE一樣,可以添加多個(gè)事件處理函數(shù) oDiv.removeEventListener("onclick", fnClick, false); //移除事件處理函數(shù) 如果使用addEventListener()將事件處理函數(shù)加入到捕獲階段,則必須在removeEventListener()中指明是捕獲階段,才能正確地將這個(gè)事件處理函數(shù)刪除 oDiv.onclick = fnClick; oDiv.onclick = fnClickAnother; //使用直接賦值,后續(xù)的事件處理函數(shù)會(huì)覆蓋前面的處理函數(shù) oDiv.onclick = fnClick; oDiv.addEventListener("onclick", fnClickAnother, false); //會(huì)按順序進(jìn)行調(diào)用,不會(huì)覆蓋
一張圖了解OUTHTML和innerText、innerHTML:
DOM基本操作思維導(dǎo)圖更詳細(xì)的XML DOM - Element 對(duì)象的屬性和方法請(qǐng)?jiān)L問(wèn)w3cshool
BOM 部分BOM的核心是window,而window對(duì)象又具有雙重角色,它既是通過(guò)js訪問(wèn)瀏覽器窗口的一個(gè)接口,又是一個(gè)Global(全局)對(duì)象。這意味著在網(wǎng)頁(yè)中定義的任何對(duì)象,變量和函數(shù),都以window作為其global對(duì)象。
window.close(); //關(guān)閉窗口 window.alert("message"); //彈出一個(gè)具有OK按鈕的系統(tǒng)消息框,顯示指定的文本 window.confirm("Are you sure?"); //彈出一個(gè)具有OK和Cancel按鈕的詢問(wèn)對(duì)話框,返回一個(gè)布爾值 window.prompt("What"s your name?", "Default"); //提示用戶輸入信息,接受兩個(gè)參數(shù),即要顯示給用戶的文本和文本框中的默認(rèn)值,將文本框中的值作為函數(shù)值返回 window.status //可以使?fàn)顟B(tài)欄的文本暫時(shí)改變 window.defaultStatus //默認(rèn)的狀態(tài)欄信息,可在用戶離開(kāi)當(dāng)前頁(yè)面前一直改變文本 window.setTimeout("alert("xxx")", 1000); //設(shè)置在指定的毫秒數(shù)后執(zhí)行指定的代碼,接受2個(gè)參數(shù),要執(zhí)行的代碼和等待的毫秒數(shù) window.clearTimeout("ID"); //取消還未執(zhí)行的暫停,將暫停ID傳遞給它 window.setInterval(function, 1000); //無(wú)限次地每隔指定的時(shí)間段重復(fù)一次指定的代碼,參數(shù)同setTimeout()一樣 window.clearInterval("ID"); //取消時(shí)間間隔,將間隔ID傳遞給它 window.history.go(-1); //訪問(wèn)瀏覽器窗口的歷史,負(fù)數(shù)為后退,正數(shù)為前進(jìn) window.history.back(); //同上 window.history.forward(); //同上 window.history.length //可以查看歷史中的頁(yè)面數(shù)document對(duì)象
document對(duì)象:實(shí)際上是window對(duì)象的屬性,document == window.document為true,是唯一一個(gè)既屬于BOM又屬于DOM的對(duì)象 document.lastModified //獲取最后一次修改頁(yè)面的日期的字符串表示 document.referrer //用于跟蹤用戶從哪里鏈接過(guò)來(lái)的 document.title //獲取當(dāng)前頁(yè)面的標(biāo)題,可讀寫(xiě) document.URL //獲取當(dāng)前頁(yè)面的URL,可讀寫(xiě) document.anchors[0]或document.anchors["anchName"] //訪問(wèn)頁(yè)面中所有的錨 document.forms[0]或document.forms["formName"] //訪問(wèn)頁(yè)面中所有的表單 document.images[0]或document.images["imgName"] // 訪問(wèn)頁(yè)面中所有的圖像 document.links [0]或document.links["linkName"] //訪問(wèn)頁(yè)面中所有的鏈接 document.applets [0]或document.applets["appletName"] //訪問(wèn)頁(yè)面中所有的Applet document.embeds [0]或document.embeds["embedName"] //訪問(wèn)頁(yè)面中所有的嵌入式對(duì)象 document.write(); 或document.writeln(); //將字符串插入到調(diào)用它們的位置location對(duì)象
location對(duì)象:表示載入窗口的URL,也可用window.location引用它 location.href //當(dāng)前載入頁(yè)面的完整URL,如http://www.somewhere.com/pictures/index.htm location.portocol //URL中使用的協(xié)議,即雙斜杠之前的部分,如http location.host //服務(wù)器的名字,如www.wrox.com location.hostname //通常等于host,有時(shí)會(huì)省略前面的www location.port //URL聲明的請(qǐng)求的端口,默認(rèn)情況下,大多數(shù)URL沒(méi)有端口信息,如8080 location.pathname //URL中主機(jī)名后的部分,如/pictures/index.htm location.search //執(zhí)行GET請(qǐng)求的URL中的問(wèn)號(hào)后的部分,又稱查詢字符串,如?param=xxxx location.hash //如果URL包含#,返回該符號(hào)之后的內(nèi)容,如#anchor1 location.assign("http:www.baidu.com"); //同location.href,新地址都會(huì)被加到瀏覽器的歷史棧中 location.replace("http:www.baidu.com"); //同assign(),但新地址不會(huì)被加到瀏覽器的歷史棧中,不能通過(guò)back和forward訪問(wèn) location.reload(true | false); //重新載入當(dāng)前頁(yè)面,為false時(shí)從瀏覽器緩存中重載,為true時(shí)從服務(wù)器端重載,默認(rèn)為falsenavigator對(duì)象
`navigator`對(duì)象:包含大量有關(guān)Web瀏覽器的信息,在檢測(cè)瀏覽器及操作系統(tǒng)上非常有用,也可用window.navigator引用它 `navigator.appCodeName` //瀏覽器代碼名的字符串表示 navigator.appName //官方瀏覽器名的字符串表示 navigator.appVersion //瀏覽器版本信息的字符串表示 navigator.cookieEnabled //如果啟用cookie返回true,否則返回false navigator.javaEnabled //如果啟用java返回true,否則返回false navigator.platform //瀏覽器所在計(jì)算機(jī)平臺(tái)的字符串表示 navigator.plugins //安裝在瀏覽器中的插件數(shù)組 navigator.taintEnabled //如果啟用了數(shù)據(jù)污點(diǎn)返回true,否則返回false navigator.userAgent //用戶代理頭的字符串表示screen對(duì)象
screen對(duì)象:用于獲取某些關(guān)于用戶屏幕的信息,也可用window.screen引用它 screen.width/height //屏幕的寬度與高度,以像素計(jì) screen.availWidth/availHeight //窗口可以使用的屏幕的寬度和高度,以像素計(jì) screen.colorDepth //用戶表示顏色的位數(shù),大多數(shù)系統(tǒng)采用32位 window.moveTo(0, 0); window.resizeTo(screen.availWidth, screen.availHeight); //填充用戶的屏幕window對(duì)象方法 BOM和DOM的結(jié)構(gòu)關(guān)系示意圖
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/87606.html
摘要:看下面一個(gè)例子優(yōu)點(diǎn)使用構(gòu)造器函數(shù)的好處在于,它可以在創(chuàng)建對(duì)象時(shí)接收一些參數(shù)。按照慣例,構(gòu)造函數(shù)的函數(shù)名應(yīng)始終以一個(gè)大寫(xiě)字母開(kāi)頭,以區(qū)分普通函數(shù)。返回該對(duì)象的源代碼。使您有能力向?qū)ο筇砑訉傩院头椒ā? 基本概念 ECMA關(guān)于對(duì)象的定義是:無(wú)序?qū)傩缘募?,其屬性可以包含基本值、?duì)象或者函數(shù)。對(duì)象的每個(gè)屬性或方法都有一個(gè)名字,而每個(gè)名字都映射到一個(gè)值。 類 在現(xiàn)實(shí)生活中,相似的對(duì)象之間往往都有...
摘要:布爾值表示捕獲階段調(diào)用事件處理程序,表示冒泡階段通過(guò)對(duì)象的方法,也可以定義事件的回調(diào)函數(shù)。對(duì)象會(huì)被作為第一個(gè)參數(shù)傳遞給事件監(jiān)聽(tīng)的回調(diào)函數(shù)。布爾默認(rèn)值是,當(dāng)設(shè)置成時(shí)用以取消事件的默認(rèn)行為與中的相同。 其實(shí)這篇文章挺早之前就寫(xiě)了,但是由于sf保存方面的bug,所以當(dāng)時(shí)寫(xiě)了一大堆,結(jié)果沒(méi)保存,覺(jué)得這個(gè)沒(méi)寫(xiě)完是個(gè)不小的遺憾,今天正好有空,就給補(bǔ)充下了,也正好給我的javascript學(xué)習(xí)總結(jié)做...
摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過(guò)來(lái)給道典型的面試題前端掘金在界中,開(kāi)發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來(lái)自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡(jiǎn)介 算法實(shí)現(xiàn) 選擇排序 簡(jiǎn)介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...
摘要:個(gè)人前端文章整理從最開(kāi)始萌生寫(xiě)文章的想法,到著手開(kāi)始寫(xiě),再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會(huì)繼更新,現(xiàn)將已經(jīng)寫(xiě)好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開(kāi)始萌生寫(xiě)文章的想法,到著手...
閱讀 1317·2023-04-25 20:56
閱讀 2467·2023-04-25 14:42
閱讀 1101·2023-04-25 14:06
閱讀 2928·2021-10-14 09:42
閱讀 2214·2021-09-22 16:03
閱讀 1059·2021-09-13 10:30
閱讀 1405·2019-08-29 15:41
閱讀 1879·2019-08-29 12:55