【前端】前端三要素之BOM

写在前面:本文仅包含BOM内容,JavaScript传送门在这里,DOM传送门在这里。

本文内容是假期中刷的黑马Pink老师视频(十分感谢Pink老师),原文保存在个人的GitLab中,如果需要写的网页内容信息等可以评论联系我,若是编辑博文中出现了忘记上传的图片或者错位的图片欢迎评论区指正。写作不易,欢迎点赞、收藏+关注。

文章目录

  • BOM 导论
    • 什么是BOM
    • DOM 与 BOM 对比
    • 一些描述
  • 窗口加载事件
    • 使用`window.onload`来改变`script`标签的位置
    • 通过监听事件的方式写多个`load`
    • 通过`DOMContentLoaded`事件来获取窗口加载事件
  • 窗口大小变化事件
  • 回调函数
  • `setTimeout` 定时器
    • 定时器函数的使用
        • 通过匿名函数调用
        • 通过函数名调用
        • 通过函数名字符串调用 | 不推荐
        • 区分不同的定时器
    • 清除定时器
  • `setInterval()` 定时器
    • `setInterval()` 的使用
    • 清除定时器 `setInterval()`
  • this指向问题
  • `location`对象
    • `location`相关属性与方法
    • `navigator`对象获取浏览器信息
  • 历史记录
    • `forward()` 前进 与 `back()` 后退
  • 页面偏移量 offsetLeft 与 offsetTop
    • `offsetLeft` 与 `offsetTop`
    • `offsetWidth`与`offsetHeight`
    • `offsetParent`
  • `client` 系列
  • `scroll`系列
    • `scroll` 属性
    • `scroll` 方法
  • 移动端事件
  • 触摸时间对象
  • 本地存储
    • sessionStorage
    • localStorage

BOM 导论

什么是BOM

BOM(Browser Object Model)浏览器对象模型,他提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window

BOM 是由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。

BOM缺乏标准,JavaScript语法的标准化组织室ECMA,DOM的标准化组织是W3C,BOM最初是Netscape(网景公司)浏览器标准的一部分。

DOM 与 BOM 对比

DOMBOM
文档对象模型浏览器对象模型
DOM就是把「文档」当做一个「对象」来看待把「浏览器」当做是一个「对象」来看待
DOM的顶级对象是documentBOM的顶级对象是window
DOM的主要学习是操作页面元素BOM学习的事浏览器窗口交互的一些对象
DOM是W3C标准BOM是浏览器厂商在各自浏览器上定义的,兼容性较差

BOM 与 DOM 的关系

在这里插入图片描述

一些描述

  1. 我们常用的document.xxx(如document.quertSelector(),举例在下面的代码段) ,完整的写法是 window.documnt.xxx
  2. 如果我们在script中定义了一个全局变量(以num举例,如下代码),那么我们真正的调用方式其实是window.num
  3. window包含一些方法,如我们常用的alert,我们也可以在前面加上window.使用,示例如下
<body>
    <div>我是Jim.kk</div>
    <script>
        // 1. 方法调用的省略写法
        document.querySelector('div');
        // 2. 方法调用的完整写法
        window.document.querySelector('div');
        
        var num = 10;
        // 3. 全局变量的省略写法
        console.log(num);
        // 4. 全局变量的完整写法
        console.log(window.num);
        
        // BOM的alert方法
        window.alert('我是Jim.kk');
    </script>
</body>

窗口加载事件

使用window.onload来改变script标签的位置

window.onload,是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、css文件等),就调用处理函数。

一般来说,我们需要按照先写标签,然后将script标签写在标签的下面的方式,但是我们可以通过window.onload来改变script标签的位置,因为这个方法会在页面加载完毕之后才执行,所以执行这个方法的时候,页面中的DOM元素已经全部被渲染了,请看下面示例。

