[转]JavaScript高级应用:使用DOM技术操纵文档

本文详细介绍了如何使用DOM API来创建、克隆、插入、删除及替换HTML文档中的元素。包括使用data、nodeValue和src属性修改文本节点和图片源,以及createElement、cloneNode、appendChild等方法的应用。
在前端展现越来越丰富的今天,DOM对象可以说变得非常重要(其实一直都重要),下面转摘一篇写的不错的文档,供大家以后查阅:

使用data、nodeValue和src属性 DOM 提供了2个属性用于修改文本节点的内容,它们是data和nodeVaule。2个属性实现的功能相同,语法是:object.data="new value"或者object.nodeVaule="new value",其中object代表页面中的文本项节点。如果修改图形文件的内容,语法是:object.src="new value",其中object表示页面中的img标记节点。来看看下面的例子:
[code]<HTML><HEAD><TITLE> DOM Demo </title></HEAD>
<BODY ID="bodyNode">

This is the document body

<P ID = "p1Node">This is paragraph 1.</P>

<P ID = "p2Node">This is paragraph 2.</P>

<P ID = "p3Node">This is paragraph 3.

<IMG ID = "imgNode" SRC="myexam.gif">This text follows the image

<TABLE ID="tableNode">

<TR><TD BGCOLOR=yellow>This is row 1, cell 1</TD><TD BGCOLOR=orange>This is row 1, cell 2</TD></TR>

<TR><TD BGCOLOR=red>This is row 2, cell 1</TD><TD BGCOLOR=magenta>This is row 2, cell 2</TD></TR>

<TR><TD BGCOLOR=lightgreen>This is row 3, cell 1</TD><TD BGCOLOR=beige>This is row 3, cell 2</TD></TR>

</TABLE>

</P>

<P ID = "p4Node">This is paragraph 4.</P>


<SCRIPT LANGUAGE="JavaScript">

<!--

alert(

"页面初始状态" + "\n\n" +

"bodyNode.firstChild.nodeValue = " + bodyNode.firstChild.nodeValue + "\n" +

"bodyNode.firstChild.data = " + bodyNode.firstChild.data + "\n"

);


bodyNode.firstChild.nodeValue = "This is the new document body, set by the nodeValue property";

p3Node.childNodes[1].src = "myexam2.gif";


alert(

"对页面内容进行修改后" + "\n\n" +

"bodyNode.firstChild.nodeValue = " + bodyNode.firstChild.nodeValue + "\n" +

"bodyNode.firstChild.data = " + bodyNode.firstChild.data + "\n" +

"p3Node.childNodes[1].src = " + p3Node.childNodes[1].src

);

// -->

</SCRIPT></BODY></HTML>[/code]


上述代码首先显示页面的初始内容以及节点p1Node的相关属性值,然后对节点bodyNode的第1个孩子节点的nodeValue属性进行赋值修改其文本内容,对节点p3Node的第2个孩子节点(也就是了img标记)的src属性进行赋值修改图形的内容。 使用createElement方法 createElement 方法的功能是在文档中创建一个孤立HTML标记节点。孤立节点既没有孩子节点也没有双亲节点,而且与文档中的现存节点也互不关联。被创建的孤立HTML标记节点的唯一信息就是它代表的HTML标记,比如< P>、< FONT>和< TABLE>。CreateElement的语法为document.createElement(HTMLTag),HTMLTag表示要创建的 HTML标记,返回值是创建的孤立HTML标记节点。来看看下面的例子:
[code]<HTML><HEAD><TITLE> DOM Demo </title></HEAD>

<BODY ID="bodyNode">

<SCRIPT LANGUAGE="JavaScript">

<!--

alert("页面初始状态");

tableObj = document.createElement("TABLE");

tbodyObj = document.createElement("TBODY");

trObj = document.createElement("TR");

tdObj = document.createElement("TD");

alert(

"对页面内容进行修改后" + "\n" +

"bodyNode.firstChild = " + bodyNode.firstChild + "\n" +

"tableObj.nodeName = " + tableObj.nodeName + "\n" +

"tbodyObj.nodeName = " + tbodyObj.nodeName + "\n" +

"trObj.nodeName = " + trObj.nodeName + "\n" +

"tdObj.nodeName = " + tdObj.nodeName + "\n" +

"tableObj = " + tableObj + "\n"

);

