JavaScript WebAPI 核心操作指南

JavaScript(WebAPI)

WebAPI 背景知识
什么是 WebAPI

前面学习的 JS 分成三个大的部分:

  • ECMAScript:基础语法部分
  • DOM API:操作页面结构
  • BOM API:操作浏览器

WebAPI 就包含了 DOM + BOM。

这个是 W3C 组织规定的(和制定 ECMAScript 标准的大佬们不是一伙人)。

前面学的 JS 基础语法主要学的是 ECMAScript,这让我们建立基本的编程思维,相当于练武需要先扎马步。但是真正来写一个更加复杂的有交互式的页面,还需要 WebAPI 的支持,相当于各种招式。

什么是 API

API 是一个更广义的概念,而 WebAPI 是一个更具体的概念,特指 DOM+BOM。

所谓的 API 本质上就是一些现成的函数 / 对象,让程序猿拿来就用,方便开发。相当于一个工具箱,只不过程序猿用的工具箱数目繁多,功能复杂。

API 参考文档

https://developer.mozilla.org/zh-CN/docs/Web/API可以在搜索引擎中按照 "MDN + API 关键字" 的方式搜索,也能快速找到需要的 API 文档.

DOM 基本概念

什么是 DOM

DOM 全称为 Document Object Model.W3C 标准给我们提供了一系列的函数,让我们可以操作:

  • 网页内容
  • 网页结构
  • 网页样式
DOM 树

一个页面的结构是一个树形结构,称为 DOM 树.树形结构在数据结构阶段会介绍。就可以简单理解成类似于 "家谱" 这种结构

页面结构形如:

如何使用JavaScript操作网页内容?

如何使用JavaScript操作网页结构?

如何使用JavaScript操作网页样式?

获取元素

这部分工作类似于 CSS 选择器的功能。

querySelector

这个是 HTML5 新增的,IE9 及以上版本才能使用。前面的几种方式获取元素的时候都比较麻烦,而使用 querySelector 能够完全复用前面学过的 CSS 选择器知识,达到更快更精准的方式获取到元素对象。

javascript 复制代码
var element = document.querySelector(selectors);
  • selectors 包含一个或多个要匹配的选择器的 DOM 字符串 DOMString。该字符串必须是有效的 CSS 选择器字符串;如果不是,则引发 SYNTAX_ERR 异常。
  • 表示文档中与指定选择器组匹配的第一个元素的 html 元素 Element 对象。
  • 如果想得到与指定选择器匹配的所有元素的列表,则应该使用 querySelectorAll ()。
  • 可以在任何元素上调用,不仅仅是 document。调用这个方法的元素将作为本次查找的根元素。

正因为参数是选择器,所以一定要通过特殊符号指定是哪种选择器。例如 .box 是类选择器,#star 是 id 选择器等。

html 复制代码
<div class="box">abc</div>
<div id="id">def</div>
<h3><span><input type="text"></span></h3>
<script>
    var elem1 = document.querySelector('.box');
    console.log(elem1);
    var elem2 = document.querySelector('#id');
    console.log(elem2);
    var elem3 = document.querySelector('h3 span input');
    console.log(elem3);
</script>
querySelectorAll

使用 querySelectorAll 用法和上面类似。

html 复制代码
<div class="box">abc</div>
<div id="id">def</div>
<script>
    var elems = document.querySelectorAll('div');
    console.log(elems);
</script>

事件初识

基本概念

JS 要构建动态页面,就需要感知到用户的行为。用户对于页面的一些操作(点击,选择,修改等)操作都会在浏览器中产生一个个事件,被 JS 获取到,从而进行更复杂的交互操作。

浏览器就是一个哨兵,在侦查敌情(用户行为)。一旦用户有反应(触发具体动作),哨兵就会点燃烽火台的狼烟(事件),后方就可以根据狼烟来决定下一步的对敌策略。

事件三要素
  1. 事件源:哪个元素触发的
  2. 事件类型:是点击,选中,还是修改?
  3. 事件处理程序:进一步如何处理,往往是一个回调函数。

简单示例

html 复制代码
<button id="btn">点我一下</button>
<script>
    var btn = document.getElementById("btn");
    btn.onclick = function () {
        alert("hello world");
    }
</script>
  • btn 按钮就是事件源。
  • 点击就是事件类型。
  • function 这个匿名函数就是事件处理程序。
  • 其中 btn.onclick = function() 这个操作称为注册事件 / 绑定事件。

注意:这个匿名函数相当于一个回调函数,这个函数不需要程序主动来调用,而是交给浏览器,由浏览器自动在合适的时机(触发点击操作时)进行调用。

操作元素

获取 / 修改元素内容
  1. innerTextElement.innerText 属性表示一个节点及其后代的 "渲染" 文本内容。
javascript 复制代码
// 读操作
var renderedText = HTMLElement.innerText;
// 写操作
HTMLElement.innerText = string;

不识别 html 标签,是非标准的(IE 发起的),读取结果不保留 html 源码中的换行和空格。

html 复制代码
<div>
    <span>hello world</span>
    <span>hello world</span>
</div>
<script>
    var div = document.querySelector('div');
    // 读取 div 内部内容
    console.log(div.innerText);
    // 修改 div 内部内容,界面上就会同步修改
    div.innerText = 'hello js <span>hello js</span>';