<body>
    <script>
        window.onload = function () {
            var btn = document.querySelector('button');
            btn.addEventListener('click',function () {
                alert('你点我?');
            })
        }
    </script>
    <button>点击</button>
</body>

在以上代码中,我们没有按照之前的标准,将script标签写在button标签下面,但是依旧是可用的。

通过监听事件的方式写多个load

如果页面中存在多个window.onload,会以最后一个为准(最后一个会覆盖前面的事件)

这是传统事件存在的弊端,为了解决这一问题,我们可以使用监听事件替换window.onload,请看下面示例。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面加载事件|侦听</title>
    <script>
        window.addEventListener('load',function () {
            var btn2 = document.querySelector('#btn2');
            btn2.onclick = function () {
                alert('点击了按钮2');
            }
        })
    </script>
</head>
<body>
    <script>
        window.addEventListener('load',function () {
            var btn1 = document.querySelector('#btn1');
            btn1.onclick = function () {
                alert('点击了按钮1');
            }
        })
    </script>
    <button id="btn1">btn1</button>
    <button id="btn2">btn2</button>
</body>
</html>

上面代码中,我们添加了两个window的侦听事件,验证得知两个侦听事件都生效了。

通过DOMContentLoaded事件来获取窗口加载事件

document.addEventListener('DOMContentLoaded',function () {})

DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表、图片、flash等。IE9以上才支持。

若果页面的图片非常多,那么推荐使用这种方式。

<body>
    <script>
        window.addEventListener('load',function () {
            alert(22);
        })
        document.addEventListener('DOMContentLoaded',function () {
            alert(33);
        })
    </script>
</body>

以上代码一定是先弹出33再弹出22的,因为DOMContentLoaded事件只需要DOM元素加载完毕就可以执行,但是load需要加载完成图片等各种信息之后才执行。

窗口大小变化事件

window.onresize = functoin(){}
window.addEventListener('resize',function () {} )

只要窗口大小发生变化,就会触发里面的处理函数。

<body>
    <button>当宽度小于900px的时候,我就消失啦</button>
    <script>
        window.addEventListener('resize',function () {
            // console.log('变化了');
            // console.log('内高:'+window.innerHeight+'\t内宽' + window.innerWidth);
            var btn = document.querySelector('button');
            if ( window.innerWidth < 900 ) {
                btn.style.display = 'none';
            } else {
                btn.style.display = 'block';
            }
        })
    </script>
</body>

以上代码的执行效果:当我们改变浏览器框的大小的时候,当宽度小于900px,这个button按钮就会消失。

这种效果常用在一些页面元素渲染上,比如原本有四个列的某种元素,但是当页面较窄的时候,我们会隐藏其中某个列,以保证页面的正常显示。

回调函数

setTimeout()这个函数我们称为回调函数 callback

普通函数是按照顺序直接调用的,但是回调函数不按顺序来,比如定时器函数需要等待时间,等其它事情干完或者到了调用条件才会调用这个函数。

之前学习的onclick函数或者element.addEventListener('xxx',fun)里面的函数也是回调函数。

setTimeout 定时器

setTimeout() 定时器

window.setTimeout(调用函数,[延迟的毫秒数]);

  1. window在调用的时候可以省略
  2. 单位是毫秒,省略是0秒,也就是立马执行
  3. 这个调用函数可以直接写函数,还可以写函数名(不需要带括号)

当延迟的毫秒数到了,就去执行函数。

定时器函数的使用

通过匿名函数调用
<body>
    <script>
        // 单位是毫秒,省略是0秒,也就是立马执行
        setTimeout(function () {
            alert('我是Jim.kk');
        },2000);
    </script>
</body>

以上代码在页面加载出来两秒后会跳出弹窗提示。

通过函数名调用
<body>
    <script>
        function fun() {
            alert('我是Jim.kk');
        }
        setTimeout(fun,2000);
    </script>
</body>
通过函数名字符串调用 | 不推荐

函数名字符串必须要加括号