// -->

</SCRIPT>

</BODY>

</HTML>[/code]

上述代码在文档中创建了4个孤立HTML标记节点tableObj、tbodyObj、trObj和tdObj,它们就象太空中4颗人造卫星一样,彼此间以及和文档中的现有节点间都互不关联。创建孤立节点的目的不是为了让它真正孤立,随后我们会介绍如何将创建的孤立节点彼此相连,并添加到文档的DOM Tree结构中。 使用cloneNode方法 cloneNode方法的功能是通过克隆(也就是复制)文档中一个现存节点的方式创建文档的一个孤立节点。根据被克隆节点的类型,新创建的孤立节点或者是HTML标记节点,或者是包含字符串信息的文本项节点。 cloneNode的语法为oldNode.createNode(false)或者oldNode.createNode(true),oldNode 表示被克隆的节点,返回值是新创建的节点,false表示仅仅克隆oldNode,true表示克隆oldNode并包含其下属节点。来看看下面的例子:
[code]<HTML><HEAD><TITLE> DOM Demo </title></HEAD>

<BODY ID="bodyNode">

<SCRIPT LANGUAGE="JavaScript">

<!--

alert("页面初始状态");

tableObj = document.createElement("TABLE");

tbodyObj = document.createElement("TBODY");


tr1Obj = document.createElement("TR");

tr2Obj = tr1Obj.cloneNode(false);

tr3Obj = tr1Obj.cloneNode(false);


tr1td1Obj = document.createElement("TD");

tr1td2Obj = tr1td1Obj.cloneNode(false);

tr2td1Obj = tr1td1Obj.cloneNode(false);

tr2td2Obj = tr1td1Obj.cloneNode(false);

tr3td1Obj = tr1td1Obj.cloneNode(false);

tr3td2Obj = tr1td1Obj.cloneNode(false);


row1cell1Obj = document.createTextNode("This is row 1, cell 1");

row1cell2Obj = row1cell1Obj.cloneNode(false);

row2cell1Obj = row1cell1Obj.cloneNode(false);

row2cell2Obj = row1cell1Obj.cloneNode(false);

row3cell1Obj = row1cell1Obj.cloneNode(false);

row3cell2Obj = row1cell1Obj.cloneNode(false);


row1cell2Obj.nodeValue = "This is row 1, cell 2";

row2cell1Obj.nodeValue = "This is row 2, cell 1";

row2cell2Obj.nodeValue = "This is row 2, cell 2";

row3cell1Obj.nodeValue = "This is row 3, cell 1";

row3cell2Obj.nodeValue = "This is row 3, cell 2";

alert(

"对页面内容进行修改后" + "\n" +

"row1cell2Obj.firstChild = " + row1cell2Obj.firstChild+ "\n" +

"row1cell2Obj = " + row1cell2Obj + "\n" +

"row3cell2Obj.nodeValue = " + row3cell2Obj.nodeValue + "\n" +

"tr3td2Obj.nodeName = " + tr3td2Obj.nodeName + "\n"

);

// -->

</SCRIPT></BODY></HTML>[/code]


上述代码中值得注意的是对文本项节点的处理方式: 1、首先,使用语句row1cell1Obj = document.createTextNode("This is row 1, cell 1")创建单元格(1,1)所在节点; 2、然后使用语句row1cell1Obj.cloneNode(false)分别创建其他单元格节点; 3、最后,使用语句node.nodeValue = string分别为不同单元格赋值。使用appendChild方法 appendChild 方法的功能是在2个节点间建立起父子关系,如果作为父亲的节点已经具有了孩子节点,那么新添加的孩子节点被追加为最后一个孩子,也就是 lastChild。appendChild的语法是fatherObj.appendChild(childObj),返回值是被追加的孩子节点。来看看下面的例子:
[code]<HTML><HEAD><TITLE> DOM Demo </title></HEAD>

<BODY ID="bodyNode">

<SCRIPT LANGUAGE="JavaScript">

<!--

alert("页面初始状态");

tableObj = document.createElement("TABLE");

tbodyObj = document.createElement("TBODY");


tr1Obj = document.createElement("TR");

tr2Obj = tr1Obj.cloneNode();

