【前端JavaScript WebAPI】01 - 获取DOM元素 + 事件操作属性和样式

JS 的组成
JS的组成

1. Web API介绍

1.1 API的概念

  1. APIApplication Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,无需理解其内部工作机制细节,只需直接调用使用即可。
API应用程序编程接口

1.2 Web API的概念

  1. Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOMDOM )。

  2. 现阶段我们主要针对于浏览器讲解常用的 API, 主要针对浏览器做交互效果。比如我们想要浏览器弹出一个警示框, 直接使用 alert(‘弹出’)

  3. 此处的 Web API 特指浏览器提供的一系列API(很多函数或对象方法),即操作网页的一系列工具。例如:操作html标签、操作页面地址的方法。

1.3 API 和 Web API 总结

  1. API 是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用就可以了,不必纠结内部如何实现;

  2. Web API 主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果。;

  3. Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数);

  4. 学习 Web API 可以结合前面学习内置对象方法的思路学习。

2. DOM 介绍

2.1 什么是DOM

  1. 文档对象模型(Document Object Model,简称DOM),是 W3C 组织推荐的处理可扩展标记语言html或者xhtml)的标准编程接口

  2. W3C已经定义了一系列的DOM 接口,通过这些DOM接口可以改变网页的内容、结构和样式。

  3. DOMW3C组织制定的一套处理 htmlxml文档的规范,所有的浏览器都遵循了这套标准。

2.2 DOM树

DOM树
  1. DOM 树 又称为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面。
  • 文档:一个页面就是一个文档,DOM中使用document表示;
  • 节点:网页中的所有内容,在文档树中都是节点(标签、属性、文本、注释等),使用node表示;
  • 标签节点:网页中的所有标签,通常称为元素节点,又简称为“元素”,使用element表示。

3. 获取元素

为什么要获取页面元素?
  1. 例如:我们想要操作页面上的某部分(显示/隐藏,动画),需要先获取到该部分对应的元素,再对其进行操作。

3.1 根据ID获取

语法:document.getElementById(id);
作用:根据ID获取元素对象;
参数:id值,区分大小写的字符串;
返回值:元素对象 或 null

案例代码
<div id="time">2020-11-29</div>
<script>
  // 1. 因为我们文档页面从上往下加载的,所以需要先有标签
  let timeDiv = document.getElementById('time');
  console.log(typeof timeDiv); // Object
  console.dir(timeDiv); // 打印返回的元素对象
</script>

3.2 根据标签名获取元素

语法:document.getElementsByTagName('标签名') 或者 element.getElementsByTagName('标签名')
作用:根据标签名获取元素对象;
参数:标签名;
返回值:元素对象集合(伪数组,数组元素是元素对象)。

案例代码
<body>

<ul id="first">
  <li>知否知否</li>
  <li>知否知否</li>
  <li>知否知否</li>
  <li>知否知否</li>
  <li>知否知否</li>
</ul>

<ul id="second">
  <li>哈哈哈哈</li>
  <li>哈哈哈哈</li>
  <li>哈哈哈哈</li>
  <li>哈哈哈哈</li>
  <li>哈哈哈哈</li>
  <li>哈哈哈哈</li>
</ul>

<script>
  let liTag = document.getElementsByTagName('li');
  console.log(liTag);

  // 打印里面的元素
  for (let i = 0; i < liTag.length; i++) {
    console.log(liTag[i]);
  }

  // 如果执行获取第二个ul中的li
  let secondUl = document.getElementById('second');
  let secondLi = secondUl.getElementsByTagName('li');

  // 打印里面的元素
  for (let i = 0; i < secondLi.length; i++) {
    console.log(secondLi[i]);
  }
</script>
</body>

注意:getElementsByTagName()获取到是动态集合,即:当页面增加了标签,这个集合中也就增加了元素。

3.3 H5新增获取元素方式

H5新增获取元素方式

注意:querySelector和querySelectorAll里面的选择器需要加上选择器对应的符号,比如:document.querySelector('#nav')

案例代码
<body>
<div class="box">盒子1</div>
<div class="box">盒子2</div>
<div id="nav">
  <ul>
    <li>首页</li>
    <li>产品</li>
  </ul>
</div>
<script>
  /* H5新增获取元素的方法 */
  let boxs = document.getElementsByClassName('box');
  console.log(boxs);
  /* querySelector返回指定选择器的第一个元素对象切记里面的选择器需要加上指定的符号 */
  let firstBox = document.querySelector('.box');
  console.log(firstBox);
  let nav = document.querySelector('#nav');
  console.log(nav);
  let firstLi = document.querySelector('li');
  console.log(firstLi);
  /* 返回指定选择器的所有元素对象 */
  let boxList = document.querySelectorAll('.box');
  console.log(boxList);
  let lis = document.querySelectorAll('li');
  console.log(lis);
