热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端~javascript~webAPI/文档对象模型Dom/Dom树/事件机制/操作元素/实战案例:实现网页计数器

文章目录WebAPI简介DomDom树获取Dom元素事件事件三要素操作dom元素innerHTMLinnerText实战案例:实现网页计数器WebAPI简介什么是AP


文章目录

  • WebAPI简介
    • Dom
    • Dom树
      • 获取Dom元素
        • 事件
          • 事件三要素
      • 操作dom元素
        • innerHTML
        • innerText
    • 实战案例:实现网页计数器


WebAPI简介


什么是API
应用程序接口(API,Application Programming Interface)是基于编程语言构建的结构,使开发人员更容易的创建复杂的功能。API中提供了很多的网络接口供开发者使用。


JS基本上可以分为三大类:


  • ECAMScript:基础的JS语法
  • DOM API:操作网络页面结构
  • BOM API:操作浏览器

本文介绍的webAPI主要包含了DOM 和BOM部分,基础的JS语法在前几篇文章中已经基本介绍了一些,这里就不在介绍。

下面附上API官方参考文档。
https://developer.mozilla.org/zh-CN/docs/Web/API


Dom

什么是Dom


文档对象模型(DOM,全称Document Object Model.)是HTML和XML文档的编程接口。它提供了对文档的结构化表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的接口,样式和内容。DOM将文档解析为一个由节点和对象(包含属性和方法的对象)组成的集合。


上面是比较复杂 的官方定义,其实就是W3C标准给我们提供了一些已经写好的函数,我们可以直接使用,可以用这些函数来操作网页内容、网页结构、网页样式。


Dom树

当一个新的网页被加载时,浏览器就会创建该页面的文档对象模型(Dom).这个Dom模型会被结构化为一个 存放对象的树结构。这个树结构就是 Dom树。

结构如下:
在这里插入图片描述
Dom树中的一些概念:


  • 文档:一个网络页面就是一个文档,即document表示

  • 元素:页面中的所有标签(tag)都称为元素,即element。

  • 节点:网页中的所有内容都可以称为 节点(像标签节点,文本节点,属性节点,注释节点等),即node.

这些文档在JS源码中就对应了一个个的对象。所以才会称为“文档对象模型”。


获取Dom元素

一个Dom树上面有很多很多的对象,再进行操作之前必须先选中对象。Dom API 中提供了很多能够用来选中对象/元素的函数 在本文中我们只介绍最常用功能最强大的两个。
分别是querySelectorquerySelectAll


只有新版本的浏览器才支持(比如IE9之前并不支持)像主流的 浏览器chrome,firefox,edge都是支持的,没有任何问题。


querySelector

querySelector函数的参数是一个“字符串”,而且这个字符串必须是CSS选择器

当代码中存在多个相同名称的标签时,选择器在进行选择时,会返回被选中元素的第一个(即第一个出现的元素)。
如果想要全部返回,可以使用querySelectAll,会将所有相同名称的标签元素以NodeList(伪数组)的形式,全部返回。


当我们在document上调用这两个方法的时候,相当于从页面对 全局来查找复合要求的元素。
如果是在某个具体的dom对象上调用这两个方法,相当于从这个元素里面来查找复合要求的元素


代码演示:

<!DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Title</title>
</head>
<body><!--创建父元素 parent,及三个子元素child1,2,3-->
<div class&#61;"parent"><div class&#61;"child-1">1</div><div class&#61;"child-2">2</div><div class&#61;"child-3">3</div>
</div><script>//选中的结果是一个“元素”&#xff0c;即elemlet elem&#61;document.querySelector(&#39;div&#39;);console.log(elem);
</script>
</body>
</html>

输出结果&#xff1a;
在这里插入图片描述
querySelectAll

和querySelector使用方法类似。

代码演示&#xff1a;

<!DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Title</title>
</head>
<body><!--创建父元素 parent,及三个子元素child1,2,3-->
<div class&#61;"parent"><div class&#61;"child-1">1</div><div class&#61;"child-2">2</div><div class&#61;"child-3">3</div>
</div><script>//选中的结果是一个“元素”&#xff0c;即elemlet elem&#61;document.querySelectorAll(&#39;div&#39;);console.log(elem);
</script>
</body>
</html>

输出&#xff1a;
在这里插入图片描述

<div class&#61;"box">abc</div>
<div id&#61;"id">def</div>
<script>var elems &#61; document.querySelectorAll(&#39;div&#39;);
console.log(elems);
</script>

事件

一些复杂的程序&#xff0c;往往涉及到组件之间相互通信。
事件机制&#xff08;event&#xff09;就是非常典型的组件通信机制。


事件是用户和程序之间的桥梁。


JS要构建动态页面&#xff0c;就需要感知到用户的行为&#xff0c;当用户对页面进行的一些操作&#xff08;点击&#xff0c;修改&#xff0c;选择额&#xff0c;浏览&#xff09;等都会在浏览器中产生一个个的事件&#xff0c;当JS捕获到这些事件&#xff0c;就会运行该事件对应的程序&#xff0c;从而实现复杂的交互操作。


事件三要素

1.事件源&#xff1a;被触发的对象
2.事件类型&#xff1a;事件触发的方式
3.事件处理程序&#xff1a;事件触发后&#xff0c;执行的程序。


代码举例&#xff1a;

