BOM(一)概述、history对象、location对象、navigator对象、事件

简介: BOM(一)概述、history对象、location对象、navigator对象、事件

一、window对象3大角色

1. 代替 ES 标准中的 global 充当全局作用域对象


       所有直接声明的全局变量和全局函数,都默认保存在 window 对象中。

2. 保存了所有"原生"的对象和方法


       不需要去第三方下载就可直接使用对象和方法,比如:window.Array, window.document,  window.alert...


3. 代表当前正在打开的这个浏览器窗口


(1)获得当前窗口的大小:

image.png


(2)打开和关闭窗口

image.png

二、打开新链接的几种情况

1. 在当前窗口打开,可后退

window.open("url", "_self")
//相当于HTML中
<a href="url"  target="_self">

2. 在当前窗口打开,禁止后退


location.replace("新url")

3. 在新窗口打开,可同时打开多个


window.open("url", "_blank");
//相当于HTML中
<a href="url"  target="_blank">

4. 在新窗口打开,只能打开一个


window.open("url", "自定义窗口名");
//相当于HTML中
<a href="url"  target="自定义窗口名">

       注意相同名称的窗口只能打开一个,如果打开第二个同名窗口,则新同名窗口会覆盖旧同名窗口。


举例:演示打开链接的四种情况;


<body>
  <h3>1. 在当前窗口打开,可后退</h3>
  <a href="www.baidu.com" target="_self">go to baidu</a><br>
  <button onclick="open1()">go to baidu</button>
  <script>
  function open1() {
    window.open("www.baidu.com", "_self");
  }
  </script>
  <h3>2. 在当前窗口打开,禁止后退</h3>
  <button onclick="open2()">go to baidu</button>
  <script>
  function open2() {
    location.replace("www.baidu.com");
  }
  </script>
  <h3>3. 在新窗口打开,可打开多个!</h3>
  <a href="www.baidu.com" target="_blank">go to baidu</a><br>
  <button onclick="open3()">go to tmooc</button>
  <script>
  function open3() {
    window.open("www.baidu.com", "_blank");
  }
  </script>
  <h3>4. 在新窗口打开,只能打开一个</h3>
  <a href="www.baidu.com" target="tmooc">go to baidu</a><br>
  <button onclick="open4()">go to baidu</button>
  <script>
  function open4() {
    window.open("www.baidu.com", "tmooc");
  }
  </script>
</body>

三、history对象

       history 是内存中专门保存当前窗口打开后成功访问过得所有 url 的历史记录数组,history 数组不可做任何修改操作,功能有前进、后退和刷新。


前进一步

image.png


举例:使用程序实现前进、回退;


<body>
  <div>
  <a href="1history.html">1</a>
  <a href="2history.html">2</a>
  <a href="3history.html">3</a>
  </div><br />
  <div>
  <a href="javascript: history.go(-1)">后退一次</a>
  <a href="javascript: history.go(1)">前进一次</a>
  </div>
</body>

四、location对象

       专门保存浏览器地址栏中正在打开的一个 url 的信息的对象。可以分段获得 url 中各个部分的信息:

image.png

五、navigator对象

       专门保存浏览器配置信息的对象。常用属性如下:

image.png

举例:检查浏览器是否安装 PDF 和 Flash 插件;


<body>
  <h3 id="msg1"></h3>
  <h3 id="msg2"></h3>
  <script>
    console.log(navigator.userAgent);
    console.log(navigator.plugins);
    var msg1 = document.getElementById("msg1");
    var msg2 = document.getElementById("msg2");
    //判断浏览器是否安装了Chrome PDF Viewer
    if (navigator.plugins["Chrome PDF Viewer"] !== undefined) {
      msg1.innerHTML = "已安装PDF插件,可正常浏览PDF电子书";
    } else {
      msg1.innerHTML = `未安装PDF插件,<a href="#">点此下载</a>安装`;
    }
    //判断浏览器是否安装了Shockwave Flash
    if (navigator.plugins["Shockwave Flash"] !== undefined) {
      msg2.innerHTML = "已安装Flash插件,可正常播放Flash视频";
    } else {
      msg2.innerHTML = `未安装Flash插件,<a href="#">点此下载</a>安装`;
    }
  </script>

六、事件

       事件是浏览器自动触发的或用户手动触发的页面中内容或状态的改变;当事件发生时,我们希望自动调用执行的函数为事件处理函数。


1. 事件绑定

(1)在HTML中手工绑定

<元素  on事件名="事件处理函数()">
<script>
      function 事件处理函数(){ ... }
</script>

(2)在 js 中以赋值方式绑定

元素对象.on事件名=function(){ this }

(3)在 js 中以添加事件监听对象的方式绑定


