• JavaScript之WebAPI


    新鲜出炉,前端三剑客到今天就介绍结束啦~

    目录

    1.什么是WebAPI

    2.DOMAPI

    2.1获取元素

    2.2事件初识

    2.3操作元素

    2.4操作节点

    3.两个案例

    3.1猜数字案例

    3.2表白墙案例


    1.什么是WebAPI

      前面学习的 JS 分成三个大的部分 :ECMAScript: 基础语法部分;DOM API: 操作页面结构;BOM API: 操作浏览器
    WebAPI 就包含了 DOM + BOM.

    2.DOMAPI

    ①什么是DOM?9

    DOM 全称为 Document Object Model(文档指的是界面显示的部分,对象指的是js中代码操作的部分,通过这两个配合使界面产生改变)
    DOMAPI是js提供给浏览器的一组用来操作页面元素的API。主要是进行以下三个部分元素的操作。
    a.获取元素(.querySelector/querySelectorAll)
    b.事件处理(.onclick)
    c.操作元素内容(.innerHTML)
    ②什么是DOM树?
    一个页面的结构是一个树形结构 , 称为 DOM 树。类似于我们前面学的文件的存储路径,也可以通俗地说成家谱。下面我们列出一个页面结构的DOM树的结构,便于理解。

    在这里面,仍然有几个概念需要我们进一步重视:

    a.文档:一个页面就是一个文档,用document来进行表示。

    b.元素:页面中的所有标签都可以被称为元素,用element来进行表示。

    c. 节点:网页中的所有内容都可以称为节点(标签节点,注释节点,文本节点),用node来进行表示。

    2.1获取元素

    ①什么是获取元素:

    这部分工作类似于 CSS 选择器的功能。要想操作页面上的元素,就需要先拿到对应的js对象。

    ②怎么获取元素呢?(这里只介绍下面这两种相对重要的API)

    我们常使用querySelector/querySelectorAll来实现。这两个元素其实是一个document这样的对象的属性。(当一个页面加载好之后,就会自动生成一个全局变量,叫做document),在这里面就会有一些属性和方法,通过这些属性和方法来操作页面的内容

    ③演示querySelector:(核心代码如下)

    1. <div class="one">
    2. hello
    3. div>
    4. <div id="two">
    5. hello1
    6. div>
    7. <ul>
    8. <li>aaali>
    9. ul>
    10. <script>
    11. //基于选择器选择元素,方便进行后续的操作。而这里querySelector的参数,就是一个css的选择器(id选择器,类选择器等等)
    12. //这个变量名是任意的,只不过对象中填写的值要以div中的为主
    13. let obj=document.querySelector('.one');
    14. let syb=document.querySelector('#two');
    15. let div=document.querySelector("ul li");
    16. //类选择器
    17. console.log(obj);
    18. //id选择器
    19. console.log(syb);
    20. //后代选择器
    21. console.log(div);
    22. script>

    注意!!!

    querySelector的参数的选择器,匹配到了多个元素的时候,这个时候返回的对象是匹配的第一个元素,演示如下:

    要是,我们想所有的元素都被选中,那么我们就应该用querySelectorAll。

    演示querySelectorAll:(核心代码如下)

    1. body>
    2. <ul>
    3. <li>aaali>
    4. <li>bbbli>
    5. ul>
    6. <script>
    7. //基于选择器选择元素,方便进行后续的操作。而这里querySelector的参数,就是一个css的选择器(id选择器,类选择器等等)
    8. //这个变量名是任意的,只不过对象中填写的值要以div中的为主
    9. let div=document.querySelectorAll("ul li");
    10. //后代选择器
    11. console.log(div);
    12. script>

    显示结果如下:

     这个时候,是以数组的方式对结果进行呈现。但是准确地来说,它返回的不是一个真正意义上的原生数组,而是一个对象,只不过这个对象有length,也能够通过下标来访问内部元素。这样的对象使用起来和数组非常相似,我们称其为“伪数组”。

    2.2事件初识

    ①什么是事件?

    在js中,很多代码都是通过事件来实现的。事件就是浏览器对于用户的操作的一个统称(准确的说,事件也不一定全是用户操作产生的,但是大部分是的)。

    通俗的举个例子,我们使用鼠标进行移动光标是一个事件,我们使用鼠标在页面的某个位置进行点击,也是一个事件等待。其中js主要的工作就是在不同的事件中进行不同的处理。

    ②事件的三要素:

    a.事件源:哪个HTML产生的元素

    b.事件类型:鼠标移动,鼠标点击,窗口大小切换

    c.事件处理程序:当事件产生和,执行样的js怎代码

    ③举个典型例子(点击事件)

     换一种写法:(核心代码)

     

    1. <button onclick="f()">请按按钮button>
    2. <script>
    3. let cell=document.querySelector('button');
    4. // 事件类型:onclick 表明这是一个点击事件
    5. function f(){
    6. alert('hello');
    7. }
    8. script>

     但在实际上,我们更建议使用第一种写法。这种写法使得页面 更加整洁。

    2.3操作元素

    ①操作元素的含义:

    操作元素中,操作=获取+修改

    ②操作的形式:

    a.操作元素内容:

    通过对象里面的一个属性,innnerHTML来实现(也就是获取到元素中的代码是怎样的)

    但是当我们不断按按钮时,会出现相同结果叠加的情况

     那么,怎么才能使我们的结果不叠加呢?其实很简单,我们只需要对其进行基本的设置就OK。如下图所示:

    刚刚我们操作的都是获取内容的按钮,下面我们写一下修改内容的核心代码:

    案例一:修改原内容

    1. <div id="screen">welcome to jsdiv>
    2. <button id="one">获取内容的按钮button>
    3. <button id="two">修改内容的按钮button>
    4. <script>
    5. //首先要获取到这个获取内容的按钮
    6. let btn=document.querySelector('#one');
    7. //使它能够产生获取点击的事件类型
    8. btn.onclick=function(){
    9. let screen=document.querySelector('#screen');
    10. //获取到div中的welcome to js的内容
    11. console.log(screen.innerHTML);
    12. }
    13. let btn2=document.querySelector('#two');
    14. btn2.onclick=function(){
    15. let screen=document.querySelector('#screen');
    16. screen.innerHTML='这是修改后的内容';
    17. }
    18. script>

    案例二:实现plus操作(核心代码)

    1. <div id="screen">0div>
    2. <button id ="plus" >+button>
    3. <script>
    4. let plusBtn = document.querySelector("#plus");
    5. plusBtn.onclick = function () {
    6. //1.获取screen里面的值
    7. let screen = document.querySelector("#screen");
    8. //这个时候得到的类型是字符串类型,可以用typeof进行检测
    9. let val = screen.innerHTML;
    10. //因为是字符串类型,直接加的话只能够实现拼接,所以这个时候,我们先将它转化为数字类型
    11. val=parseInt(val);
    12. //2.将其+1
    13. val += 1;
    14. //3.将这个值写回原来的位置
    15. screen.innerHTML=val;
    16. }
    17. script>

    通过input标签来添加一个边框,来实现加的操作。(核心代码如下:)

    1. <input type="text" id="screen" value="0">
    2. <button id ="plus" >+button>
    3. <script>
    4. let plusBtn = document.querySelector("#plus");
    5. plusBtn.onclick = function () {
    6. //1.获取screen里面的值
    7. let screen = document.querySelector("#screen");
    8. //这个时候得到的类型是字符串类型,可以用typeof进行检测
    9. let val = screen.value;
    10. //因为是字符串类型,直接加的话只能够实现拼接,所以这个时候,我们先将它转化为数字类型
    11. val=parseInt(val);
    12. //2.将其+1
    13. val += 1;
    14. //3.将这个值写回原来的位置
    15. screen.value=val;
    16. }
    17. script>
    18. body>

    b.操作元素的属性:

    通过dom对象.属性名来进行操作。

    案例一:(通过以下代码实现点击切换图片的效果)

    1. <img src="1.jpg">
    2. <script>
    3. let img = document.querySelector('img');
    4. img.onclick = function(){
    5. let s = img.src;
    6. if(s.indexOf('1.jpg') >= 0){//是否包含这个地址,与java中的indexOf的用法差不多
    7. img.src = '2.jpg';
    8. }else if(s.indexOf('2.jpg') >= 0){
    9. img.src = '1og.jpg';
    10. }
    11. }
    12. script>
    13. body>

    下面我们介绍几个表单的专有属性。

    value: input 的值.

    disabled:禁用;

    checked:复选框会使用;

    selected:下拉框会使用;

    type:input 的类型(文本, 密码, 按钮, 文件等);

    案例二:切换按钮的显示文本

    1. <input type="button" value="播放">
    2. <script>
    3. let input=document.querySelector('input');
    4. input.onclick=function(){
    5. if(input.value=='播放'){
    6. input.value='暂停';
    7. }else if(input.value=='暂停'){
    8. input.value='播放';
    9. }
    10. }
    11. script>
    12. body>

    注意:在input中选中元素是.value不是用.innerHTML

    案例三:通过切换checked值来实现全选效果

    1. <body>
    2. <input type="checkbox" id="all">all<br>
    3. <input type="checkbox"class='fruit'>apple<br>
    4. <input type="checkbox" class="fruit">watermelon<br>
    5. <input type="checkbox" class="fruit">grape<br>
    6. <input type="checkbox" class="fruit">strawberry<br>
    7. <script>
    8. //1.获取到元素
    9. let all=document.querySelector('#all');
    10. let fruits=document.querySelectorAll('.fruit');
    11. //2.给all注册点击事件
    12. all.onclick=function(){
    13. for(let i=0;ilength;i++){
    14. //通过控制当all选择时全选择
    15. fruits[i].checked=all.checked;
    16. }
    17. }
    18. //3.对每个水果注册点击事件,实现对all的取消
    19. for(let i=0;ilength;i++){
    20. fruits[i].onclick=function(){
    21. all.checked=checkFruits(fruits);
    22. }
    23. }
    24. function checkFruits(fruits){
    25. //判定是不是所有都被选中
    26. for(let i=0;ilength;i++){
    27. if(!fruits[i].checked){
    28. return '';
    29. }
    30. }
    31. //均选中
    32. return 'checked';
    33. }
    34. script>
    35. body>

    结果展示:

     c.操作元素的样式:

    本质上也是操作元素的属性。我们这里有两个操作。注意:css中一般不用驼峰,而js通常用驼峰,css中的-转换成下个字母的驼峰。

    案例一:点击字体放大

    一个是style对应行内样式(直接把样式写到style里面)

    1. <div style="font-size:20px">这是个文本div>
    2. <script>
    3. let div=document.querySelector('div');
    4. div.onclick=function(){
    5. //1.获取字体的大小
    6. console.log(div.style.fontSize);
    7. //2.在当前字体大小的基础上,多增加5px
    8. //①将字符串类型转化为数字类型,才可以进行加减
    9. let fontSize=parseInt(div.style.fontSize);
    10. fontSize+=5
    11. //打印出来,别忘了添加单位,修改CSS属性值时,单位不合适会被当做无效值来处理
    12. div.style.fontSize=fontSize+'px';
    13. }
    14. script>

    案例二:实现一个夜间模式

    第二个是className/classList对应内部样式/外部样式。应用了一个/一组css类名。

    在HTML中,表示类名的属性就是class,但是在JS里,属性名变成了className/classList为啥不直接使用class这个名字?class在js中也是一个关键字。

    对于修改样式较多的来说,通过style进行修改就显得非常麻烦,所以我们可以直接借助CSS类来修改,把要修改的属性放在一个类里。

    核心代码如下;

    1. <style>
    2. div{
    3. height: 300px;
    4. width: 500px;
    5. }
    6. .light{
    7. background-color: #fff;
    8. color: black;
    9. }
    10. .dark{
    11. background-color: black;
    12. color: #fff;
    13. }
    14. style>
    15. <div class="light">一段文字div>
    16. <button id="btn">关灯button>
    17. <script>
    18. // 夜间模式:
    19. let div = document.querySelector('.light');
    20. let btn = document.querySelector('#btn');
    21. btn.onclick = function(){
    22. if(div.className == 'light'){//通过class来切换样式
    23. div.className = 'dark';
    24. btn.innerHTML = '开灯';
    25. }else if(div.className == 'dark'){
    26. div.className = 'light';
    27. btn.innerHTML = '关灯';
    28. }
    29. }
    30. script>

    得到的效果,如下所示:

    2.4操作节点

    对于节点的操作,实质上就是新增节点和删除节点。下面我们就对这两个 操作进行详细的讲解。

    ①新增节点:

    a.创建新节点:使用createElement来创建一个元素

    b.把节点挂在dom树上:使用appendChild把节点插入到某个节点的子元素中

    核心代码:

    1. <div class="container">
    2. div>
    3. <script>
    4. //1.创建新节点,createElement就可以创建一个新的元素
    5. let newDiv = document.createElement('div');
    6. newDiv.id = 'newDiv';
    7. newDiv.className = 'one';
    8. newDiv.innerHTML = 'hello';
    9. //2.把节点挂在dom树上 可以使用appendChild把节点插入到某个节点的子元素中
    10. let container = document.querySelector('.container');
    11. //通过appendChild来插入
    12. container.appendChild(newDiv);
    13. script>

    ②删除节点:(通过removeChild来对节点进行删除)

    先拿到父节点然后在拿到待删除的子节点就可以进行删除了

    在上述新增节点的基础上来对节点进行删除,核心代码如下:

    1. <div class="container">
    2. div>
    3. <button id="btn">
    4. 点击删除
    5. button>
    6. <script>
    7. let newDiv = document.createElement('div');
    8. newDiv.id = 'newDiv';
    9. newDiv.className = 'one';
    10. newDiv.innerHTML = 'hello';
    11. let container = document.querySelector('.container');
    12. container.appendChild(newDiv);//这样就可以插入元素了
    13. //通过removeChild就可以进行删除了
    14. let btn = document.querySelector('#btn');
    15. btn.onclick = function(){
    16. container.removeChild(newDiv);
    17. }
    18. script>

    3.两个案例

    这两个案例实际上是对间断性学习的一个总结。

    3.1猜数字案例

    核心代码如下:需要注意的地方都写在代码中啦

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>猜数字小游戏title>
    6. head>
    7. <body>
    8. <button id="resetBtn">重新开始游戏button><br>
    9. <span>要猜的数字: span>
    10. <input type="text">
    11. <button id="guessBtn">button><br>
    12. <span>结果: span><span id="result">span><br>
    13. <span>已经猜的次数: span><span id="guessCount">0span>
    14. <script>
    15. //1.拿到上面需要用的元素
    16. let resetBtn = document.querySelector('#resetBtn');
    17. let input = document.querySelector('input');
    18. let guessBtn = document.querySelector('#guessBtn');
    19. let resultSpan = document.querySelector('#result');
    20. let guessCountSpan = document.querySelector('#guessCount');
    21. // 2. 生成一个 1-100 的随机整数.
    22. //因为随机生成的是0-1之间的小数,所以*100是使其扩大100倍成为0-100间的数
    23. //而floor方法是将小数部分舍去,使其成为整数
    24. let toGuess = Math.floor(Math.random() * 100) + 1;
    25. console.log(toGuess);
    26. //3.猜按钮的逻辑
    27. guessBtn.onclick = function() {
    28. //①读取input中的内容,将字符串类型转为整数类型
    29. if (input.value == '') {//如果为空,则不转
    30. return;
    31. }
    32. let curNum = parseInt(input.value);
    33. // ②判断已猜数值和实际数值的大小
    34. if (curNum < toGuess) {
    35. resultSpan.innerHTML = '猜小了哦'
    36. resultSpan.style.color = 'red';
    37. } else if (curNum > toGuess) {
    38. resultSpan.innerHTML = '猜大了哦';
    39. resultSpan.style.color = 'red';
    40. } else {
    41. resultSpan.innerHTML = '恭喜你,猜对啦!';
    42. resultSpan.style.color = 'green';
    43. }
    44. // 4. 更新猜的次数.
    45. let guessCount = parseInt(guessCountSpan.innerHTML);
    46. guessCountSpan.innerHTML = guessCount + 1;
    47. }
    48. // 5. 开始新游戏的操作
    49. resetBtn.onclick = function() {
    50. // 让页面刷新即可~
    51. // location 是和 document 并列关系的对象.
    52. // location 用来控制页面的链接/地址. 通过 reload 操作就可以刷新页面.
    53. location.reload();
    54. }
    55. script>
    56. body>
    57. html>

    输出结果展示:

    3.2表白墙案例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>表白墙title>
    6. head>
    7. <body>
    8. <style>
    9. *{
    10. margin: 0;
    11. padding: 0;
    12. box-sizing: border-box;
    13. }
    14. .container{
    15. width: 100%;
    16. background-color: darksalmon;
    17. height: 700px;
    18. }
    19. h1{
    20. text-align: center;
    21. padding: 20px 0;
    22. }
    23. p{
    24. text-align: center;
    25. color: #999999;
    26. padding: 10px 0;
    27. }
    28. .row{
    29. width: 400px;
    30. height: 50px;
    31. margin: 0 auto;
    32. display: flex;
    33. justify-content: center;
    34. align-items: center;
    35. }
    36. .row span{
    37. width: 70px;
    38. height: 20px;
    39. }
    40. .row input{
    41. width: 300px;
    42. height: 40px;
    43. line-height: 40px;
    44. text-indent: 0.5em;
    45. /* 去掉输入框的轮廓线 */
    46. outline: none;
    47. }
    48. .row #submit{
    49. width: 200px;
    50. height: 40px;
    51. font-size: 20px;
    52. line-height: 40px;
    53. margin: 0 auto;
    54. color: white;
    55. background-color: orange;
    56. /* 去掉边框 */
    57. border: none;
    58. border-radius: 10px;
    59. }
    60. .row #submit:active{
    61. background-color: gray;
    62. }
    63. style>
    64. <div class="container">
    65. <h1>表白墙h1>
    66. <p>输入后点击提交, 会将信息显示在表格中p>
    67. <div class="row">
    68. <span>表白者: span>
    69. <input type="text">
    70. div>
    71. <div class="row">
    72. <span>被表白者: span>
    73. <input type="text">
    74. div>
    75. <div class="row">
    76. <span>表白内容: span>
    77. <input type="text">
    78. div>
    79. <div class="row">
    80. <button id="submit">提交button>
    81. div>
    82. div>
    83. <script>
    84. //当用户点击按钮,就会获取到input里面的内容,并把页面
    85. let submitBtn = document.querySelector("#submit");
    86. submitBtn.onclick = function () {
    87. //获取到input里面的内容
    88. let inputs = document.querySelectorAll("input");
    89. let from = inputs[0].value;
    90. let to = inputs[1].value;
    91. let msg = inputs[2].value;
    92. if(from == '' || to == '' || msg == ''){
    93. return;
    94. }
    95. let div = document.createElement("div");
    96. div.innerHTML = from + "对" + to + "说:" + msg;
    97. div.className = 'row';
    98. let container = document.querySelector(".container");
    99. container.appendChild(div);
    100. //清空之前输入框的内容
    101. for(let i = 0;i < inputs.length;i++){
    102. inputs[i].value = '';
    103. }
    104. }
    105. script>
    106. body>
    107. html>

    效果展示图如下:

    本节内容就到这里啦,今天涉及的案例都是仅有前端内容构成~ 

  • 相关阅读:
    【面试题精讲】Java超过long类型的数据如何表示
    潇洒郎: Airtest之Android终端自动化测试
    web前端开发实例教程:从基础到进阶的全方位探索
    Linux查看日志文件的常用命令
    Linux_基础指令(一)
    在LEAP系统中,如果我想预测中国天然气需求,除了考虑人口、城镇化率、GDP等五个因素还需要考虑其他因素吗?
    猫头虎博主第5️⃣期赠书活动:《Java官方编程手册(第12版·Java 17)套装上下册》
    操作系统知识回顾(更新中,自用)
    [附源码]java毕业设计科院垃圾分类系统
    华为c语言编程规范
  • 原文地址:https://blog.csdn.net/weixin_58850105/article/details/125891084