1.创建节点

任务描述

1.本关任务:创建一个表单<form>节点。

2.具体要求如下:

  • 创建一个form节点,然后赋值给变量newNode,设置节点的id值为myForm,method值为post,如下所示:
<form id="myForm" method="post"></form>
  • 字符串类型参数用""包含在内。

相关知识

有的时候,我们需要往页面动态的添加文档元素(节点),比如根据省份的不同展现不同的城市列表,在添加节点之前需要先创建该节点。

创建节点

document.createElement("tagName")用来创建一个新的Element节点(即文档元素),返回值是新创建的节点,tagName是标签的名字,比如a、p、img等,需要注意的是它不区分大小写。

比如创建一个新的超链接节点:

var newA = document.createElement("a");//创建超链接节点
newA.src = "https://www.educoder.net";//设置超链接的目的地址

代码文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <p></p>
    <script>
    	<!-- 请在此处编写代码 -->
        <!---------Begin--------->
        
        var newNode = document.createElement('form');
        newNode.method='post';
        newNode.id='myForm';

        <!---------End--------->
		document.body.appendChild(newNode);
        console.log(newNode.method);
    </script>
</body>
</html>

2.插入节点

任务描述

  • ul标签在html中表示无序列表,li标签标识其中的列表项。

1.本关任务:在无序列表中插入新的列表项。

2.具体要求如下:

  • 使用createElement方法创建一个li类型的新节点newNode;
  • 通过innerText方法设置该节点内部文本的内容为Canada;
  • 通过getElementById和appendChild方法将newNode节点添加到ul标签下面,作为它的最后一个子节点;
  • 所有的字符串类型参数请用""包含在内;

相关知识

  • 插入节点:插入一个新的文档元素。

最常见的应用就是在<select>标签里插入一个新的<option>标签。

插入节点

两种可选的方法:

  • 方法1appendChild()
  • node1.appendChild(node2)表示将node2插入到node1的最后一个子节点中。

比如原来的选择框是这样:

<select id="s1">
    <option id="cs">长沙</option>
    <option id="zz">株洲</option>
</select>

要把它变成这样:

<select id="s1">
    <option id="cs">长沙</option>
    <option id="zz">株洲</option>
    <option >湘潭</option>
</select>

实现代码如下:

var node1 = document.getElementById("s1");
var node2 = document.createElement("option");
node2.innerText = "湘潭";
node1.appendChild(node2);
  • 方法2insertBefore()
  • pNode.insertBefore(node1,node2):将node1插入作为pNode的子节点,并且node1排在已存在的子节点node2的前面。

比如要把最开始的复选框变成这样:

<select id="s1">
    <option id="cs">长沙</option>
    <option>湘潭</option>
    <option id="zz">株洲</option>
</select>

我们需要像下面这样操作节点:

var pNode = document.getElementById("s1");
var node1 = document.createElement("option");
node1.innerText = "湘潭";
var node2 = document.getElementById("zz");
//将内容为"湘潭"的节点插入到内容为"株洲"的节点前面
pNode.insertBefore(node1,node2);

代码文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <ul id="ul1">
        <li>America</li>
        <li>Mexio</li>
    </ul>
    <script>
    	<!-- 请在此处编写代码 -->
        <!---------Begin--------->
        var node = document.getElementById('ul1');
        var newNode = document.createElement('li');
        newNode.innerText='Canada';
        node.appendChild(newNode);

        <!---------End--------->
        var out = document.getElementsByTagName("li")[2];
        console.log(out.innerText);
    </script>
</body>
</html>

3.删除节点

任务描述

  • ol标签在html中表示有序列表,li标签表示其中的列表项。

1.本关任务:在有序列表中删除指定的列表项。

2.要求按照步骤进行:

  • 获取id为browser的节点,赋值给变量parent;
  • 获取id为opera的节点,赋值给变量child;
  • 通过removeChild方法删除child节点;
  • 获取节点使用getElementById方法;
  • 字符串类型参数用""包含在内。

