ホームページ >ウェブフロントエンド >htmlチュートリアル >ドキュメント オブジェクト モデルDOM_html/css_WEB-ITnose

ドキュメント オブジェクト モデルDOM_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:16:301130ブラウズ

DOM を理解する

ドキュメント オブジェクト モデル DOM (ドキュメント オブジェクト モデル) は、HTML ドキュメントにアクセスして処理するための標準メソッドを定義します。 DOM は、HTML ドキュメントを要素、属性、テキストを含むツリー構造 (ノード ツリー) として表現します。

まず、次のコードを見てみましょう:

code1.png

HTML コードを DOM ノード階層図に分解します:

domlist.png

HTML ドキュメントは、ノードのコレクション、DOM ノードは次のとおりです。

  1. 要素ノード: 上の図では、100db36a723c770d327fc0aef2ce13b1、6c04bd5ca3fcae76e30b72ad730ca86d、e388a4556c0f65e1904146cc1a846bee などはすべて要素ノード、つまりラベルです。

  2. テキスト ノード: JavaScript、DOM、CSS、および 25edfb22a4f469ecb59f1190150159c6...bed06894275b65c1ab86501b08a632eb 内のその他のテキストなど、ユーザーに表示されるコンテンツ。

  3. 属性ノード: 3499910bf9dac5ae3c52d5ede7383485 タグのリンク属性 href="http://www.imooc.com" などの要素属性。

节点属性:

Paste_Image.png

遍历节点树:

Paste_Image.png

以上图スル例,它的父上节点本体、子节点3li、その兄弟ノード h2 と P。

DOM 操作:

Paste_Image.png

注: 最初の 2 つはドキュメント メソッドです。

getAttribute() メソッド

要素ノードの属性名を通じて属性の値を取得します。

文法:

elementNode.getAttribute(name)setAttribute()方法setAttribute() 方法增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。

文法:

elementNode.setAttribute(name,value)

説明:

1.name: 設定する属性の名前。

2.value: 設定する属性値。

注:

1. 指定された属性を指定された値に設定します。指定された名前のプロパティが存在しない場合、このメソッドは新しいプロパティを作成します。

2. getAttribute() メソッドと同様に、setAttribute() メソッドは要素ノード オブジェクトの関数を通じてのみ呼び出すことができます。

ノードのプロパティ ドキュメント オブジェクト モデル (DOM) では、各ノードはオブジェクトです。 DOM ノードには 3 つの重要な属性があります:

  1. nodeName: ノードの名前

  2. nodeValue: ノードの値

  3. nodeType: ノードのタイプ

1. nodeName 属性:ノードの名前は読み取りのみです。

  1. 要素ノードのnodeNameはラベル名と同じです
  2. 属性ノードのnodeNameは属性の名前です
  3. テキストノードのnodeNameは常に#textです
  4. ドキュメントノードのnodeNameは常に #document

2. nodeValue 属性: ノード 値

  1. 要素ノードのノード値は未定義または null です
  2. テキスト ノードのノード値はテキストそのものです
  3. 属性ノードのノード値は属性の値

3. nodeType 属性: ノードのタイプ。読み取り専用です。以下の一般的に使用されるノード タイプ:

要素タイプ ノード タイプ 要素 -------1 属性 -------2 テキスト -------3 コメント ------- 8 ドキュメント-------9

子ノード childNodes にアクセスします

選択した要素ノードの下にあるすべての子ノードのリストにアクセスします。戻り値は、length 属性を持つ配列と見なされます。

構文:

elementNode.childNodes注:

選択したノードに子ノードがない場合、このプロパティはノードを含まない NodeList を返します。

次のコードを見てみましょう:

Paste_Image.png

実行結果:

IE:

    UL 子ノードの数: 3
  • ノード タイプ: 1
その他のブラウザ:

    UL子ノードの数: 7
  • ノードタイプ: 3
注:

    すべてのIEシリーズ、Firefox、chrome、opera、safariとの互換性の問題
  1. Firefox、chrome、ノード間のスペース文字Opera および Safari ブラウザはテキスト ノードであるため、以下の図に示すように、IE は 3、その他のブラウザは 7 になります:

Paste_Image.png

コードを次のように変更すると:

<ul><li>javascript</li><li>jQuery</li><li>PHP</li></ul>

実行結果: ( IE 結果は他のブラウザと同じです)

    UL子ノードの数: 3
  • ノードタイプ: 1
子ノードの最初と最後の項目にアクセスします

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 などのブラウザのタブ間のスペースもテキスト ノードとみなされます。

访问兄弟节点

  1. nextSibling 属性可返回某个节点之后紧跟的节点(处于同一树层级中)。语法:
    nodeObject.nextSibling
    说明:如果无此节点,则该属性返回 null。
  2. previousSibling 属性可返回某个节点之前紧跟的节点(处于同一树层级中)。语法:
    nodeObject.previousSibling
    说明:如果无此节点,则该属性返回 null。

注意: 两个属性获取的是节点。Internet Explorer 会忽略节点间生成的空白文本节点(例如,换行符号),而其它浏览器不会忽略。

解决问题方法:

判断节点nodeType是否为1, 如是为元素节点,跳过。

Paste_Image.png

插入节点appendChild()

在指定节点的最后一个子节点列表之后添加一个新的子节点。

语法:

appendChild(newnode)

参数:

newnode:指定追加的节点。

我们来看看,div标签内创建一个新的 P 标签,代码如下:

Paste_Image.png

运行结果:

HTMLJavaScriptThis is a new p

插入节点insertBefore()

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()

removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL。

语法:

nodeObject.removeChild(node)

参数:

node :必需,指定需要删除的节点。

我们来看看下面代码,删除子点。

Paste_Image.png

运行结果:

HTML删除节点的内容: javascript

注意: 把删除的子节点赋值给 x,这个子节点不在DOM树中,但是还存在内存中,可通过 x 操作。

如果要完全删除对象,给 x 赋 null 值,代码如下:

Paste_Image.png

替换元素节点replaceChild()

replaceChild 实现子节点(对象)的替换。返回被替换对象的引用。

语法:

node.replaceChild (newnode,oldnew )

参数:

newnode : 必需,用于替换 oldnew 的对象。oldnew : 必需,被 newnode 替换的对象。

我们来看看下面的代码:

Paste_Image.png

效果: 将文档中的 Java 改为 JavaScript。

注意:

  1. 当 oldnode 被替换时,所有与之相关的属性内容都将被移除。
  2. newnode 必须先被建立。

创建元素节点createElement

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

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

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 属性指定的父坐标的计算顶端位置 。

注意:

  1. 区分大小写

  2. 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>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。