tr3Obj = tr1Obj.cloneNode();


tr1td1Obj = document.createElement("TD");

tr1td2Obj = tr1td1Obj.cloneNode();

tr2td1Obj = tr1td1Obj.cloneNode();

tr2td2Obj = tr1td1Obj.cloneNode();

tr3td1Obj = tr1td1Obj.cloneNode();

tr3td2Obj = tr1td1Obj.cloneNode();


row1cell1Obj = document.createTextNode("This is row 1, cell 1");

row1cell2Obj = row1cell1Obj.cloneNode();

row2cell1Obj = row1cell1Obj.cloneNode();

row2cell2Obj = row1cell1Obj.cloneNode();

row3cell1Obj = row1cell1Obj.cloneNode();

row3cell2Obj = row1cell1Obj.cloneNode();


row1cell2Obj.nodeValue = "This is row 1, cell 2";

row2cell1Obj.nodeValue = "This is row 2, cell 1";

row2cell2Obj.nodeValue = "This is row 2, cell 2";

row3cell1Obj.nodeValue = "This is row 3, cell 1";

row3cell2Obj.nodeValue = "This is row 3, cell 2";


returnValue = tableObj.appendChild(tbodyObj);

tbodyObj.appendChild(tr1Obj);

tbodyObj.appendChild(tr2Obj);

tbodyObj.appendChild(tr3Obj);

tr1Obj.appendChild(tr1td1Obj);

tr1Obj.appendChild(tr1td2Obj);

tr2Obj.appendChild(tr2td1Obj);

tr2Obj.appendChild(tr2td2Obj);

tr3Obj.appendChild(tr3td1Obj);

tr3Obj.appendChild(tr3td2Obj);

tr1td1Obj.appendChild(row1cell1Obj);

tr1td2Obj.appendChild(row1cell2Obj);

tr2td1Obj.appendChild(row2cell1Obj);

tr2td2Obj.appendChild(row2cell2Obj);

tr3td1Obj.appendChild(row3cell1Obj);

tr3td2Obj.appendChild(row3cell2Obj);

bodyNode.appendChild(tableObj);

alert("对页面内容进行修改后");

// -->

</SCRIPT></BODY></HTML>[/code]

上面的代码演示了一个Table的动态创建过程。首先创建Table的各个行、列以及单元格的节点,然后使用appendChild将这些节点进行连接形成一个Table,最后通过语句bodyNode.appendChild(tableObj)将Table装载进文档中。 使用applyElement方法 applyElement 方法的功能是将一个节点与它的孩子节点和父亲节点脱离,然后将另外一个节点连接到这个节点,最终使它们成为父子关系。applyElement的语法是 childObj.applyElement(fatherObj),返回值是被连接的孩子节点。 我们注意到,applyElement和appendChild实现的目的基本相同,都是在2个节点间建立父子关系,但有2个区别: 1、applyElement方法只能操纵HTML标记节点,不能处理文本项节点。appendNode则能处理2种节点。 2、appendNode对2个节点的连接方式是从父到子,applyElement则是从子到父。 来看看下面的例子:
[code]<HTML><HEAD><TITLE> DOM Demo </title></HEAD>

<BODY ID="bodyNode">

<SCRIPT LANGUAGE="JavaScript">

<!--

alert("页面初始状态");

tableObj = document.createElement("TABLE");

tbodyObj = document.createElement("TBODY");


tr1Obj = document.createElement("TR");

tr2Obj = tr1Obj.cloneNode();

tr3Obj = tr1Obj.cloneNode();


tr1td1Obj = document.createElement("TD");

tr1td2Obj = tr1td1Obj.cloneNode();

tr2td1Obj = tr1td1Obj.cloneNode();

tr2td2Obj = tr1td1Obj.cloneNode();

tr3td1Obj = tr1td1Obj.cloneNode();

tr3td2Obj = tr1td1Obj.cloneNode();


row1cell1Obj = document.createTextNode("This is row 1, cell 1");

row1cell2Obj = row1cell1Obj.cloneNode();

row2cell1Obj = row1cell1Obj.cloneNode();

row2cell2Obj = row1cell1Obj.cloneNode();

row3cell1Obj = row1cell1Obj.cloneNode();

row3cell2Obj = row1cell1Obj.cloneNode();