以下代码与上面两个代码段执行无异,不多赘述

<body>
    <script>
        function fun2() {
            alert('我是Jim.kk');
        }
        setTimeout('fun2()',2000);
    </script>
</body>
区分不同的定时器

以下代码会在页面加载出来后的两秒在控制台输出一句话,页面加载好的5秒后又会输出一句话。

<body>
    <script>
        function fun3() {
            console.log('我是Jim.kk');
        }
        var timer1 = setTimeout(fun3,2000);
        var timer2 = setTimeout(fun3,5000);

    </script>
</body>

清除定时器

使用clearTimeout(定时器名称)函数可以清除定时器,请看如下代码

注意,括号内是定时器的名称,不是字符串

<body>
    <button>点我清除定时器</button>
    <script>
        var btn = document.querySelector('button');
        var timer1 = setTimeout(function () {
            alert('我是Jim.kk');
        },5000);
        btn.onclick = function () {
            clearTimeout(timer1);
        }
    </script>
</body>

以上代码在弹窗出现之前若是点击了按钮,弹窗则永远也不会跳出来。

setInterval() 定时器

  1. window.setInterval(回调函数,[间隔毫秒数])
  2. setTimeout()不同的是,setTimeout只会执行一次,但是setInterval会循环执行

setInterval() 的使用

<body>
    <script>
        setInterval(function () {
            console.log('我是Jim.kk');
        },1000)
    </script>
</body>

以上代码每过一秒就会输出一次我是Jim.kk;

清除定时器 setInterval()

以下代码点击开始后开始循环(1秒1次)输出当前时间戳,点击停止后停止输出。

<body>
  <button id="begin">开始</button>
  <button id="stop">停止</button>
  <script>
    var begin = document.querySelector('#begin');
    var stop = document.querySelector('#stop');
    var timer = null;
    begin.addEventListener('click',function () {
      setInterval(function () {
        console.log(+new Date());
      },1000);
    })
    stop.addEventListener('click',function () {
      clearInterval(timer);
    })
  </script>
</body>

this指向问题

总结起来一句话,谁调用,就指向谁。

  1. 全局作用下指向window
  2. 全局作用域的方法中指向window(因为是window调用的方法)
  3. 在定时器中指向window(因为定时器也是window调用的)
  4. 在对象中指向这个对象
  5. 在事件中指向被触发事件(如被点击)的元素(如按钮)
  6. 如果在按钮点击事件中调用计时器,计时器中指向的还是window
  7. 构造函数,指向的是实例对象
  1. 全局作用域下指向window
<body>
    <script>
        console.log(this); // window
    </script>
</body>
  1. 全局作用域的方法中指向window
<body>
    <script>
        function fun(){
            console.log(this);
        }
        fun(); // window
        window.fun(); // 这行代码与上一行等效
    </script>
</body>
  1. 在定时器中指向window
<body>
    <script>
        setTimeout(function () {
            console.log(this); // window
        },1000);
    </script>
</body>
  1. 在对象中指向这个对象
<body>
    <script>
        var o = {
            sayHi: function () {
                console.log(this); // o对象
            }
        }
        o.sayHi(); // o 对象
    </script>
</body>
  1. 在事件中指向被触发事件(如被点击)的元素(如按钮)
<body>
    <button>点我</button>
    <script>
        var btn = document.querySelector('button');
        btn.onclick = function () {
            console.log(this); // <button>点我</button>
        }
    </script>
</body>
  1. 如果在按钮点击事件中调用计时器,计时器中指向的还是window
<body>
    <button>点我</button>
    <script>
        var btn = document.querySelector('button');
        btn.onclick = function () {
            setTimeout(function () {
                console.log(this); // 指向 window
            },1000)
        }
    </script>
</body>
  1. 构造函数,指向的是实例对象
<body>
    <script>
        function Fun() {
            console.log(this); // 指向的是fun实例对象
        }
        
        var fun = new Fun();
    </script>