//1.
查找触发事件的元素,添加事件监听对象
//2.
元素对象.addEventListener("事件名", 事件处理函数)

       addEventListener 可以新建一个事件监听对象,其中保存了元素对象、事件名、事件处理函数;还自动将事件监听对象添加到事件监听对象队列中。


移除监听对象:


元素.removeEventListener("事件名", 原事件处理函数)

举例:为发射按钮添加事件监听,可同时发射多种子弹,也可移除子弹;


<body>
  <button id="btnShoot">shoot</button><br>
  <button id="btnAward">获得跟踪导弹</button><br>
  <button id="btnBreak">失去跟踪导弹</button><br>
  <script>
  var btnShoot = document.getElementById("btnShoot")
  var btnAward = document.getElementById("btnAward")
  var btnBreak = document.getElementById("btnBreak")
  //开局,点shoot按钮,只能发射一种子弹
  btnShoot.onclick = function () {
    console.log(`发射一枚普通子弹`);
  }
  var shoot2 = function () {
    console.log(`发射一枚跟踪导弹`);
  }
  //当单击获得跟踪导弹按钮后,为btnShoot按钮再多添加一种跟踪导弹
  btnAward.onclick = function () {
    btnShoot.addEventListener(
    "click",
    shoot2
    )
  }
  //当单击btnBreak按钮时,从btnShoot上移除跟踪导弹
  btnBreak.onclick = function () {
    btnShoot.removeEventListener(
    "click",
    shoot2
    )
  }
  </script>
</body>

2. 事件模型

       点在内层元素上,也会触发外层元素的单击事件;全球的浏览器开发者一致认为,点在内层元素上,也相当于点在了外层元素上,所以有了事件模型。


事件模型的三个阶段:


(1)捕获:从树根节点开始,到当前触发事件的目标元素结束,由外向内依次遍历并记录各级父元素上是否绑定了事件处理函数,只记录,不执行。


(2)目标触发:总是优先触发实际点击的目标元素上的事件处理函数。


(3)冒泡:从目标元素开始,到树根节点结束,由内向外依次触发各级父元素上绑定的事件处理函数。


3. 事件对象

       当事件发生时,浏览器自动创建的,保存事件相关信息的对象;事件对象总是作为事件处理函数的第一个实参值,自动传入。


(1)当事件发生时,浏览器会自动创建事件对象:

元素对象.on事件名=function(e){ ... }
元素对象.addEventListener("事件名",function(e){ ... })

(2)事件对象的功能:


a. 停止冒泡


e.stopPropagation()

举例:点内层元素,也触发父元素上的事件处理函数;

<body>
  <div id="d1">
  <div id="d2">
    <div id="d3">
    </div>
  </div>
  </div>
  <script>
  var d2 = document.getElementById("d2");
  var d3 = document.getElementById("d3");
  var d1 = document.getElementById("d1");
  //给每层div都绑定单击事件,可以喊疼
  d1.onclick = function () {
    console.log("d1");
  }
  d2.onclick = function (e) {
    e.stopPropagation(); //停止冒泡
    console.log("d2");
  }
  d3.onclick = function (e) {
    e.stopPropagation();
    console.log("d3");
  }
  </script>
</body>

b. 利用冒泡/事件委托


       浏览器触发事件采用的是遍历事件监听对象队列形式查找事件监听对象,如果添加的事件监听对象越多遍历时间就越长,事件响应的速度越慢;所以应该尽量减少事件绑定的次数。但功能不能少。


举例:使用事件委托实现计算器效果;


//计算器
<body>
  <div id="keys">
    <button>1</button>
    <button>2</button>
    <button>3</button>
    <button>4</button><br>
    <button>5</button>
    <button>6</button>
    <button>7</button>
    <button>8</button><br>
    <button>C</button>
    <button>+</button>
    <button>-</button>
    <button>=</button>
  </div>
  <textarea id="sc" style="resize:none;width:200px; height:50px;" readonly></textarea>
  <script>
    //DOM4步
    //1. 查找触发事件的元素
    var div = document.getElementById("keys");
    //2. 绑定事件处理函数
    div.onclick = function (e) {
      if (e.target.nodeName === "BUTTON") {
        //先获得充当显示屏的id为sc的文本域元素
        var sc = document.getElementById("sc");
        // 判断当前点击的按钮的内容
        switch (e.target.innerHTML) {
          // 如果点击“C”,清空显示屏的内容
          case "C":
            sc.value = "";
            break;
            // 如果点击“=”,获得显示屏中的表达式,计算结果
          case "=":
            var str = sc.value;
            // 尝试计算显示屏中的内容
            try {
              //将显示屏的内容交给eval做计算,将结果再替换回显示屏中
              sc.value = eval(str)
            } catch (err) {
              sc.value = err;
            }
            break;
            // 如果点击了其他的按钮,就将按钮内容追加到显示屏上
          default:
            sc.value += e.target.innerHTML;
        }
      }
    }
  </script>

