ホームページ >ウェブフロントエンド >htmlチュートリアル >ドキュメント オブジェクト モデルDOM_html/css_WEB-ITnose
ドキュメント オブジェクト モデル DOM (ドキュメント オブジェクト モデル) は、HTML ドキュメントにアクセスして処理するための標準メソッドを定義します。 DOM は、HTML ドキュメントを要素、属性、テキストを含むツリー構造 (ノード ツリー) として表現します。
まず、次のコードを見てみましょう:
code1.png
HTML コードを DOM ノード階層図に分解します:
domlist.png
HTML ドキュメントは、ノードのコレクション、DOM ノードは次のとおりです。
要素ノード: 上の図では、100db36a723c770d327fc0aef2ce13b1、6c04bd5ca3fcae76e30b72ad730ca86d、e388a4556c0f65e1904146cc1a846bee などはすべて要素ノード、つまりラベルです。
テキスト ノード: JavaScript、DOM、CSS、および 25edfb22a4f469ecb59f1190150159c6...bed06894275b65c1ab86501b08a632eb 内のその他のテキストなど、ユーザーに表示されるコンテンツ。
属性ノード: 3499910bf9dac5ae3c52d5ede7383485 タグのリンク属性 href="http://www.imooc.com" などの要素属性。
节点属性:
Paste_Image.png
遍历节点树:
Paste_Image.png
以上图スル例,它的父上节点本体、子节点3li、その兄弟ノード h2 と P。
DOM 操作:
Paste_Image.png
注: 最初の 2 つはドキュメント メソッドです。
要素ノードの属性名を通じて属性の値を取得します。
文法:
elementNode.getAttribute(name)setAttribute()方法setAttribute() 方法增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。
文法:
elementNode.setAttribute(name,value)
説明:
1.name: 設定する属性の名前。
2.value: 設定する属性値。
注:
1. 指定された属性を指定された値に設定します。指定された名前のプロパティが存在しない場合、このメソッドは新しいプロパティを作成します。
2. getAttribute() メソッドと同様に、setAttribute() メソッドは要素ノード オブジェクトの関数を通じてのみ呼び出すことができます。
ノードのプロパティ ドキュメント オブジェクト モデル (DOM) では、各ノードはオブジェクトです。 DOM ノードには 3 つの重要な属性があります:
nodeName: ノードの名前
nodeValue: ノードの値
nodeType: ノードのタイプ
1. nodeName 属性:ノードの名前は読み取りのみです。
2. nodeValue 属性: ノード 値
3. nodeType 属性: ノードのタイプ。読み取り専用です。以下の一般的に使用されるノード タイプ:
要素タイプ ノード タイプ 要素 -------1 属性 -------2 テキスト -------3 コメント ------- 8 ドキュメント-------9
構文:
elementNode.childNodes注:
選択したノードに子ノードがない場合、このプロパティはノードを含まない NodeList を返します。
次のコードを見てみましょう:
Paste_Image.png
実行結果:
IE:
Paste_Image.png
コードを次のように変更すると:
<ul><li>javascript</li><li>jQuery</li><li>PHP</li></ul>実行結果: ( IE 結果は他のブラウザと同じです)
1。firstChild属性は「childNodes」を返します。 ' 配列 最初の子ノード。選択したノードに子ノードがない場合、このプロパティは NULL を返します。
構文:
说明:与elementNode.childNodes[0]是同样的效果。 二、 lastChild 属性返回‘childNodes’数组的最后一个子节点。如果选定的节点没有子节点,则该属性返回 NULL。语法:```node.lastChild説明: elementNode.childNodes[elementNode.childNodes.length-1] と同じ効果があります。
注: 前のセクションでは、Internet Explorer はノード間に生成された空白テキスト ノードを無視しますが、他のブラウザは無視しないことを学びました。ノード タイプを検出することで、子ノードをフィルタリングできます。 (後の章で説明します)
親ノードparentNodeにアクセスします
構文:
注意:父节点只能有一个。看看下面的例子,获取 P 节点的父节点,代码如下:<div id="text"> <p id="con"> parentNode 获取指点节点的父节点</p></div> <script type="text/javascript"> var mynode= document.getElementById("con"); document.write(mynode.parentNode.nodeName);</script>実行結果:
parentNode 获取指点节点的父节点DIV祖先ノードにアクセスします:
elementNode.parentNode.parentNode次のコードを見てください。
<div id="text"> <p> parentNode <span id="con"> 获取指点节点的父节点</span> </p></div> <script type="text/javascript"> var mynode= document.getElementById("con"); document.write(mynode.parentNode.parentNode.nodeName);</script>実行結果 :
parentNode获取指点节点的父节点DIV注: ブラウザの互換性の問題により、Chrome や Firefox などのブラウザのタブ間のスペースもテキスト ノードとみなされます。
nodeObject.nextSibling说明:如果无此节点,则该属性返回 null。
nodeObject.previousSibling说明:如果无此节点,则该属性返回 null。
注意: 两个属性获取的是节点。Internet Explorer 会忽略节点间生成的空白文本节点(例如,换行符号),而其它浏览器不会忽略。
解决问题方法:
判断节点nodeType是否为1, 如是为元素节点,跳过。
Paste_Image.png
在指定节点的最后一个子节点列表之后添加一个新的子节点。
语法:
appendChild(newnode)
参数:
newnode:指定追加的节点。
我们来看看,div标签内创建一个新的 P 标签,代码如下:
Paste_Image.png
运行结果:
HTMLJavaScriptThis is a new p
insertBefore() 方法可在已有的子节点前插入一个新的子节点。
语法:
insertBefore(newnode,node);
参数:
newnode: 要插入的新节点。
node: 指定此节点前插入节点。
我们在来看看下面代码,在指定节点前插入节点。
Paste_Image.png
运行结果:
This is a new pJavaScriptHTML
注意:
otest.insertBefore(newnode,node); 也可以改为: otest.insertBefore(newnode,otest.childNodes[0]);
removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL。
语法:
nodeObject.removeChild(node)
参数:
node :必需,指定需要删除的节点。
我们来看看下面代码,删除子点。
Paste_Image.png
运行结果:
HTML删除节点的内容: javascript
注意: 把删除的子节点赋值给 x,这个子节点不在DOM树中,但是还存在内存中,可通过 x 操作。
如果要完全删除对象,给 x 赋 null 值,代码如下:
Paste_Image.png
replaceChild 实现子节点(对象)的替换。返回被替换对象的引用。
语法:
node.replaceChild (newnode,oldnew )
参数:
newnode : 必需,用于替换 oldnew 的对象。oldnew : 必需,被 newnode 替换的对象。
我们来看看下面的代码:
Paste_Image.png
效果: 将文档中的 Java 改为 JavaScript。
注意:
createElement()方法可创建元素节点。此方法可返回一个 Element 对象。
语法:
document.createElement(tagName)
参数:
tagName:字符串值,这个字符串用来指明创建元素的类型。
注意:要与appendChild() 或 insertBefore()方法联合使用,将元素显示在页面中。
我们来创建一个按钮,代码如下:
<script type="text/javascript"> var body = document.body; var input = document.createElement("input"); input.type = "button"; input.value = "创建一个按钮"; body.appendChild(input); </script>
效果:在HTML文档中,创建一个按钮。
我们也可以使用setAttribute来设置属性,代码如下:
<script type="text/javascript"> var body= document.body; var btn = document.createElement("input"); btn.setAttribute("type", "text"); btn.setAttribute("name", "q"); btn.setAttribute("value", "使用setAttribute"); btn.setAttribute("onclick", "javascript:alert('This is a text!');"); body.appendChild(btn); </script>
效果:在HTML文档中,创建一个文本框,使用setAttribute设置属性值。 当点击这个文本框时,会弹出对话框“This is a text!”。
createTextNode() 方法创建新的文本节点,返回新创建的 Text 节点。
语法:
document.createTextNode(data)
参数:
data : 字符串值,可规定此节点的文本。
我们来创建一个dc6dce4a544fdca2df29d5ac0ea9906b元素并向其中添加一条消息,代码如下:
Paste_Image.png
运行结果:
Paste_Image.png
获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:
一、对于IE9+、Chrome、Firefox、Opera 以及 Safari:
• window.innerHeight - 浏览器窗口的内部高度
• window.innerWidth - 浏览器窗口的内部宽度
二、对于 Internet Explorer 8、7、6、5:
• document.documentElement.clientHeight表示HTML文档所在窗口的当前高度。
• document.documentElement.clientWidth表示HTML文档所在窗口的当前宽度。
或者
Document对象的body属性对应HTML文档的6c04bd5ca3fcae76e30b72ad730ca86d标签
• document.body.clientHeight
• document.body.clientWidth
在不同浏览器都实用的 JavaScript 方案:
var w= document.documentElement.clientWidth || document.body.clientWidth;var h= document.documentElement.clientHeight || document.body.clientHeight;
网页尺寸scrollHeightscrollHeight和scrollWidth,获取网页内容高度和宽度。
一、针对IE、Opera:
scrollHeight 是网页内容实际高度,可以小于 clientHeight。
二、针对NS、FF:
scrollHeight 是网页内容高度,不过最小值是 clientHeight。也就是说网页内容实际高度小于 clientHeight 时,scrollHeight 返回 clientHeight 。
三、浏览器兼容性
var w=document.documentElement.scrollWidth || document.body.scrollWidth;var h=document.documentElement.scrollHeight || document.body.scrollHeight;注意:区分大小写
scrollHeight和scrollWidth还可获取Dom元素中内容实际占用的高度和宽度。
offsetHeight和offsetWidth,获取网页内容高度和宽度(包括滚动条等边线,会随窗口的显示大小改变)。
一、值
offsetHeight = clientHeight + 滚动条 + 边框。
二、浏览器兼容性
var w= document.documentElement.offsetWidth || document.body.offsetWidth;var h= document.documentElement.offsetHeight || document.body.offsetHeight;
网页卷去的距离与偏移量我们先来看看下面的图:
Paste_Image.png
scrollLeft:设置或获取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离 ,即左边灰色的内容。
scrollTop:设置或获取位于对象最顶端与窗口中可见内容的最顶端之间的距离 ,即上边灰色的内容。
offsetLeft:获取指定对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置 。
offsetTop:获取指定对象相对于版面或由 offsetParent 属性指定的父坐标的计算顶端位置 。
注意:
区分大小写
offsetParent:布局中设置postion属性(Relative、Absolute、fixed)的父容器,从最近的父节点开始,一层层向上找,直到HTML的body。
<!DOCTYPE html><html> <head> <title> new document </title> <meta http-equiv="Content-Type" content="text/html; charset=gbk"/> <script type="text/javascript"> window.onload = function(){ var tr=document.getElementsByTagName("tr"); for(var i= 0;i<tr.length;i++) { bgcChange(tr[i]); } // 鼠标移动改变背景,可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。 } function bgcChange(obj) { obj.onmouseover=function(){ obj.style.backgroundColor="#f2f2f2"; } obj.onmouseout=function(){ obj.style.backgroundColor="#fff"; } } // 编写一个函数,供添加按钮调用,动态在表格的最后一行添加子节点; function add(){ var newtr=document.createElement("tr"); var xhtd=document.createElement("td"); newtr.appendChild(xhtd); var xmtd=document.createElement("td"); newtr.appendChild(xmtd); var cztd=document.createElement("td"); newtr.appendChild(cztd); var de=document.createElement("a"); de.setAttribute("href","javascript:;"); de.setAttribute("onclick","del(this);"); de.innerHTML="删除"; cztd.appendChild(de); document.getElementById("table").appendChild(newtr); } // 创建删除函数 function del(obj){ var trNode=obj.parentNode.parentNode; trNode.parentNode.removeChild(trNode); } </script> </head> <body> <table border="1" width="50%" id="table"> <tr> <th>学号</th> <th>姓名</th> <th>操作</th> </tr> <tr> <td>xh001</td> <td>王小明</td> <td><a href="javascript:;" onclick="del(this);" >删除</a></td> <!--在删除按钮上添加点击事件 --> </tr> <tr> <td>xh002</td> <td>刘小芳</td> <td><a href="javascript:;" onclick="del(this);" >删除</a></td> <!--在删除按钮上添加点击事件 --> </tr> </table> <input type="button" value="添加一行" onclick="add()" /> <!--在添加按钮上添加点击事件 --> </body></html>