Outerhtml là gì
Mục Lục
Show
Ví dụ một cây DOM cơ bản:
<head> <title>DOMinJavaScripttitle> head> <body> <p>Xinchàocácbạnp> body>
html> Đây là sơ đồ minh họa của nó:
Trong cây DOM trên:
3.1. Nhắm đến phần tử DOM hàng đầuCác phần tử hàng đầu trong DOM HTML có sẵn trực tiếp dưới dạng các thuộc tính củadocument. Do đó, chúng ta có thể truy cập nó bằng cách sử dụng dấu chấm . Ví dụ:
Chúng ta hãy thử làm một vài ví dụ sau. Bạn hãy tạo một file HTML và một file .js Hoặc có thể sử dụng từng DOM selector ở bên dưới chạy trên tab console của trang web bất kỳ để thấy cách nó thay đổi. Bước 1: Vào trang web bất kỳ, ví dụ https://niithanoi.edu.vn
Ví dụ DOM Selector:
letx=document.documentElement.getAttribute("lang"));//Kếtquả:vi
console.log(x); Thử thiết lập CSS xem nhé:
document.body.style.background="gray"; Và đây là ví dụ lấy tên thẻ:
alert(document.head.firstElementChild.nodeName); 3.1. Nhắm đến phần tử DOM bằng ID
Và nếu bạn viết code JS như thế này:
console.log(x); Thì trong màn hình console nó sẽ trả về:
Tuy nhiên, chúng ta muốn nhắm đến phần tử có id đó để làm cái gì đó như thay đổi (thiết lập) màu sắc thì làm như thế này:
letx=document.getElementById("tieuDe"); //Thiếtlậpmàuđỏchonó
x.style.color="red"; Phương thức getElementById() trả về phần tử dưới dạng đối tượng, nếu không tìm thấy thì nó trả về null 3.2. Nhắm đến phần tử DOM bằng Class NameTương tự, bạn có thể sử dụng phương thức getElementsByClassName() để lấy tất cả các phần tử có class nào đó. Ví dụ, ta có HTML như sau:
<pclass="nhom1">Nhiềuphầntửcóthểcócùngtênclassp>
<divclass="nhom1">VìthếnólàgetElementschứkhôngphảigetElementdiv> Bây giờ, muốn lấy tất cả các phần tử có class là nhom1 thì làm thế này:
Bởi vì có thể sẽ lấy được nhiều phần tử nên xtrả về sẽ giống như một mảng và có thể truy cập thông qua chỉ số index. Hơi khó hiểu nhỉ. Kiểm tra thử xem lấy được bao nhiêu phần tử có class là nhom1 nhé:
console.log(x.length);//Kếtquả:3 Bây giờ, thông qua chỉ số index là ta có thể truy cập, sửa đổi nó như thế này:
x[0].style.color="red"; Ta cũng có thể lặp qua các phần tử này bằng cách sử dụng vòng lặp for in:
for(leteleminx){ x[elem].style.background="blue";
} Bạn thử chạy xem kết quả có đúng mong đợi không nhé. :D 3.3. Nhắm đến phần tử DOM bằng Tag Name
<divclass="test">Nósẽlấytấtcảcácphầntửvớithẻtagđódiv>
<p>Kếtquảtrảvềgiốngnhưmảng.Sauđótacóthểlàmgìtùythíchp> Bây giờ sử dụng phương thức getElementsByTagName() để lấy tất cả các phần tử p
Kết quả trả về giống như một mảng. Ta thử kiểm tra xem nó lấy được bao nhiêu phần tử nhé.
Bây giờ thì dễ rồi đúng không? Đã lấy được về chính xác rồi. Bây giờ bạn cứ thoải mái ABC, XYZ =))
x[0].style.color="blue"; Vì nó giống mảng nên ta có thể lặp qua nhé.
for(leteleminx){ x[elem].style.background="gray";
} 3.3. Nhắm đến phần tử DOM bằng CSS SelectorĐúng vậy, nếu bạn có CSS Selector thì bạn cũng có thể thông qua CSS Selector đó để nhắm đến phần tử mà bạn cần. Phương thứcquerySelectorAll()trả về danh sách tất cả các phần tử khớp với các CSS Selector được chỉ định. Bạn có thể thao tác với nó giống như bất kỳ mảng nào. Ví dụ ta có HTML sau:
<li>HọcJavali> <liclass="gachChan">HọcJavaScriptli> <li>HọcPHPli> <li>HọcPytonli> <li>NIIT-ICTHàNộili>
ul>
letx=document.querySelectorAll("ulli"); //Kiểmtraxemlấyđượcbaonhiêuphầntử
console.log(x.length);//Kếtquả:5 Bây giờ chúng ta đã nhắm đến được chúng thành công, lặp qua nó xem sao nào.
//Inramànhìnhconsole for(varelemofx){ console.log(elem.innerHTML);
} Ok. Bây giờ thử với CSS Selector khác xem nhé:
lety=document.querySelectorAll("ulli.gachChan"); //Thêmgạchchân
y[0].style.textDecoration="underline"; Bạn thử chạy kết quả trên trình duyệt xem. Có được kết quả như mong đợi không? > Ghi chú: Phương thức querySelectorAll() hoạt động với cả pesudo class. Tuy nhiên pesudo element thì không. Ok. Như vậy là bạn đã thành công trong việc nhắm chọn đến phần tử DOM. Vẫn còn một số phương thức như là getElementByName(), getElementByTagName() có thể được sử dụng để nhắm đến các phần tử DOM mà bạn muốn. Nó cũng tương tự như phương thứcgetElementById() hay getElementsByClassName() thôi. Bây giờ, hãy đi tìm hiểu một số thao tác phổ biến với phần tử DOM bằng JavaScript.
"A, thằng áo đỏ kia. Bây giờ mày sẽ mặc áo xanh" Đó, Thao tác với DOM chỉ đơn giản là gọi đến thằng nào đó và bắt nó làm gì đó. :D Với JavaScript, bạn có đầy đủ các công cụ đểthao tác với các phần tử DOM. Nói chung, tất cả những gì mà HTML có, JavaScript đều có thể tác động, thay đổi được chúng:
Bên dưới đây mình sẽ giới thiệu một số thuộc tính thường sử dụng nhiều nhất trong DOM. 4.1. Thao tác với DOM sử dụng thuộc tính idThuộc tính id sẽ trả vể ID của một phần tử là định danh duy nhất cho mỗi phần tử bạn có thể thay đổi ID nếu bạn muốn. Để hiểu cách sử dụng thuộc tính id để thao tác với DOM thì hãy xem xét ví dụ sau: Ví dụ thay đổi id message thành xinChao
<pid="message">ChàomừngcácbạnđếnvớilậptrìnhJavaScriptcănbản!p> <script> varid=document.getElementsByTagName("p")[0].id="xinChao"; //inraidcủap document.write(document.getElementById("xinChao").id); script>
body> Trong mã HTML thì rõ ràng chúng ta đặt id của thẻ p là message. Nhưng khi chạy trên trình duyệt, bạn sẽ thấy thẻ có id là xinChao
Viết liền như thế có thể sẽ làm bạn hơi khó hiểu. Vì thế, mình sẽ viết lại như sau: Đầu tiên,
vararrays_p=document.getElementsByTagName("p"); Bây giờ chúng ta có arrays_p là một tập hợp giống như một mảng, chứa các thẻ p Và bạn còn nhớ cách truy cập mảng trong JavaScript rồi chứ? > Nếu không thì đọc lại bài Mảng trong JavaScript này nhé. Ở ví dụ trên mình đã cố tình để thẻ là phần tử ngay sau thẻ mở .Thế nên, nó sẽ là phần tử đầu tiên trong mảng chúng ta lấy được. Tiếp theo, ta sẽ gán id mới cho phần tử này:
arrays_p[0].id="xinChao"; Cách làm này có vẻ là hơi rắc rối nhỉ. Có cách nào làm khác không? Có. Phương thứcdocument.getElementById() cũng sẽ cho kết quả tương tự.
<br/> <script> varp=document.getElementById("message"); //Thayđổiid p.id="xinChao";
script> Thử chạy trên trình duyệt để xem kết quả bạn nhé. Bây giờ, chúng ta đã nhắm đến chính xác phần tử p có id là message để thực hiện thay đổi id thành công. Vì sử dụng phương thức getElementById(), bạn sẽ nhắm chính xác cho dù thẻ p này có nằm ở đâu đi nữa. 4.2. Thao tác với DOM sử dụng thuộc tính classNameSử dụng thuộc tính className bạn có thể thực hiện gán class cho phần tử DOM nào đó. Ví dụ, ta có file HTML như sau:
<head> <title>DOMtrongJavaScripttitle> <style> .red{ color:red; } style> head> <body> <pclass="normal"id="message">ChàomừngcácbạnđếnvớilậptrìnhJavaScriptcănbản!p> <buttononclick="myFunction()">Nhấnvàođểthànhmàuđỏbutton> <script> functionmyFunction(){ varx=document.getElementsByTagName("p")[0]; x.className="red"; } script> body>
html> Sau khi click vàonútthì class normal sẽ được thay thế bằng red > Nếu bạn quên cách tạo hàm thì xin mời học lại bài Hàm trong JavaScript bạn nhé. Nhưng lưu ý, cách làm này sẽ thay thế toàn bộ class trong phần tử p. Để thêm được nhiều class thì đơn giản bạn chỉ cần tách các class bởi dấu cách như thế này: "red group1 smallTitel" 4.3. Thao tác với DOM sử dụng thuộc tính tagNameThuộc tính tagName trả về tên của phần tử mà bạn nhắm tới. Ví dụ:
<script> vartag_name=document.getElementById("message").tagName; //inratênthẻcủapchínhlàp document.write(tag_name);
script> 4.4. Thao tác với DOM sử dụng thuộc tính innerHTMLThuộc tính innerHTML(bên trong HTML) trả về mã HTML bên trong phần tử hiện tại. Đoạn mã HTML này là chuỗi kí tự chứa tất cả phần tử bên trong, bao gồm các node phần tử và node văn bản. Ví dụ:
<pid="messages1">p> <script> varvalue=document.getElementById("message").innerHTML; document.getElementById("messages1").innerHTML=value;
script> Đoạn mã này đơn giản là lấy nội dung trong phần tử này và gán nó vào phần tử khác. 4.5. Thao tác với DOM sử dụng thuộc tính outerHTMLTrả về mã HTML của phần tử hiện tại. Có thể hiểu là outerHTML = tagName + innerHTML Ví dụ, đây là tất cả mà outerHTML có thể lấy được.
Ví dụ: Thay thế phần tử h2 thành h3
<buttononclick="myFunction()">ThayđổiHeaderbutton> <script> functionmyFunction(){ document.getElementById("message").outerHTML=
" }
script> Như vậy, JavaScript sẽ tìm và thay thế toàn bộ h2 thành nội dung mà chúng ta gán cho nó. Có nghĩa là sau khi bất vào nút Thay đổi Header thì mã HTML sẽ trở thành như thế này:
<buttononclick="myFunction()">ThayđổiHeaderbutton> <script> functionmyFunction(){ document.getElementById("message").outerHTML=
" }
script> 4.6. Thao tác với DOM sử dụng thuộc tính attributesThuộc tính này sẽ trả về tập các thuộc tính của phần tử bạn nhắm đến mà nó nó như: id, name, type, title, href, . Ví dụ: Đầu tiên ta có HTML như sau.
<inputtype="button"id="btn"onclick="myFunction()"value="nhấnđểxem"/>
<pid="text">p> Bây giờ, ta có hàm như sau:
functionmyFunction(){ varx=document.getElementById("btn").attributes[3].name; document.getElementById("text").innerHTML=x; }
script> Cũng như mảng, thuộc tính này bắt đầu đếm từ 0 ở đây mình muốn xem tên thuộc tính thứ 4 thì sẽ gọi attributes[3] như vậy kết quả trả về là value 4.7. Thao tác với DOM sử dụng thuộc tính styleThuộc tính style được sử dụng để thiết lập CSS cho phần tử được nhắm đến. Ví dụ:
<buttononclick="myFunction()">Nhấnnútnàyđểchuyểnsangmàuđỏbutton> <script> functionmyFunction(){ //ThayđổimàucủathẻH1 document.getElementById("myH1").style.color="red"; }
script> Trong đó:
Nếu tên thuộc tính có từ 2 từ trở lên: Ví dụ trong CSS bạn biết background-color thì khi thiết lập style qua thuộc tính style này bạn sẽ cần viết là backgroundColor Lưu ý: Từtừ đầu tiên viết thường, các từ tiếp theo viết HOA chữ cái đầu tiên, không có dấu gạch ngang như trong CSS. Ví dụ. Trong CSS ta viết như thế này:
Nhưng khi thiết lập qua DOM với thuộc tính style thì ta cần ghi như sau:
Ví dụ thiết lập viền cho phần tử (thuộc tính CSS có nhiều giá trị):
Khi thực hiện thành công, style sẽ được thêm vào theo kiểu inlinetrên trình duyệt như thế này:
Đó, với DOM, bạn có thể thiết lập CSS cho phần tử mà không cần mở đến file CSS. 4.8. Một số thuộc tính quan hệTrong cây DOM, có rất nhiều các node có quan hệ với nhau như node cha, node anh chị em, node đầu tiên trong nhóm, node cuối cùng trong nhóm... Tóm lại, các mối quan hệ như thế này đều có các thuộc tính tương ứng để cho phép bạn sử dụng.
Ví dụ ta có HTML:
<li>HọcJavali> <liid="active">HọcJavaScriptli> <li>HọcPHPli> <li>HọcPytonli> <li>NIIT-ICTHàNộili> ul>
<divid="ketQua">div> Bây giờ, ta chọn đến node cha của thẻ li có id là active như thế này:
letx=document.getElementById("active").parentNode;
console.log(x.nodeName);//Kếtquả:UL Đối với các thuộc tính quan hệ khác thì cũng tương tự.
Ví dụ, trong trường hợp trên, ta lấy các phần tử li của thẻ ul
lety=document.getElementById("khoaHoc").childNodes; //Kiểmtraxemlấyđượcbaonhiêunode
console.log(y.length);//Kếtquả:11 > Lưu ý:Trong DOM, tất cả các phần của tài liệu, chẳng hạn như phần tử, thuộc tính, văn bản, v.v đều tính là node Do đó, tính cả các thẻ li, id, text ở trong thẻ ul trên ta có 11 node.
Ví dụ ta có HTML:
<divid="ketQua">div> Lấy phần tử đầu tiên trong ul
varlist=document.getElementById("khoaHoc").firstChild.innerHTML; //Gánnộidunglấyđượcvàothẻdiv
document.getElementById("ketQua").innerHTML=list; > Lưu ý: Nếu có khoảng trống ở trước phần tử đầu tiên (dấu cách, xuống dòng, tab...) thì kết quả trả về là undefined. Do đó bạn thấy mình phải đặt HTML như thế kia. Vẫn còn rất nhiều các phần tử quan hệ như thế này. Bạn có thể đọc kỹ thêm tại đây. Bên dưới đây mình có giải thích thêm một chút về một số node hay được sử dụng.
Mỗinodetrên cây DOM đều có 6 thuộc tính quan hệ để giúp bạn truy xuất gián tiếp theo vị trí củanode:
4.9. Một số phương thức phổ biến để thao tác với DOM khácNhư bạn đã biết, thông qua JavaScript chúng ta đã lấy được các phần tử HTML, thay đổi thuộc tính, thêm thuộc tính cho nó. Ngoài ra bạn cũng có thể:
Dưới đây là ví dụ thực hiện cho cả 3 phương thức trên. HTML:
<li>JavaScriptli> <li>JavaFullStackli> <li>PHPFullStackli> ul>
<buttononclick="themKhoaHoc()">ThêmKhóahọcbutton> Bây giờ ta sẽ tạo một hàm để thêm một khóa học mới:
//Tạothêmmộtđốitượngli varnode=document.createElement("li"); //Tạomộttextnode vartextnode=document.createTextNode("FullStackDEV"); //Thêmtextnodevàonodelivừatạo node.appendChild(textnode); //Thêmphầntửvừatạovàocuốiul document.getElementById("khoaHoc").appendChild(node);
} Bạn thử chạy trên trình duyệt xem. Kết quả như thế nào? Có thể thêm node thì cũng có thể xóa node với phương thức removeChild() Đầu tiên, ta thêm một button nữa:
Sau đó ta tạo một hàm xóa node đầu tiên trong ul:
//Chọnđếndanhsáchkhóahọc letkh=document.getElementById("khoaHoc"); //Xóaphầntửconđầutiên kh.removeChild(kh.childNodes[0]);
} Khi bấm vào nút Xóa khóa học thì nó sẽ xóa thẻ li đầu tiên trong ul, và cứ thế. Nhân tiện, tham khảo một số khóa học Lập trình tại NIIT - ICT Hà Nội để học lập trình web nhanh hơn:
|