</body>

location对象

location相关属性与方法

window对象给我们提供了一个location属性用于获取或设置窗体的URL,并且可以用于解析URL。因为这个属性返回的是一个对象,所以我们将这个属性称为location对象

location对象属性返回值
location.href获取或者设置整个URL
location.host返回主机(域名)
location.port返回端口号,如果未写返回空字符串
location.pathname返回路径
location.search返回参数
location.hash返回片段#后面内容,常见于链接、锚点
location方法行为描述
location.assign()记录历史并跳转
location.replace()不记录历史并跳转
location.reload()重载页面,如果页面里参数是true,则强制刷新,强制刷新不会保留缓存(Ctrl+F5

可以直接在控制台输入location点回车,查看当前的location。

下面实现一个点击按钮后五秒钟倒计时跳转百度的示例

<body>
    <button>点我跳转</button>
    <div></div>
    <script>
        var btn = document.querySelector('button');
        var div = document.querySelector('div');
        btn.onclick = function () {
            var timer = 5;
            div.innerText = '将在' + timer +'秒后跳转至百度';
            setInterval(function (){
                timer -- ;
                if(timer === 0){
                    location.href = 'https://baidu.com';
                } else {
                    div.innerText = '将在' + timer +'秒后跳转至百度';
                }
            },1000);
        }
    </script>
</body>

以上代码在点击按钮后,会开始执行计时器,然后div中每次显示倒计时的时间,等时间到了,就会跳转到百度。

navigator对象获取浏览器信息

navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值。

输出用户当前使用的客户端

alert(navigator.userAgent);

历史记录

forward() 前进 与 back() 后退

可以在括号中写上数字,控制前进后退的步数

要有历史记录(或者前进记录)的情况下才可以调用

以下写两个页面演示一下,命名如下:

  1. index页:``
  2. home页:_BOM_06.6-home.html
<body>
    <a href="_BOM_07.2-home.html">前往Home页</a>
    <button>点我下一步</button>
    <script>
        var btn = document.querySelector('button');
        btn.onclick = function (){
            history.forward();
        }
    </script>
</body>
<body>
    <a href="_BOM_07.1-index.html">前往首页</a>
    <button>点我返回</button>
    <script>
        var btn = document.querySelector('button');
        btn.onclick = function (){
            history.back();
        }
    </script>
</body>

这样的话两个页面分别就有两个标签,在首页点击a标签之后进入到home页面,这时候就产生了历史记录,可以点击返回按钮返回,返回之后又可以点击下一步再次进入到首页。

可以在括号中写上数字,控制前进后退的步数

页面偏移量 offsetLeft 与 offsetTop

style的区别

  1. offset系列的返回值都是没有单位的,是一个纯数字,style可以
  2. offset不可以被赋值,style可以
  3. offset返回的宽度等信息包含paddingborderwidth的宽度和高度,style不包含

offsetLeftoffsetTop

  1. 返回的都是距离可视窗口(页面部分)左上角的定位
  2. 返回值是一个数字
  3. 不可以进行赋值

offsetWidthoffsetHeight

  1. 返回的是宽度和高度
  2. 包含paddingborderwidth的宽度和高度
  3. 如果元素的宽度是xx%,那么当浏览器大小发生变化时,该值也会动态发生变化
  4. 返回值是一个数字

offsetParent

  1. 返回的是父元素
  2. 如果父亲不带有定位,那么则会逐级向上找,直到找到带定位的元素(这是与fatherNode的区别)

以下代码的页面显示效果与控制台输出效果如下图所示:

在这里插入图片描述

<head>
    <meta charset="UTF-8">
    <title>页面偏移量</title>
    <style>
        body {
            width: 100%;
            height: 100%;
            margin: 0;
        }
        #father {
            position: relative;
            margin-top: 400px;
            margin-left: 800px;
            background: antiquewhite;
            width: 200px;
            height: 200px;
            border: .1px solid red;
        }
        #son {
            background: aqua;
            width: 100px;
            height: 100px;
            margin: 50px;
        }
    </style>
