Rumah > Artikel > hujung hadapan web > Asas DOM JavaScript_Pengetahuan Asas
DOM(Document Object Model)即文档对象模型,针对HTML和XML文档的API(应用程序接口);
DOM描绘了一个层次化的节点树,运行开发人员可以添加/移除和修改页面的某一部分;
一 DOM介绍
D(文档):可以理解为整个Web加载的网页文档;
O(对象):可以理解为类似window对象之类的东西,可以调用属性和方法,这里说的是document对象;
M(模型):可以理解为网页文档的树形结构;
1.节点
加载HTML页面时,Web浏览器生成一个树形结构,用来表示页面内部结构;
DOM将这种节点结构理解为由节点组成;
html元素为根节点;head元素是html的子节点;meta元素和title元素之间是兄弟关系;
2.节点种类:元素节点/文本节点/属性节点
eb47a3572d93e4bf98afb55cb24837c5测试Div16b28748ea4df4d9c2150843fecfba68
Nod elemen => div;
Nod atribut => title="Atribut Elemen"
Nod teks => Uji Div 2 Cari elemen
W3C menyediakan kaedah dan atribut yang agak mudah dan mudah untuk mengesan nod supaya kami boleh mengendalikan nod dengan cepat;
DOM (Document Object Model) ialah model objek dokumen, API (antara muka program aplikasi) untuk dokumen HTML dan XML;
Kaedah carian nod elemen
Kaedah
getElementById() Dapatkan nod elemen ID tertentu;
getElementsByTagName() Dapatkan senarai nod elemen yang sama;
getElementsByName() Dapatkan senarai nod dengan nama yang sama;
getAttribute() Dapatkan nilai atribut nod bagi elemen tertentu;
setAttribute() Tetapkan nilai atribut nod bagi elemen tertentu;
removeAttribute() mengalih keluar atribut nod bagi elemen tertentu;
//Kaedah menerima parameter: dapatkan ID elemen;
// Jika elemen yang sepadan ditemui, kembalikan objek HTMLDivElement elemen jika ia tidak wujud, kembalikan
Document.getElementById('box'); // [objek HTMLDivElement];
// Apabila kita memperoleh nod elemen tertentu melalui getElementById(), objek nod ini diperolehi oleh kami;
// Melalui objek nod ini, kita boleh mengakses satu siri sifatnya;
(1). Akses atribut nod elemen
Perihalan Atribut
tagName Dapatkan nama tag nod elemen;
innerHTML Dapatkan kandungan dalam nod elemen, spesifikasi DOM bukan W3C;
Document.getElementById('box').tagName; // =>DIV;
Document.getElementById('box').innerHTML; // =>Test Div;
(2).Akses atribut biasa HTML
Perihalan Atribut
nama id nod elemen;
tajuk Nilai atribut tajuk nod elemen;
className Kelas elemen CSS;
document.getElementById('box').id; // =>id;
Document.getElementById('box').title; // Dapatkan tajuk;
document.getElementById('box').style; // Dapatkan objek CSSStyleDeclaration;
document.getElementById('box').className; // Dapatkan kelas;
document.getElementById('box').bbb; // Dapatkan nilai atribut tersuai, tidak disokong oleh bukan IE;
2.getElementsByTagName()
//Kaedah mengembalikan tatasusunan HTMLCollection (NodeList) tatasusunan objek, yang menyimpan senarai nod dengan nama elemen yang sama
Document.getElementsByTagName('*'); // Gunakan kad bebas untuk mendapatkan semua elemen;
// PS: Apabila IE menggunakan kad bebas, ia akan menganggap pernyataan spesifikasi HTML pada permulaan dokumen sebagai nod elemen pertama;
Document.getElementsByTagName('li').[0]; // Dapatkan elemen li pertama;
3.getElementsByName()
Dapatkan elemen dengan tetapan nama (nama) yang sama dan kembalikan tatasusunan objek HTMLCollection (NodeList).
Document.getElementsByName('add'); // Dapatkan koleksi elemen input dengan name='add';
// PS: Untuk atribut yang tidak sah dalam HTML, akan terdapat perbezaan dalam keserasian yang diperoleh oleh JS
// IE menyokong atribut nama sah, tetapi akan terdapat isu ketidakserasian dengan atribut tersuai;
Kaedah akan mendapat nilai atribut dalam elemen
Tetapi ia agak berbeza daripada kaedah menggunakan ".attr" secara langsung untuk mendapatkan nilai atribut;
Document.getElementById('box').getAttribute('mydiv'); // Dapatkan nilai atribut tersuai;
Document.getElementById('box').mydiv; // Dapatkan nilai atribut tersuai, hanya disokong oleh IE;
5.setAttribute()
Kaedah akan menetapkan atribut dan nilai dalam elemen; ia menerima dua parameter: nama atribut dan nilai
Jika atribut itu sendiri sudah wujud, ia akan ditimpa
Document.getElementById('box').setAttribute('align','center'); // Tetapkan atribut dan nilai;
// PS: Dalam IE7 dan ke bawah, menggunakan kaedah setAttribute() untuk menetapkan atribut kelas dan gaya tidak mempunyai kesan;
6.removeAttribute()
Kaedah
Document.getElementById('box').removeAttribute('style'); // Alih keluar atribut gaya;
Tiga nod DOM
1.sifat nod nod //Nod boleh dibahagikan kepada: nod elemen/nod atribut dan nod teks;
// Nod ini mempunyai tiga atribut: nodeName/nodeType dan nodeValue;Atribut nod maklumat
Jenis nod nodName nodeType nodeValue
Nama Unsur unsur 1 null
Kandungan Teks
Document.getElementById('box').nodeType; // => Element nod;
2. Atribut nod hierarki
// Nod hierarki boleh dibahagikan kepada: nod induk dan nod anak/nod adik beradik;
// Apabila kita mendapat salah satu nod elemen, kita boleh menggunakan atribut nod hierarki untuk mendapatkan nod tahap yang berkaitan;
Atribut nod hierarki
Perihalan Atribut
childNodes Baca semua nod anak nod elemen semasa;
firstChild Baca nod anak pertama nod elemen semasa;
lastChild Dapatkan nod anak terakhir nod elemen semasa;
ownerDocument Mendapat nod akar dokumen nod, yang bersamaan dengan dokumen;
parentNode Dapatkan nod induk nod semasa;
previousSibling Dapatkan nod adik beradik sebelumnya bagi nod semasa;
nextSibling Dapatkan nod adik beradik seterusnya bagi nod semasa;
atribut Dapatkan set semua nod atribut nod elemen semasa;
(1).sifat childNodes
Atribut mendapat semua nod anak bagi nod elemen tertentu ini termasuk nod elemen dan nod teks
PS: Apabila menggunakan childNodes[n] untuk mengembalikan objek nod anak, adalah mungkin untuk mengembalikan nod anak elemen, seperti: HTMLElement;
Ia juga mungkin mengembalikan sub-nod teks, seperti: Teks
Subnod elemen boleh menggunakan nodeName atau tagName untuk mendapatkan nama tag; subnod teks boleh diperoleh menggunakan nodeValue;
var box = document.getElementById('box');
for(var i=0; ic6ea66d172b03a819b40a7db1916211eabc128dba7a3a77be0113eb0bea6ea0a5d0';
box.innerHTML = '8e99a69fbe029cd4e2b854e244eab143abc128dba7a3a77be0113eb0bea6ea0a5d0';
(2).Atribut anak pertama dan anak terakhir
lastChild = childNodes[box.childNodes.length-1]; Dapatkan nod anak terakhir bagi elemen semasa;
(3).ownerDocument property
Mengembalikan nod akar objek dokumen bagi nod Objek yang dikembalikan adalah bersamaan dengan dokumen;
(4).parentNode/previousSibling/nextSibling properties
parentNode: Mengembalikan nod induk nod ini;
previousSibling: Mengembalikan nod adik beradik sebelumnya bagi nod ini;
nextSibling: Mengembalikan nod adik beradik seterusnya bagi nod ini;
alert(box.parentNode.nodeName); // Dapatkan nama label nod induk;
alert(box.firstChild.nextSibling); // Dapatkan nod kedua;
alert(box.lastChild.previousSibling); // Dapatkan nod kedua;
(5).atribut atribut
alert(document.getElementById('box').attributes); // =>NamedNodeMap;
(6). Abaikan nod teks kosong
var body = document.getElementsByTagName('body')[0];// 获取body元素节点; alert(body.childNodes.length); // 非IE=7; IE=3; // PS:在非IE中,标准的DOM具有识别空白文本节点的功能,而IE自动忽略了; function filterSpaceNode1(nodes){ // 新数组; var ret = []; for(var i=0; i<nodes.length; i++){ // 如果识别到空白文本节点,就不添加到数组; if(nodes[i].nodeType ===3 && /^\s+$/.test(nodes[i].nodeValue)) continue; // 把每次的元素节点,添加到数组里; ret.push(nodes[i]); } return ret; } // PS:上面的方法,采用忽略空白文件节点的方法,把得到的元素节点累加到数组里返回; function filterSpaceNode2(nodes){ for(var i=0; i<nodes.length; i++){ if(nodes[i].nodeType ===3 && /^\s+$/.test(nodes[i].nodeValue)){ // 得到空白节点之后,一道父节点上,删除子节点; nodes[i].parentNode.removeChild(nodes[i]); } } return nodes; } // PS:firstChild等方法在获取节点时遇到空白节点,处理方法; function removeWhileNode(nodes){ for(var i=0; i<nodes.childNodes.length; i++){ if(nodes.childNodes[i].nodeType ===3 && /^\s+$/.test(nodes.childNodes[i].nodeValue)){ nodes.childNodes[i].parentNode.removeChild(nodes.childNodes[i]); } } return nodes; }
// DOM bukan sahaja boleh mencari nod, tetapi juga mencipta nod/menyalin nod/memasukkan nod/memadam nod dan menggantikan nod
Kaedah operasi nod
write() Kaedah ini boleh memasukkan sebarang rentetan ke dalam dokumen;
createElement() Cipta nod elemen;
appendChild() Menambahkan nod baharu pada penghujung senarai nod anak;
createTextNode() Cipta nod fail;
insertBefore() Masukkan nod baharu di hadapan;
replaceChild() Gantikan nod lama dengan nod baharu;
cloneNode() Salin nod;
removeChild() Alih keluar nod;
//Kaedah write() boleh memasukkan sebarang rentetan ke dalam dokumen;
document.write('e388a4556c0f65e1904146cc1a846beeIni adalah perenggan!94b3e26ee717c64999d7867364b1b4a3'); // Teks yang dihuraikan;
(2).createElement() kaedah
Kaedah createElement() boleh mencipta nod elemen;
document.createElement('p'); // [objek HTMLParagraphElement];
(3).appendChild() kaedah
Kaedah appendChild() menambah nod baharu pada penghujung senarai nod anak nod;
var box = document.getElementById('box');
var p = document.createElement('p'); // Cipta nod elemen baharue388a4556c0f65e1904146cc1a846bee;
box.appendChild(p); //Tambahkan nod elemen baharu e388a4556c0f65e1904146cc1a846bee
(4).createTextNode() kaedah
Kaedah ini mencipta nod teks;
(5).kaedah insertBefore()
// 该方法可以把节点添加到指定节点的前面; box.parentNode.insertBefore(p,box); // 在<div>之前添加一个<p>; box.insertBefore(newNode,null); // 将newNode添加到box自列表的最后节点; //PS:insertBefore()方法可以给当前元素的前面创建一个节点,但没有提供给当前元素的后面创建一个节点; function insertAfter(newElement,targetElement){ // 得到父节点; var parent = targetElement.parentNode; // 如果最后一个子节点是当前元素,那么直接添加即可; if(parent.lastChild === targetElement){ parent.appendChild(newElement); }else{ // 否则,在当前节点的下一个节点之前添加;达成在当前节点后面添加节点的需求; parentNode.insertBefore(newElement,targetElement.nextSibling); } }
box.parentNode.replaceChild(p,box); // Gantikan dc6dce4a544fdca2df29d5ac0ea9906b dengan e388a4556c0f65e1904146cc1a846bee;
(7).cloneNode() kaedah
// Kaedah ini boleh menyalin nod anak; salinan nod yang dikembalikan selepas penyalinan adalah milik dokumen, tetapi tiada nod induk ditetapkan untuknya;
// Parameter adalah benar: lakukan salinan dalam, iaitu untuk menyalin nod dan keseluruhan pepohon nod anaknya;
// Parameter adalah palsu: lakukan salinan cetek, hanya salin nod itu sendiri;
var box = document.getElementById('box');
box.appendChild(clone); // Tambahkan pada penghujung senarai nod anak;
(8).kaedah removeChild()
Kaedah ini memadamkan nod yang ditentukan;
box.parentNode.removeChild(box);
Ringkasan: Dalam bab seterusnya~