row1cell2Obj.nodeValue = "This is row 1, cell 2";

row2cell1Obj.nodeValue = "This is row 2, cell 1";

row2cell2Obj.nodeValue = "This is row 2, cell 2";

row3cell1Obj.nodeValue = "This is row 3, cell 1";

row3cell2Obj.nodeValue = "This is row 3, cell 2";


tr1td1Obj.appendChild(row1cell1Obj);

tr1td2Obj.appendChild(row1cell2Obj);

tr2td1Obj.appendChild(row2cell1Obj);

tr2td2Obj.appendChild(row2cell2Obj);

tr3td1Obj.appendChild(row3cell1Obj);

tr3td2Obj.appendChild(row3cell2Obj);


tr1td1Obj.applyElement(tr1Obj);

tr1Obj.appendChild(tr1td2Obj);

tr2td1Obj.applyElement(tr2Obj);

tr2Obj.appendChild(tr2td2Obj);

tr3td1Obj.applyElement(tr3Obj);

tr3Obj.appendChild(tr3td2Obj);


tr1Obj.applyElement(tbodyObj);

tbodyObj.appendChild(tr2Obj);

tbodyObj.appendChild(tr3Obj);


returnValue = tbodyObj.applyElement(tableObj);


bodyNode.appendChild(tableObj);

alert("对页面内容进行修改后");

// -->

</SCRIPT></BODY></HTML>[/code]

上面的代码同样演示了一个Table的动态创建过程。首先创建Table的各个行、列以及单元格的节点,然后混合使用applyElement和 appendChild将这些节点进行连接形成一个Table,最后通过语句bodyNode.appendChild(tableObj)将Table 装载进文档中 使用insertBefore方法 insertBefore方法的功能和 appendChild相似,都是将一个孩子节点连接到一个父亲节点,但insertBefore方法允许我们指定孩子节点的位置。 insertBefore的语法是fatherObj.insertBefore(childObj, brotherObj),返回值是被连接的孩子节点。执行后,childObj的位置在brotherObj之前。来看看下面的例子:
[code]<HTML><HEAD><TITLE> DOM Demo </title></HEAD>

<BODY ID="bodyNode">

<SCRIPT LANGUAGE="JavaScript">

<!--

alert("页面初始状态");

tableObj = document.createElement("TABLE");

tbodyObj = document.createElement("TBODY");


tr1Obj = document.createElement("TR");

tr2Obj = tr1Obj.cloneNode();

tr3Obj = tr1Obj.cloneNode();


tr1td1Obj = document.createElement("TD");

tr1td2Obj = tr1td1Obj.cloneNode();

tr2td1Obj = tr1td1Obj.cloneNode();

tr2td2Obj = tr1td1Obj.cloneNode();

tr3td1Obj = tr1td1Obj.cloneNode();

tr3td2Obj = tr1td1Obj.cloneNode();


row1cell1Obj = document.createTextNode("This is row 1, cell 1");

row1cell2Obj = row1cell1Obj.cloneNode();

row2cell1Obj = row1cell1Obj.cloneNode();

row2cell2Obj = row1cell1Obj.cloneNode();

row3cell1Obj = row1cell1Obj.cloneNode();

row3cell2Obj = row1cell1Obj.cloneNode();


row1cell2Obj.nodeValue = "This is row 1, cell 2";

row2cell1Obj.nodeValue = "This is row 2, cell 1";

row2cell2Obj.nodeValue = "This is row 2, cell 2";

row3cell1Obj.nodeValue = "This is row 3, cell 1";

row3cell2Obj.nodeValue = "This is row 3, cell 2";


returnValue = tableObj.insertBefore(tbodyObj);

tbodyObj.insertBefore(tr3Obj);

tbodyObj.insertBefore(tr2Obj, tr3Obj);

tbodyObj.insertBefore(tr1Obj, tr2Obj);

tr1Obj.insertBefore(tr1td2Obj);

tr1Obj.insertBefore(tr1td1Obj, tr1td2Obj);

tr2Obj.insertBefore(tr2td2Obj);

tr2Obj.insertBefore(tr2td1Obj, tr2td2Obj);

tr3Obj.insertBefore(tr3td2Obj);

tr3Obj.insertBefore(tr3td1Obj, tr3td2Obj);