相关知识

这里的删除节点指的是:父元素删除自己的子元素。

删除节点

  • 删除节点的方法是removeChild(),调用者是父节点,参数是子节点,作用是删除这个子节点。

下面是一个无序列表的代码:

<ul id="parent">
  <li>提子</li>
  <li>车厘子</li>
  <li id="child3">荔枝</li>
</ul>

用浏览器打开这个文件,效果如下:
在这里插入图片描述
如果我们要删除第三行,可以这样操作:

第一步:获取父节点,即ul节点:

var parentNode = document.getElementById("parent");

第二步:获取待删除的子结点:

var childNode = document.getElementById("child3");

第三步:父节点调用removeChild()方法删除子节点:

parentNode.removeChild(childNode);

执行完这三个js语句后,再次用浏览器打开,结果为:
在这里插入图片描述

代码文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <ol id="browser">
        <li id="chrome">Chrome</li>
        <li id="firefox">Firefox</li>
        <li id="opera">Opera</li>
        <li id="safari">Safari</li>
    </ol>
    <script>
    	<!-- 请在此处编写代码 -->
        <!---------Begin--------->
        var parent = document.getElementById("browser");
        var child = document.getElementById("opera");
        parent.removeChild(child);

        <!---------End--------->
    </script>
</body>
</html>

4.替换节点

任务描述

1.本关任务:替换指定的节点

2.具体要求如下,请按步骤操作:

  • 获取id为parent的节点(父节点),赋给变量parent;
  • 获取id为old的节点(子节点),赋给变量old;
  • newChild已知,用newChild替换子节点old;
  • 使用getElementById方法获取节点;
  • 字符串参数用""包含在内。

相关知识

一般来说,替换节点=删除节点+新增节点,可以用前面介绍的知识结合起来实现,当然,js提供了replaceChild()方法一次完成替换。

替换节点

replaceChild(a,b)的调用者是要被替换的节点的父节点,a是新的节点,b是被替换的节点。

以无序列表为例:

<ul id="parent">
  <li id="child1">黄山</li>
  <li id="child2">庐山</li>
  <li id="child3">泰山</li>
</ul>

要替换掉第三个子节点,过程如下:

第一步,获取父节点:

var parNode = document.getElementById("parent");

第二步,获取要被替换的子节点:

var oldNode = document.getElementById("child3");

第三步,创建新节点:

var newChild = document.createElement("li");
newChild.innerText = "武夷山";

第四步,替换:

parNode.replaceChild(newChild,oldNode);

替换前后的效果对比:
在这里插入图片描述

代码文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <ol id="parent">
        <a id="old" href="https://www.google.com">Google</a>
    </ol>
    <script>
        var newChild = document.createElement("a");
        newChild.innerText = "eduCoder";
        newChild.href = "https://www.educoder.net";
        <!-- 请在此处编写代码 -->
        <!---------Begin--------->
        var parent = document.getElementById("parent");
        var old = document.getElementById("old");
        parent.replaceChild(newChild,old);
        
        <!---------End--------->
    </script>
</body>
</html>

5.综合练习

任务描述

1.本关任务:练习节点的操作

2.具体要求如下:

  • 继续拓展相关知识中介绍的功能,要求第一列选择安徽省后,第二列下拉的选项中出现黄山市和合肥市两个选项,按照以下步骤进行;
  • 创建一个option类型节点child2;
  • 设置child2的value属性的值为HeFeiCity;
  • 设置child2的显示的文本为合肥市;
  • 将child2设置为id为city的节点下面的第二个子节点;
  • 使用getElementById方法获取节点;
  • 字符串类型的参数用""包含在内。

相关知识

综合前面学习过的节点的各种操作,可以实现很复杂的功能。

下拉列表的级联

相信大家都见过这样的下拉框:
在这里插入图片描述
它有三列,每一列都会根据前一列的结果动态的改变自己的可选项,称为下拉框的级联,那么如何实现呢?