<!DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Title</title>
</head>
<body><input type&#61;"button" value&#61;"我是一个按钮"><script>let button&#61;document.querySelector(&#39;input&#39;);button.onclick&#61;function(){alert("hello");}
</script>
</body>
</html>

上面的代码中&#xff0c;button是事件源&#xff08;用户能操作的元素&#xff09;&#xff0c;click就是事件类型&#xff08;点击事件),通过onlick属性 就能关联到一个具体的事件处理函数。当button触发了click事件(当用户点击了这个按钮后)&#xff0c;就会自动调用onclick对应的函数。


操作dom元素

获取/修改元素内容


在CSS的盒模型中&#xff0c;我们已经知道了一个盒子的组成&#xff1a;外边距、边框、内边距、内容。我们要获取和修改的 就是最后的内容。这个内容可能是一个文本&#xff0c;也可能是一个图片&#xff0c;也可能是个链接等&#xff0c;本质上都是一段html代码片段&#xff0c;我们要获取/修改的内容就是这段html片段。



innerHTML

通过element.innerHTML属性就可以设置和获取该元素的内容。

代码演示&#xff1a;

<!DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Title</title>
</head>
<body><div class&#61;"parent">hello
</div><button>点击按钮&#xff0c;改变文本</button>
<script>//选中button按钮let button &#61;document.querySelector(&#39;button&#39;);button.onclick&#61;function () {//选中parent元素let parent&#61;document.querySelector(&#39;.parent&#39;);//修改parent的内容parent.innerHTML&#61;&#39;word&#39;;}
</script>
</body>
</html>

运行&#xff1a;
在这里插入图片描述

该属性不仅可以赋值文本&#xff0c;还可以赋值一个html片段。
在这里插入图片描述


innerText

通过element.innerText属性可以设置和修改一个元素及其子元素的文本内容。

// 读操作
var renderedText &#61; HTMLElement.innerText;
// 写操作
HTMLElement.innerText &#61; string;

<div><span>hello world</span><span>hello world</span>
</div>
<script>var div &#61; document.querySelector(&#39;div&#39;);// 读取 div 内部内容console.log(div.innerText);// 修改 div 内部内容, 界面上就会同步修改div.innerText &#61; &#39;hello js hello js&#39;;
</script>

通过上面的代码可知&#xff0c;innerText属性无法获取到div内部 html代码片段&#xff0c;只能得到文本内容。


实战案例&#xff1a;实现网页计数器

通过html,css&#xff0c;js目前掌握的知识&#xff0c;我们可以做一个小练习&#xff0c;实现一个简单的计数器&#xff0c;类似的按键功能可以重复添加&#xff0c;所以这里尽量简化&#xff0c;以加减举个例子。


<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Title</title>
</head><style><!-- 先清除浏览器默认样式 -->*{margin: 0;padding: 0;box-sizing: border-box;}/*设置父元素的样式&#xff1a;长度&#xff0c;宽度&#xff0c;背景色*/.parent {width: 500px;height: 300px;background-color: gray;/*水平位置居中*/margin: 0 auto;}/*子元素screen的样式*/.parent .screen{width: 200px;height: 150px;font-size: 30px;line-height: 150px;color:white;margin: 0 auto;/*位置居中*/text-align: center;}.parent .ctrl{width:360px;height:150px;margin: 0 auto;display: flex;justify-content: space-between;align-items: center;}/*按钮样式*/.parent .ctrl button{width: 100px;height: 50px;font-size: 20px;line-height: 20px;text-align: center;border-radius: 10px;/*去掉自带的黑色边框*/border:none;}.parent .ctrl button:active{color:white;background-color: blue;}
</style>
<body>
<div class&#61;"parent">
<!--通过screen来显示数字--><div class&#61;"screen">0</div><div class&#61;"ctrl"><!-- 子元素按钮--><button id&#61;"plusButton">&#43;</button><button id&#61;"zeroButton">清零</button><button id&#61;"minusButton">-</button></div>
</div><script>// 按钮监听事件
let plusButton&#61;document.querySelector(&#39;#plusButton&#39;);plusButton.onclick&#61;function(){//1.选中screen 元素let screen&#61;document.querySelector(&#39;.screen&#39;);//2. 取出其中的元素let content&#61;screen.innerHTML;//3.将内容&#43;1let result&#61;parseInt(content)&#43;1;//4.重新写入内容screen.innerHTML&#61;result;}let minusButton&#61;document.querySelector(&#39;#minusButton&#39;);
minusButton.onclick&#61;function() {//1.选中screen 元素let screen &#61; document.querySelector(&#39;.screen&#39;);//2. 取出其中的元素let content &#61; screen.innerHTML;//3.将内容-1let result &#61; parseInt(content) - 1;//4.重新写入内容screen.innerHTML &#61; result;
}let zeroButton&#61;document.querySelector(&#39;#zeroButton&#39;);
zeroButton.onclick&#61;function() {//1.选中screen 元素let screen &#61; document.querySelector(&#39;.screen&#39;);//2. 取出其中的元素let content &#61; screen.innerHTML;//3.将内容-1let result &#61; parseInt(content) *0;//4.重新写入内容screen.innerHTML &#61; result;
}</script>
</body>
</html>

效果如下&#xff1a;
在这里插入图片描述


推荐阅读
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文介绍如何使用Java中的正则表达式来提取字符串中的特定值。通过示例代码和详细解释,帮助开发者掌握正则表达式的使用方法,尤其是如何匹配和提取复杂模式中的数据。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有