c. 阻止默认行为,有两种方式:


//1.
<a href="javascript:;">文本</a>

       此方法只对a元素有效,意思是不让a跳转到其它页面,而是在当前页面的内容中执行一条js语句。; 意为是一条什么也不做的空语句;javascript:; 表示执行一条空语句。


//2.
e.preventDefault()

       此方法对任意元素有效。


举例:点a,返回页面顶部,并阻止a修改地址栏中url;


<body style="height:2000px">
  <!--希望:点a可返回顶部,但是不要在地址栏结尾加#top-->
  <a id="a1" href="#top">返回顶部</a>
  <script>
    var a1 = document.getElementById("a1");
    a1.onclick = function (e) {
      //阻止默认行为
      e.preventDefault();
      //让窗口滚动到顶部0位置
      window.scrollTo(0, 0)
    }
  </script>

d. 获取鼠标位置


鼠标相对于屏幕左侧、上方的距离

image.png

举例:点击图片,获得鼠标三组坐标位置;


<body>
  <div id="pop"></div>
  <script>
  var pop = document.getElementById("pop");
  //点div,输出三组鼠标位置
  pop.onclick = function (e) {
    //鼠标相对于屏幕左侧、上方的距离
    console.log(e.screenX, e.screenY);
    //鼠标相对于浏览器内部文档显示区左侧、上方的距离
    console.log(e.clientX, e.clientY);
    //鼠标相对于当前点击的HTML元素左侧、上方的距离
    console.log(e.offsetX, e.offsetY);
  }
  </script>
</body>

JavaScript DOM BOM 终。



相关文章
|
存储 关系型数据库 MySQL
Nacos 2.0.3和Nacos 2.2.3版本
Nacos 2.0.3和Nacos 2.2.3版本
1197 1
|
人工智能 运维 安全
阿里云容器服务ACK:高效管理云上应用的容器化解决方案
阿里云容器服务ACK(Alibaba Cloud Container Service for Kubernetes)为开发者提供了一套全面的容器化管理解决方案,旨在简化云上应用的部署、运维和管理。本文将深入探讨ACK的功能、优势及应用场景,为开发者展现容器化技术在云环境下的强大能力。
1163 0
|
敏捷开发 持续交付 项目管理
敏捷开发下如何选择高效的协同工具?提升研发团队项目管理与沟通效率的建议
本文介绍了6款适用于软件研发团队的协同工具,包括板栗看板、Jira、Trello、Slack、GitLab和Asana,涵盖了任务管理、版本控制、文档协作等方面。每款工具都有其独特的优势和适用场景,如板栗看板适合敏捷开发的小型团队,Jira适用于大型项目的复杂管理,Trello以简洁易用著称,Slack强化团队沟通,GitLab支持CI/CD流程,Asana则擅长跨团队协作。选择合适的工具能有效提升团队效率和项目管理能力。
敏捷开发下如何选择高效的协同工具?提升研发团队项目管理与沟通效率的建议
|
传感器 存储 开发者
Arduino 中用于从传感器读取模拟和数字数据的函数
Arduino 提供了多种函数,用于从传感器读取模拟和数字数据。模拟数据通过 `analogRead()` 函数读取,数字数据则使用 `digitalRead()` 函数。这些函数简单易用,适用于各种传感器,帮助开发者轻松获取环境信息。
|
机器学习/深度学习 人工智能 算法
目标检测模型设计准则 | YOLOv7参考的ELAN模型解读,YOLO系列模型思想的设计源头
目标检测模型设计准则 | YOLOv7参考的ELAN模型解读,YOLO系列模型思想的设计源头
1505 0
目标检测模型设计准则 | YOLOv7参考的ELAN模型解读,YOLO系列模型思想的设计源头
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
602 0
|
Java 测试技术 API
性能工具之JMeter5.0核心类StandardJMeterEngine源码分析
【5月更文挑战第16天】性能工具之JMeter5.0核心类StandardJMeterEngine源码分析
397 4
性能工具之JMeter5.0核心类StandardJMeterEngine源码分析
|
搜索推荐 开发者
如何在 Elasticsearch 中选择精确 kNN 搜索和近似 kNN 搜索
【6月更文挑战第8天】Elasticsearch 是一款强大的搜索引擎,支持精确和近似 kNN 搜索。精确 kNN 搜索保证高准确性但计算成本高,适用于对精度要求极高的场景。近似 kNN 搜索则通过牺牲部分精度来提升搜索效率,适合大数据量和实时性要求高的情况。开发者应根据业务需求和数据特性权衡选择。随着技术发展,kNN 搜索将在更多领域发挥关键作用。
593 4
|
SQL 数据库
springCloud之seata
springCloud之seata
451 1