第一步:静态的HTML的代码如下(简单起见,只考虑前两列):

<select id="province" onChange="changeCity()">
    <option value="BeiJing" id="bj">北京</option>
    <option value="AnHui" id="ah">安徽</option>
</select>
<select id="city">
    <option value="BeiJingCity">北京市</option>
</select>
  • select表示选择框,option表示选择框里面的每一个选项,onChange="changeCity()"表示一旦改变当前的选项,就会触发JavaScript函数changeCity()的执行。
  • 对于这个静态的HTML页面,不论你在第一列选择的是北京还是安徽,第二列的选项都只有北京市一项。

第二步:获取两个选择框对应的节点元素
(以下的所有代码都是changeCity()函数里面的内容):

var province = document.getElementById("province");
var city = document.getElementById("city");
  • province变量代表第一列的选择框,city变量代表第二列的选择框。

第三步:清空第二列中的所有内容;
根据第一列的选择结果改变第二列的内容,就是根据父节点的不同替换不同的子节点,我们采用先删除后新增的方法实现替换:

var length = city.children.length;
for(var i = length-1;i >= 0;i--) {
    city.removeChild(city.children[i]);
}
  • 在for循环里面,依次删除city节点下面的所有子节点。
  • 需要注意的是,每删除一个子节点后,表示子节点个数的属性city.children.length都会自动减1,所以我们需要在for循环开始之前索取子节点的长度。

第四步:根据父节点的不同新增不同的子节点:

if(province.value == "BeiJing") {
    var child1 = document.createElement("option");
    child1.value ="BeiJingCity";
    child1.innerText="北京市"
    city.appendChild(child1);
} else {
    var child1 = document.createElement("option");
    child1.value="HuangShanCity";
    child1.innerText="黄山市";
    city.appendChild(child1);
}
  • province.value表示第一列选中的选项的值,即选中的option标签的value的值。
  • 如果第一列选择的是北京,我们需要增加一个选项为北京市的option节点,这个节点将作为city的子节点。如果第一列选择的是安徽,我们需要增加一个选项为黄山市的option节点,这个节点将作为city的子节点。
  • value属性表示option标签的值,innerText表示option标签呈现出来的值。

代码文件

<html>
<head>
<title>myTitle</title>
<meta charset="utf-8" />
</head>
<body>
<select id="province" onChange="changeCity()">
	<option value="BeiJing" id="bj">北京</option>
    <option value="AnHui" id="ah">安徽</option>
</select>
<select id="city">
    <option value="BeiJingCity">北京市</option>
</select>
<script>
function changeCity() {
    var province = document.getElementById("province");
    var city = document.getElementById("city");
    var length = city.children.length;
    for(var i = length-1;i >= 0;i--) {
        city.removeChild(city.children[i]);
    }
    if(province.value == "BeiJing") {
        var child1 = document.createElement("option");
        child1.value="BeiJingCity";
        child1.innerText="北京市"
        city.appendChild(child1);
    } else {
        var child1 = document.createElement("option");
        child1.value="HuangShanCity";
        child1.innerText="黄山市";
        city.appendChild(child1);
        //请在此处编写代码
        /*********Begin*********/
        var child2 = document.createElement("option");
        child2.value="HeFeiCity";
        child2.innerText="合肥市";
        city.appendChild(child2);

        /*********End*********/
    }
}
</script>
</body>
</html>

【做题的过程中,发生了很多次单词拼写错误哦,大家一定要细心,可不要学我,找了半天的错,结果是一个字母错了】

-----------------------------------------一日句子:
“我们是否知道我们心中的风筝到底在什么地方,人生错过就不会再得到,也许我们会忏悔,会救赎,但这些似乎都已经晚了,每当天空放飞起风筝的那一刻,我们是不是应该问问自己我们是否真的珍惜我们所拥有的一切。”
——卡勒德·胡赛尼《追风筝的人》

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