</script>
</body>

3.4 获取特殊元素

  1. 获取body元素:
 let bodyEle = document.body;
  1. 获取html元素:
let htmlEle = document.documentElement;

4. 事件基础

4.1 事件概述

  1. JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。

  2. 简单理解: 触发--- 响应机制

  3. 网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个 事件,然后去执行某些操作。

4.2 事件三要素

  1. 事件源(谁):触发事件的元素;

  2. 事件类型(什么事件): 例如 click 点击事件;

  3. 事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数。

案例代码
  1. 点击一个案例弹出一个alert()提示框。
<body>
<button id="btn">点我</button>
<script>
  // 点击一个按钮弹出对话框
  // 1. 事件是由三部分组成的 事件源 事件类型 事件处理程序
  // a. 事件源 事件被处罚的对象
  let btn = document.getElementById('btn');
  // b. 事件类型 :如何触发什么事件 比如鼠标点击还是鼠标经过
  // c. 事件处理程序
  btn.onclick = function () {
    alert('您点我了!')
  }
</script>
</body>

4.3 执行事件的步骤

  1. 获取事件源;

  2. 注册事件;

  3. 添加事件处理程序(采取函数形式赋值)。

案例代码
<body>
<div>123</div>
<script>
  // 事件执行的步骤
  // 点击div 控制台输出我被选中了
  // 1.   获取事件源
  // 使用 document.getElementsByTagName('div') 获取到的div 元素注册的事件不生效
  let div = document.querySelector('div');
  console.log(div);
  // 2. 绑定事件 注册事件
  // div.onclick
  // 3. 添加事件处理程序
  div.onclick = function () {
    console.log('我被选中了');
  }
</script>
</body>
4.4 常见的鼠标事件
常见鼠标事件

5. 操作元素

  1. JavaScriptDOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM操作元素来改变元素里面的内容、属性等。(注意:这些操作都是通过元素对象的属性实现的)。

5.1 改变元素内容(获取或设置)

改变元素内容
操作元素之改变元素内容
<body>
<button>点击获取时间</button>
<div>****-**-** **:**:**</div>
<script>
 let btn = document.querySelector('button');
 let div = document.querySelector('div');

 btn.onclick = function () {
   // 设置元素的内容为当前时间
   div.innerText = getDate();
 }

 function getDate() {
   let date = new Date();
   let year = date.getFullYear(); // 获取当前的年份
   let month = formatDate(date.getMonth() + 1); // 获取月份 需要进行 +1
   let dates = formatDate(date.getDate()); // 获取日
   let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
   let day = date.getDay(); // 获取今天是星期几
   let hour = formatDate(date.getHours());
   let minutes = formatDate(date.getMinutes());
   let seconds = formatDate(date.getSeconds());
   return '今天是:' + year + '年' + month + '月' + dates + '日' + '  ' + hour + ':' + minutes + ':' + seconds + '  ' + weeks[day];
 }

 function formatDate(param) {
   return param < 10 ? '0' + param : param;
 }

</script>
</body>
innerText和innerHTML的区别
  1. 获取内容时的区别:innerText会去除空格和换行,而innerHTML会保留空格和换行;

  2. 设置内容时的区别:innerText不会识别html,而innerHTML会识别。W3C标准。

  3. 这两个属性都是可读写的,既可以通过他们设置内容也可以通过他们获取内容。

<body>

<button>点我</button>
<div></div>

<p>
  p标签
  <span>
    哈哈哈哈
  </span>
</p>
<script>
  // innerText 和 innerHTML 的区别

  // 1. innerText 不识别html标签 并且去除空格和换行,非标准
  let btn = document.querySelector('button');
  let div = document.querySelector('div');
  btn.onclick = function () {
    // div.innerText = '<strong>加粗</strong> : 123'; // 不识别 html 标签
    div.innerHTML = '<strong>加粗</strong> : 123';
  }
  // 2. innerHtml 识别html标签,W3C标准

  // 3. 这两个属性是可读写的,可以获取元素里面的内容
  //  a. 通过 innerText 获取
  let p = document.querySelector('p');
  let pInnerText = p.innerText;
  let pInnerHtml = p.innerHTML;
  console.log(pInnerText); // 结果 p标签 哈哈哈哈
  console.log(pInnerHtml); // 结果  p标签<span>哈哈哈哈</span>