tr1td2Obj.insertBefore(row1cell2Obj);

tr1td1Obj.insertBefore(row1cell1Obj);

tr2td2Obj.insertBefore(row2cell2Obj);

tr2td1Obj.insertBefore(row2cell1Obj);

tr3td2Obj.insertBefore(row3cell2Obj);

tr3td1Obj.insertBefore(row3cell1Obj);

bodyNode.insertBefore(tableObj);

// -->

</SCRIPT></BODY></HTML>[/code]

上面的代码又一次演示了一个Table的动态创建过程。首先创建Table的各个行、列以及单元格的节点,然后混合使用insertBefore将这些节点进行连接形成一个Table,最后通过语句bodyNode. insertBefore (tableObj)将Table装载进文档中。可以看到,如果省略掉第2个参数brotherObj采用fatherObj.insertBefore (childObj)方式,那么一定是在要连入的父亲节点还没有孩子节点的情况下,这时,就和appendNode方法的功能完全一样了。 使用removeNode方法 removeNode 方法的功能是删除一个节点,语法为node.removeNode(false)或者node.removeNode(true),返回值是被删除的节点。removeNode(false)表示仅仅删除指定节点,然后这个节点的原孩子节点提升为原双亲节点的孩子节点。removeNode(true)表示删除指定节点及其所有下属节点。被删除的节点成为了孤立节点,不再具有有孩子节点和双亲节点。来看看下面的例子:
[code]<HTML><HEAD><TITLE>DOM Demo</TITLE></HEAD>

<BODY id=bodyNode>This is the document body

<P id=p1Node>This is paragraph 1.</P>

<P id=p2Node>This is paragraph 2.</P>

<P id=p3Node>This is paragraph 3. <IMG id=imgNode

src="myexam.gif">This text follows the image

<TABLE id=tableNode>

<TBODY>

<TR>

<TD bgColor=yellow>This is row 1, cell 1</TD>

<TD bgColor=orange>This is row 1, cell 2</TD></TR>

<TR>

<TD bgColor=red>This is row 2, cell 1</TD>

<TD bgColor=magenta>This is row 2, cell 2</TD></TR>

<TR>

<TD bgColor=lightgreen>This is row 3, cell 1</TD>

<TD bgColor=beige>This is row 3, cell 2</TD></TR></TBODY></TABLE></P>

<P id=p4Node>This is paragraph 4.</P>

<SCRIPT language=JavaScript>

<!--

var msg = "";

function printChildren() {

childCount = bodyNode.childNodes.length;

msg += "bodyNode.childNodes.length = " + bodyNode.childNodes.length + "\n" ;

for(var i = 0; i < childCount; i++) {

msg += "bodyNode.childNodes.nodeName = " + bodyNode.childNodes.nodeName + "\n";

}

alert(msg);

}

msg="页面初始状态" + "\n\n"

printChildren();


msg="对页面内容进行修改后" + "\n\n"

msg += "Deleting Paragraph 3\n";

var deletedNode = p3Node.removeNode(false);

msg += "deletedNode.nodeName = " + deletedNode.nodeName + "\n";

msg += "deletedNode.childNodes.length = " + deletedNode.childNodes.length + "\n";

printChildren();

// -->

</SCRIPT></BODY></HTML>[/code]

上述代码首先显示页面的初始内容以及bodyNode的每个孩子节点的nodeName属性值,然后仅仅删除p3Node。删除p3Node前, bodyNode有6个孩子节点,p3Node有4个孩子节点。删除p3Node后,节点p3Node的4个孩子节点提升为bodyNode的孩子节点,这样bodyNode就有了9个节点。p3Node被删除后返回值为deletedNode,它的nodeName属性值为P,孩子节点数为0,也就是说,它成为一个孤立节点。 现在我们将上述代码中的deletedNode = p3Node.removeNode(false)修改为deletedNode = p3Node.removeNode(true),你会看到,删除p3Node后,bodyNode的孩子节点数变为5。使用replaceNode方法 replaceNode方法的功能是用新创建的节点替换一个节点及其下属节点,语法为oldNode.replaceNode(newNode),返回值是被替换的节点。来看看下面的例子:
[code]<HTML><HEAD><TITLE> DOM Demo </title></HEAD>