</head>
<body>
    <div id="father">
        <div id="son"></div>
    </div>
    <script>
        var father = document.querySelector('#father');
        var son = document.querySelector('#son');
        console.log(father.offsetLeft); // 800
        console.log(father.offsetTop);  // 400

        // 页面的宽度包含padding、border、width
        // 如果高度或者宽度是100%,那么当浏览器窗口大小变化的时候,这个值也会动态变化
        console.log(father.offsetWidth); // 200
        console.log(father.offsetHeight);  // 200

        // 如果father带有定位(position: relative;),那么将会显示father,如果直接的father不带有定位,则逐级向上寻找,直到找到带定位的
        console.log(son.offsetParent);
    </script>
</body>

client 系列

与offset最大的区别就是不包含边框

client系列属性说明
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框大小
element.clientWidth返回自身包含padding、内容区的宽度,不包含边框,返回一个数值
element.clientHeight返回自身包含padding、内容区的高度,不包含边框,返回一个数值
<head>
    <meta charset="UTF-8">
    <title>client | 系列页面偏移量</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background: pink;
            border: 3px solid red;
            margin: 200px auto;
        }
    </style>

</head>
<body>
    <div></div>
    <script>
        var div = document.querySelector('div');
        console.log(div.clientHeight);  // 200
        console.log(div.clientWidth);   // 200
        console.log(div.clientTop);     // 3
        console.log(div.clientLeft);    // 3
    </script>
</body>

注意:无法获取下边框与右边框大小

scroll系列

scroll 属性

scroll 系列与offset系列和client系列最大的区别在于,如果元素内部的内容溢出了(如文字长度溢出或者内部div高度比当前元素高),那么scroll显示的实际的高度和宽度。

scorll系列属性说明备注
element.scrollTop返回被卷去的上侧距离返回值不带参数
element.scrollLeft返回被卷去的左侧距离返回值不带参数
element.scrollWidth返回自身实际的宽度,不含边框返回值不带参数
element.scrollHeight返回自身实际的高度,不含边框返回值不带参数

在这里插入图片描述

横向超出一样的道理

scroll 方法

div.addEventListener('scroll',function (){
    console.log(div.scrollTop)
})

当滚动条发生变化时触发

注意:当调用对象是document的时候,要使用window.pageYOffset,如果要计算左侧则是window.pageXOffset

简单解释一下:我们上面说的scroll系列应对的是页面内的元素,比如页面内有一个小div内部又套了一个div,这时候要使用scroll系列,但是操作document的时候,操作的是整个页面,我们要使用windows.pageX/YOffset

移动端事件

触屏touch事件说明
touchstart手指触摸到一个DOM元素时触发
touchmove手指在一个DOM元素上滑动时触发
touchend手指离开一个DOM元素时触发

示例:写一个DIV,在移动端分别进行手指触摸、手指移动和手指离开操作