</script>

可以看到,通过 innerText 无法获取到 div 内部的 html 结构,只能得到文本内容。修改页面的时候也会把 span 标签当成文本进行设置。

  1. innerHTMLElement.innerHTML 属性设置或获取 HTML 语法表示的元素的后代。
javascript 复制代码
// 读操作
var content = element.innerHTML;
// 写操作
element.innerHTML = htmlString;
  1. 先获取到事件源的元素
  2. 注册事件

识别 html 标签,W3C 标准的,读取结果保留 html 源码中的换行和空格。

html 复制代码
<div>
    <span>hello world</span>
    <span>hello world</span>
</div>
<script>
    var div = document.querySelector('div');
    // 读取页面内容
    console.log(div.innerHTML);
    // 修改页面内容
    div.innerHTML = '<span>hello js</span>'
</script>

可以看到 innerHTML 不光能获取到页面的 html 结构,同时也能修改结构,并且获取到的内容保留的空格和换行。

innerHTML 用的场景比 innerText 更多。

获取 / 修改元素属性

可以通过 Element 对象的属性来直接修改,就能影响到页面显示效果。

html 复制代码
<img src="rose.jpg" alt="这是一朵花" title="玫瑰花">
<script>
    var img = document.querySelector('img');
    console.dir(img);
</script>

我们可以在代码中直接通过这些属性来获取属性的值。

html 复制代码
<img src="rose.jpg" alt="这是一朵花" title="玫瑰花">
<script>
    var img = document.querySelector('img');
    // console.dir(img);
    console.log(img.src);
    console.log(img.title);
    console.log(img.alt);
</script>

还可以直接修改属性

html 复制代码
<img src="rose.jpg" alt="这是一朵花" title="玫瑰花">
<script>
    var img = document.querySelector('img');
    img.onclick = function () {
        if (img.src.lastIndexOf('rose.jpg') !== -1) {
            img.src = './rose2.png';
        } else {
            img.src = './rose.jpg';
        }
    }
</script>

此时点击图片就可以切换图片显示状态.(需要提前把两个图片准备好)

获取 / 修改表单元素属性

表单 (主要是指 input 标签) 的以下属性都可以通过 DOM 来修改

  • value: input 的值.
  • disabled: 禁用
  • checked: 复选框会使用
  • selected: 下拉框会使用
  • type: input 的类型 (文本,密码,按钮,文件等)
代码示例:切换按钮的文本.

假设这是个播放按钮,在 "播放" - "暂停" 之间切换.

html 复制代码
<input type="button" value="播放">
<script>
    var btn = document.querySelector('input');
    btn.onclick = function () {
        if (btn.value === '播放') {
            btn.value = '暂停';
        } else {
            btn.value = '播放';
        }
    }
</script>
代码示例:点击计数

使用一个输入框输入初始值 (整数), 每次点击按钮,值 + 1

html 复制代码
<input type="text" id="text" value="0">
<input type="button" id="btn" value='点我+1'>

<script>
    var text = document.querySelector('#text');
    var btn = document.querySelector('#btn');

    btn.onclick = function () {
        var num = +text.value;
        console.log(num);
        num++;
        text.value = num;
    }
</script>
  • input 具有一个重要的属性 value, 这个 value 决定了表单元素的内容
  • 如果是输入框,value 表示输入框的内容,修改这个值会影响到界面显式;在界面上修改这个值也会影响到代码中的属性
  • 如果是按钮,value 表示按钮的内容。可以通过这个来实现按钮中文本的替换
  1. 点击全选按钮,则选中所有选项
  2. 只要某个选项取消,则自动取消全选按钮的勾选状态.
html 复制代码
<input type="checkbox" id="all">我全都要 <br>
<input type="checkbox" class="girl">貂蝉 <br>
<input type="checkbox" class="girl">小乔 <br>
<input type="checkbox" class="girl">安琪拉 <br>
<input type="checkbox" class="girl">妲己 <br>

<script>
    // 1. 获取到元素
    var all = document.querySelector('#all');
    var girls = document.querySelectorAll('.girl');
    // 2. 给 all 注册点击事件, 选中/取消所有选项
    all.onclick = function () {
        for (var i = 0; i < girls.length; i++) {
            girls[i].checked = all.checked;
        }
    }
    // 3. 给 girl 注册点击事件.
    for (var i = 0; i < girls.length; i++) {
        girls[i].onclick = function () {
            // 检测当前是不是所有的 girl 都被选中了.
            all.checked = checkGirls(girls);
        }
    }
    // 4. 实现 checkGirls
    function checkGirls(girls) {
        for (var i = 0; i < girls.length; i++) {
            if (!girls[i].checked) {
                // 只要一个 girl 没被选中, 就认为结果是 false(找到了反例)
                return false;
            }
        }
        // 所有 girl 中都没找到反例, 结果就是全选中
        return true;
    }
</script>
相关推荐
卸任8 小时前
Vibe coding工具使用心得
前端·ai编程
brien98 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance9 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M9 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写9 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李9 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易9 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
清晨Coding9 小时前
删了 Cookie 还能自动登录?Google系网站登录态自动恢复的原理分析
javascript
风骏时光牛马9 小时前
前沿视界
前端
kyriewen9 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员