<BODY ID="bodyNode">

This is the document body

<P ID = "p1Node">This is paragraph 1.</P>

<P ID = "p2Node">This is paragraph 2.</P>

<P ID = "p3Node">This is paragraph 3.

<IMG ID = "imgNode" SRC="myexam.gif">This text follows the image

<TABLE ID="tableNode">

<TR><TD BGCOLOR=yellow>This is row 1, cell 1</TD><TD BGCOLOR=orange>This is row 1, cell 2</TD></TR>

<TR><TD BGCOLOR=red>This is row 2, cell 1</TD><TD BGCOLOR=magenta>This is row 2, cell 2</TD></TR>

<TR><TD BGCOLOR=lightgreen>This is row 3, cell 1</TD><TD BGCOLOR=beige>This is row 3, cell 2</TD></TR>

</TABLE>

</P>

<P ID = "p4Node">This is paragraph 4.</P>

<SCRIPT LANGUAGE="JavaScript">

<!--

var msg = "";

function printChildren() {

childCount = bodyNode.childNodes.length;

msg += "bodyNode.childNodes.length = " + bodyNode.childNodes.length + "\n" ;

for(var i = 0; i < childCount; i++) {

msg += "bodyNode.childNodes.nodeName = " + bodyNode.childNodes.nodeName + "\n";

}

alert(msg);

}

msg="页面初始状态" + "\n\n"

printChildren();


msg="对页面内容进行修改后" + "\n\n"

msg += "Replacing Paragraph 3\n";

var b = document.createTextNode("New Body Page");

var replacedNode = p3Node.replaceNode(b);

msg += "replacedNode.nodeName = " + replacedNode.nodeName + "\n";

msg += "replacedNode.childNodes.length = " + replacedNode.childNodes.length + "\n";

msg += "p2Node.nodeName = " + p2Node.nodeName + "\n";

printChildren();

// -->

</SCRIPT></BODY></HTML>[/code]

上述代码首先显示页面的初始内容以及bodyNode的每个孩子节点的nodeName属性值,然后用新创建的文本项节点替换p3Node。替换后, bodyNode的孩子节点数目没有变,原来的P节点替换为文本项节点。变量replaceNode表示被替换的节点p3Node,它仍包含原来的4个孩子节点。 replaceNode方法的另一个功能是删除节点及其下属节点,就象前面介绍的removeNode(true)一样。这时,我们只需将replaceNode方法的参数设置为一个现存的节点就可以。现在,我们将上述代码中的b = document.createTextNode("New Body Page")修改为b = p2Node,你会看到,p3Node及其下属节点被删除了,没有替换节点生成,bodyNode的孩子节点数变为5。 如果replaceNode方法的参数为空,也就是执行replaceNode(),那么将导致浏览器脚本运行错误。 使用swapNode方法 swapNode方法的功能是交换2个节点(包括其下属节点)在文档Tree中的位置,语法为firstNode.swapNode(secondNode),返回值是节点firstNode。来看看下面的例子:
[code]<HTML><HEAD><TITLE>DOM Demo</TITLE></HEAD>

<BODY id=bodyNode>This is the document body

<P id=p1Node>This is paragraph 1.</P>

<P id=p2Node>This is paragraph 2.</P>

<P id=p3Node>This is paragraph 3. <IMG id=imgNode

src="myexam.gif">This text follows the image

<TABLE id=tableNode>

<TBODY>

<TR>

<TD bgColor=yellow>This is row 1, cell 1</TD>

<TD bgColor=orange>This is row 1, cell 2</TD></TR>

<TR>

<TD bgColor=red>This is row 2, cell 1</TD>

<TD bgColor=magenta>This is row 2, cell 2</TD></TR>

<TR>

<TD bgColor=lightgreen>This is row 3, cell 1</TD>

<TD bgColor=beige>This is row 3, cell 2</TD></TR></TBODY></TABLE></P>

<P id=p4Node>This is paragraph 4.</P>

<SCRIPT language=JavaScript>

<!--

var msg = "";

function printChildren() {

childCount = bodyNode.childNodes.length;

msg += "bodyNode.childNodes.length = " + bodyNode.childNodes.length + "\n" ;

for(var i = 0; i < childCount; i++) {

msg += "bodyNode.childNodes.nodeName = " + bodyNode.childNodes.nodeName + "\n";

}

alert(msg);

}