<head>
    <meta charset="UTF-8">
    <title>移动端touchstart事件</title>
    <style>
        div {
            width: 300px;
            height: 300px;
            background: pink;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        var div = document.querySelector('div');
        div.addEventListener('touchstart',function (e) {
            console.log('手指摸上去了');
        })

        div.addEventListener('touchmove',function (e) {
            console.log('手指正在移动');
        })

        div.addEventListener('touchend',function (e) {
            console.log('手指离开了');
        })
    </script>
</body>

以上代码的测试结果如下图所示:

在这里插入图片描述

如果要自己测试,记得F12并按照红色箭头方向打开移动端模式。

触摸时间对象

  1. touchs:正在触摸屏幕的所有手机的列表(是一个列表,由于可以多指触摸,所以是一个列表)
  2. targetTouches:正在触摸当前DOM元素伤的手指列表
  3. changedTouches:手指状态发生了改变的列表,从无到有,从有到无的变化

本地存储

  1. sessionStorage:生命周期为关闭浏览器窗口,同页面下数据可以共享(关闭页面或新建页面后失效),以键值对存储,存储空间约5M
  2. sessionStorage:多页面(同一浏览器内)共享(重启浏览器依旧生效),不同页面的数据可以共享,以键值对存储,存储空间约20M

sessionStorage

sessionStorage方法说明备注
setItem(‘key’,value)存储一个数据存储空间约5M
getItem(‘key’)使用key获取一个数据
removeItem(‘key’)删除一个数据
clear()清空所有数据

localStorage

localStorage方法说明备注
setItem(‘key’,value)存储一个数据存储空间约20M
getItem(‘key’)使用key获取一个数据
removeItem(‘key’)删除一个数据
clear()清空所有数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399001.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PostgreSQL实现psql连接时候提示用户的密码有效时间】

如下内容使用session_exec插件结合自定函数实现。类似于触发器的原理。 功能需要严格在测试环境测试后&#xff0c;才可在正式环境使用。没有相关要求&#xff0c;还是建议直接查询pg_roles/pg_authid/pg_user&#xff1b; 一、判断是否需要修改用户密码和有效期的检查SQL 首…

解锁服务器外联:TinyProxy一键搭建指南

引言 在服务器需要访问外网的情况下&#xff0c;由于网络安全等原因&#xff0c;许多生产服务器限制了对外网的访问。本文介绍如何通过在一台能够访问外网的服务器上部署TinyProxy来实现代理&#xff0c;使得其他服务器可以通过该代理访问外网。 安装 TinyProxy是一个轻量级…

CTFHub技能树web之文件上传(一)

一.前置知识 文件上传漏洞&#xff1a;文件上传功能是许多Web应用程序的常见功能之一&#xff0c;但在实施不当的情况下&#xff0c;可能会导致安全漏洞。文件上传漏洞的出现可能会使攻击者能够上传恶意文件&#xff0c;执行远程代码&#xff0c;绕过访问控制等。 文件类型验证…

代码随想录第二十一天 701.二叉搜索树中的插入操作 108.将有序数组转换为二叉搜索树

701.二叉搜索树中的插入操作 题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&a…

Tulsimer MB-1518——超纯水抛光树脂的技术应用

超纯水的制备和稳定性一直是相关领域极为重视的&#xff0c;那么超纯水中常会用到的抛光树脂技术&#xff0c;进口和国产对比起来究竟谁更甚一筹呢&#xff1f;接下来为大家分享的技术就是超纯水制备中常会用到的进口品牌&#xff1a;美国Tulsimer杜笙树脂中抛光树脂MB-106UP的…

设计师简历写作指南:教你如何获得高薪offer!

在找工作时&#xff0c;我们如何努力争取更多的主动权&#xff1f;在询问了许多大工厂的人力资源部后&#xff0c;即时设计帮助你总结了答案&#xff1a;请仔细设计你的简历&#xff01;一个好的设计师的简历应该怎么做&#xff1f;虽然简历只有几张纸&#xff0c;但它是你个人…

MyBatis Plus:自定义typeHandler类型处理器

目录 引言&#xff1a;关于TypeHandler PostGreSQL&#xff1a;JSON数据类型 PostGreSQL数据库驱动&#xff1a;PGobject类 TypeHandler类型处理器 自定义类型处理器 类型处理器实现&#xff1a;PGJsonTypeHandler 注册类型处理器 引言&#xff1a;关于TypeHandler MyBa…

【快速搞定Webpack5】基本配置及开发模式介绍(二)

在开始使用webpack之前么&#xff0c;我们需要对Webpack的配置有一定的认识。 一、5大核心概念 1. enty&#xff08;入口&#xff09; 指示webpack从哪个文件开始打包 2. output&#xff08;输出&#xff09; 指示webpack打包完的文件输出到哪里去&#xff0c;如何命名等 …

Java 面向对象进阶 07 继承中成员变量,成员方法的访问特点(黑马)

一、继承中成员变量的访问特点&#xff1a; 打印结果为&#xff1a;zishow 这种情况打印出来的结果是Zi 这种情况打印的是Fu 这种情况就会报错 对于重名的情况&#xff0c;没有关键字&#xff0c;那么就是就近原则&#xff0c;打印出的是ziShow&#xff1b; this.name 指的是Zi…

java导出动态下拉框excel模板

1.原始模板 2.导出模板,下拉框为数据库中得到动态数据 public void downloadTemplate(HttpServletResponse response) throws IOException {// 所有部门List<String, String> departments expertManageMapper.selectAllDepartment();//所有职位List<String, String&g…

js设计模式:访问者模式

作用: 将操作方法封装在一个访问者对象中,而不是封装在每个被访问对象当中。 访问者对象可以通过调用被访问者的接口,用来操作被访问者。 示例: class App{accept(user){console.log(user,使用者)console.log(this,工具)user.use(this)}}class User{use(app){}}class Weixin…

Spring相关注解

文章目录 Spring注解Bean1、Bean 概述2、Bean 的声明1&#xff09;搭配 Configuration2&#xff09;搭配 Component3&#xff09;搭配 ApplicationContext 3、Bean 的注入1&#xff09;NO&#xff08;主要关注这个&#xff09;【1】同一配置类【2】不同配置类 2&#xff09;BY_…

使用 Docker 安装 Elasticsearch 8.4.3

使用 Docker 安装 Elasticsearch 8.4.3 一. 拉取 Elasticsearch Docker 镜像二. 使用Docker启动单节点集群三. 修改密码 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 从 Elastic…

友点CMS image_upload.php 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

类之间的关系详解

在面向对象编程中&#xff0c;类之间的关系是构建和理解软件设计的基础。这些关系主要包括关联、聚合、合成、依赖、继承和实现。下面通过具体的例子和Java代码示例来说明这些关系。 1. 关联&#xff08;Association&#xff09; 关联关系表示两个类之间的结构化关系&#xff…

MySQL篇—事务和隔离级别介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

Android 7.0以上charles无法抓取部分https包问题

首先保证配置一切正确 手机通过访问chls.pro/ssl下载.pem证书&#xff0c;如无法安装&#xff0c;在文件管理器中将后缀名改为.crt 在设置中安装该证书 Charles-Proxy - SSL Proxying Setting - Include 添加需要抓包的URL:443即可 以上基本配置结束后&#xff0c;看下代码 代…

彻底解决关于路由的问题,前端路由和服务端路由,history api 和 hash路由

首先路由分成两大块&#xff0c;分别是前端路由和服务端路由&#xff0c;而前端路由又分为两种模式&#xff0c;分别是 histroy api 模式和 hash 模式。 路由 前端路由&#xff1a;指在浏览器中进行路由控制的一种方式&#xff0c;通过监听 url 变化决定加载哪个页面组件或视图…

为什么运维要转行

为什么运维要转行 粉丝提问&#xff1a; 在各种APP里经常看到&#xff0c;趁年轻赶紧远离运维&#xff0c;为什么&#xff1f; 互联网老兵是这样回答的&#xff1a; 运维有很多分类&#xff0c;有干实施运维的&#xff0c;有干交付运维的&#xff0c;也有自动化运维&#xf…

命令行窗口文本复制到 Word 格式保持不变

命令行窗口文本复制到 Word 格式保持不变 References 标题栏右键 -> 编辑 -> 标记 / 全选 标题栏右键 -> 编辑 -> 复制 粘贴到 Notepad 中&#xff0c;语言栏设置对应语言&#xff0c;格式可以保持不变 复制文本粘贴到 Excel 中 选中 Excel 中文本复制&#xf…