</script>
</body>

5.2 常用元素的属性操作

常用元素的属性
获取属性的值

元素对象.属性名

设置属性的值

元素对象.属性名=值

案例代码
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button>
<img src="../images/ldh.jpg" alt="刘德华" title="刘德华">
<script>
  let ldh = document.querySelector('#ldh');
  let zxy = document.querySelector('#zxy');
  let img = document.querySelector('img');

  ldh.onclick = function () {
    img.src = '../images/ldh.jpg';
    img.title = '刘德华';
    img.alt = '刘德华';
  };

  zxy.onclick = function () {
    img.src = '../images/zxy.jpg';
    img.title = '张学友';
    img.alt = '张学友';
  };
</script>
</body>

5.3 案例:分时问候

  1. 在不同的时间段内显示不同的图片和问候语:
<body>
<img src="../images/w.gif" alt="">
<div>晚上好</div>
<script>
  let img = document.querySelector('img');
  let div = document.querySelector('div');
  let date = new Date();
  let h = date.getHours();
  if (h < 12) {
    img.src = '../images/z.gif';
    div.innerHTML = '早上好';
  } else if (h < 18) {
    img.src = '../images/x.gif';
    div.innerHTML = '下午好';
  } else {
    img.src = '../images/w.gif';
    div.innerHTML = '晚上好';
  }
</script>
</body>

5.4 表单元素的属性操作

表单元素的属性操作
获取属性的值

元素对象.属性名

设置属性的值

元素对象.属性名 = 值
表单元素中有一些属性如:disabled、checked、selected,元素对象的这些属性的值是布尔型。

案例代码
<body>
<button>按钮</button>
<input type="text" value="请输入内容">
<script>
  // this指向当前事件函数的调用者
  let button = document.querySelector('button');
  let input = document.querySelector('input');
  /**
   * 处理button的单击事件
   */
  button.onclick = function () {
    // 点击一次之后就将其禁用
    this.disabled = true;
    input.value = '被点击了';
  }
</script>
</body>

5.5 案例:仿京东显示隐藏密码

  1. 点击右侧的显示或隐藏按钮显示或隐藏文本框中的密码:


    隐藏密码
显示密码
<style>
    .box {
      position: relative;
      width: 400px;
      margin: 100px auto;
      border-bottom: 1px solid #cccccc;
    }

    .box input {
      width: 370px;
      height: 30px;
      outline: none;
      border: none;
      padding-left: 20px;
    }

    .box img {
      position: absolute;
      top: 2px;
      right: 6px;
      width: 24px;
      cursor: pointer;
    }

    /* 去除密码框的默认小眼睛样式 */
    input[type="password"]::-ms-reveal {
      display: none
    }
  </style>

<body>
<div class="box">
  <label for="password">
    <img src="../../images/close.png" alt="" id="eye">
    <input type="password" id="password">
  </label>
</div>

<script>
  let pwd = document.getElementById('password');
  let eye = document.getElementById('eye');

  let flag = 0;
  eye.onclick = function () {
    if (flag === 0) {
      pwd.type = 'password';
      this.src = '../../images/close.png';
      flag = 1;
    } else {
      pwd.type = 'text';
      this.src = '../../images/open.png';
      flag = 0;
    }
  }
</script>
</body>

5.6 样式属性操作

  1. 当触发单击事件时,改变div样式。
 <style>
    div {
      width: 200px;
      height: 200px;
      background-color: skyblue;
    }
  </style>

<body>
<div></div>
<script>
  // 1. 获取元素
  let div = document.querySelector('div');
  // 2. 注册事件 // 3. 处理程序
  div.onclick = function () {
    // 行内样式 JS修改style样式操作产生的是行内样式,CSS权重比较高
    this.style.backgroundColor = 'purple';
    this.style.width = '230px';
  }
</script>
</body>
  1. 我们可以通过 JS修改元素的大小、颜色、位置等样式。
常用方式
  1. element.style 行内样式。

  2. element.className类名样式。如果原来的 className 中有类名样式,此操作将对其进行覆盖。

通过操作style属性

元素对象的style属性也是一个对象!
元素对象.style.样式属性 = 值;

注意:JS 里面的样式采用驼峰命名法,比如fontSizebackgroundColor

JS修改Style样式操作,产生的行内样式CSS权重比较高。

5.7 案例:淘宝点击关闭二维码

  1. 当鼠标点击二维码关闭按钮的时候则关闭整个二维码:
关闭二维码
  <style>
    .box {
      position: relative;
      width: 200px;
      height: 200px;
      margin: 100px auto;
      border: 1px solid #ccc;
      text-align: center;
      color: #EF522F;
      border-radius: 6px;
      -webkit-border-radius: 6px;
      box-sizing: border-box;
    }

    .box img {
      margin-top: 5px;
    }

    .box i {
      position: absolute;
      width: 20px;
      height: 20px;
      border: 1px solid #ccc;
      left: -25px;
      color: #ccc;
      border-radius: 2px;
      cursor: pointer;
    }
  </style>
<body>
<div class="box">
  淘宝二维码
  <img src="../images/tao.png" alt="">
  <i class="close_btn" id="iBtn">x</i>
</div>

<script>
  let iBtn = document.getElementById('iBtn');
  let box = document.querySelector('.box');
  iBtn.onclick = function () {
    box.style.display = 'none';
  }
</script>
</body>

5.8 案例 :循环精灵图

  1. 可以利用for循环设置一组 元素的精灵图背景:
循环精灵图
  <style>

    ul {
      list-style: none;
      padding: 0;
      margin: 0;
    }

    li {
      padding: 0;
      margin: 0;
    }

    .box {
      width: 250px;
      margin: 100px auto;
    }

    .box li {
      float: left;
      width: 24px;
      height: 24px;
      margin: 15px;
      background-image: url(../images/sprite.png);
    }
  </style>
<body>
<div class="box">
  <ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
</div>
<script>
  let lis = document.querySelectorAll('li');
  for (let i = 0; i < lis.length; i++) {
    let index = i * 44;
    lis[i].style.backgroundPosition = '0 -' + index + 'px';
  }
</script>
</body>

5.9 案例:显示和隐藏文本框内容

  1. 当鼠标点击文本框时,里面默认文字隐藏,当鼠标离开文本框时,里面文字显示。
显示和隐藏文本框内容
<body>
<input type="text" value="手机">
<script>
  let text = document.querySelector('input');

  /**
   * 当文本框获取焦点的时候
   */
  text.onfocus = function () {
    if (this.value === '手机') {
      this.value = '';
    }
    // 当输入文字之后文字颜色变黑
    this.style.color = '#333';
  }

  /**
   * 鼠标失去焦点事件
   */
  text.onblur = function () {
    if (this.value === '') {
      this.value = '手机';
    }
    // 当鼠标移开时文字颜色变浅
    this.style.color = '#999'
  }
</script>
</body>
通过操作className属性

元素对象.className = 值;
因为class是关键字,所有使用className。

注意
  1. 如果样式修改较多的时候可以采取操作类名的方式更改元素样式。

  2. class因为是保留字 ,因此使用className来操作元素 类名属性。

  3. className会直接更改元素的类名,会覆盖原先的类名。

案例代码
 <style>
    div {
      width: 200px;
      height: 200px;
      background-color: skyblue;
    }

    .change {
      background-color: purple;
      margin-top: 100px;
      color: #fff;
    }
  </style>
<body>
<div class="first">文本</div>
<script>
  let changeClassName = document.querySelector('div');
  changeClassName.onclick = function () {
    // 可以通过修改元素的className更改元素的样式适合于样式较多或者功能复杂的情况
    // 会直接覆盖原来的类名
    // 如果想要保留原先的类名 可以这么做
    // this.className = 'change';
    this.className = 'first change';
    // this.className += ' ' + 'change';
  }
</script>
</body>

5.10 案例:密码框格式提示错误信息

  1. 用户如果离开密码框,里面输入 个数不是6~16时,提示错误信息,否则提示输入正确信息。
输入错误
输入正确
<style>
    div {
      width: 600px;
      margin: 100px auto;
    }

    .message {
      display: inline-block;
      background: url(../images/mess.png) left center no-repeat;
      padding-left: 20px;
      font-size: 12px;
      color: #999;
      vertical-align: middle;
    }

    .wrong {
      background-image: url(../images/wrong.png);
      color: #f00;
    }

    .right {
      background-image: url(../images/right.png);
      color: #0f0;
    }
  </style>
<body>
<div class="registry">
  <input type="password" class="ipt">
  <p class="message">请输入6~16位的密码!</p>
</div>
<script>
  let ipt = document.querySelector('.ipt');
  let message = document.querySelector('.message');
  ipt.onblur = function () {
    if (this.value.length < 6 || this.value.length > 16) {
      message.className = 'message wrong';
      message.innerHTML = '您输入的不符合规范!'
    } else {
      message.className = 'message right';
      message.innerHTML = '您输入正确!'
    }
  }
</script>
</body>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350