msg="页面初始状态" + "\n\n"

printChildren();


msg="对页面内容进行修改后" + "\n\n"

msg += "Swapping Paragraph 3 with Paragraph 2\n";

var b = p2Node;

var swappedNode = p3Node.swapNode(b);

msg += "swappedNode.nodeName = " + swappedNode.nodeName + "\n";

msg += "swappedNode.childNodes.length = " + swappedNode.childNodes.length + "\n";

msg += "p2Node.nodeName = " + p2Node.nodeName + "\n";

printChildren();

// -->

</SCRIPT></BODY></HTML>[/code]

上述代码首先显示页面的初始内容以及bodyNode的每个孩子节点的nodeName属性值,然后交换p3Node和p2Node的位置。交换后,bodyNode的孩子节点数目没有变,变量swappedNode表示p3Node,它仍包含原来的4个孩子节点。 swapNode 方法的另一个功能是替换节点及其下属节点,就象前面介绍的replaceNode方法一样。这时,我们只需将replaceNode方法的参数设置为一个新创建的节点就可以。现在,我们将上述代码中的b = p2Node修改为b = document.createTextNode("This is a swapped in text"),你会看到,p3Node及其下属节点被新创建的文本项节点所替换,原来的节点类型P变为了文本项节点类型#text。

转摘自http://bbs.javascript.com.cn/simple/index.php?t180.html
单向双向V2G 环境下分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)内容概要:本文介绍了在单向和双向V2G(Vehicle-to-Grid)环境下,分布式电源与电动汽车充电站的联合配置方法,并提供了基于Matlab的代码实现。研究涵盖电力系统优化、可再生能源接入、电动汽车充放电调度、储能配置及微电网经济调度等多个关键技术领域,重点探讨了在不同电价机制和需求响应策略下,如何通过智能优化算法实现充电站与分布式电源的协同规划与运行优化。文中还展示了多种应用场景,如有序充电调度、鲁棒优化模型、多目标优化算法(如NSGA-II、粒子群算法)在电力系统中的实际应用,体现了较强的工程实践价值和技术综合性。; 适合人群:具备电力系统、新能源、智能优化算法等相关背景的科研人员、研究生及从事能源系统规划与优化的工程技术人员;熟悉Matlab/Simulink仿真工具者更佳。; 使用场景及目标:①用于科研项目中关于电动汽车与分布式电源协同配置的模型构建与仿真验证;②支持毕业论文、期刊投稿中的案例分析与算法对比;③指导实际电力系统中充电站布局与能源调度的优化设计。; 阅读建议:建议结合文中提供的Matlab代码与具体案例进行同步实践,重点关注优化模型的数学建模过程与算法实现细节,同时可参考文末网盘资源获取完整代码与数据集以提升学习效率。
【电动车】【超级棒】基于蒙特卡洛模拟法的电动汽车充电负荷研究(Matlab代码实现)内容概要:本文围绕基于蒙特卡洛模拟法的电动汽车充电负荷研究展开,利用Matlab代码实现对不同类型电动汽车(如常规充电、快速充电、换电模式)在不同场景下的充电负荷进行建模与仿真。通过蒙特卡洛方法模拟大量电动汽车的充电行为,结合用户出行规律、充电时间、电量需求等随机因素,分析电动汽车规模化接入电网后对电力系统负荷的影响,并探讨分时电价策略对充电负荷的引导作用,进而优化电网运行。研究涵盖充电负荷的空间分布特性、时间分布特征及对电网峰谷差的影响,旨在为电力系统规划和电动汽车有序充电管理提供理论支持和技术工具。; 适合人群:具备一定电力系统、交通工程或新能源汽车背景的研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。; 使用场景及目标:①用于研究大规模电动汽车接入对配电网负荷曲线的影响;②支撑分时电价、需求响应等政策制定与优化;③为充电站规划、电网调度、储能配置等提供数据支持和仿真平台;④适用于学术研究、课题复现及工程项目前期分析。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注蒙特卡洛模拟的参数设置、充电行为的概率建模过程,并尝试调整输入变量以观察负荷变化趋势,加深对电动汽车充电负荷不确定性和聚合效应的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值