DOM事件机制(事件流、事件委托、事件类型)以及BOM

news2024/11/13 16:02:17

HTML DOM 允许 JavaScript 对 HTML 事件作出反应。JavaScript 能够在事件发生时执行,比如当用户点击某个 HTML 元素时。 JavaScript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。

虽然 ECMAScript 把浏览器对象模型(BOM,Browser Object Model)描述为JavaScript 的核心,但实际上 BOM 是使用 JavaScript 开发 Web 应用程序的核心。BOM 提供了与网页无关的浏览器功能对象。多年来,BOM 是在缺乏规范的背景下发展起来的,因此既充满乐趣又问题多多。毕竟,浏览器开发商都按照自己的意愿来为它添砖加瓦。最终,浏览器实现之间共通的部分成为了事实标准,为 Web 开发提供了浏览器间互操作的基础。HTML5 规范中有一部分涵盖了 BOM 的主要内容,因为 W3C 希望将JavaScript 在浏览器中最基础的部分标准化。

目录

事件是由三部分组成

执行事件的步骤

常用事件:

事件流

事件冒泡(IE事件流)

阻止事件冒泡        event.stopPropagation()

事件捕获(Netscape事件流)

DOM事件流

Dom0级事件和2级事件

阻止事件默认行为        preventDefault()

事件委托

事件类型

用户界面事件--UIEvent

焦点事件--FocusEvent

鼠标事件--MouseEvent

键盘事件--KeyboardEvent

BOM

页面跳转        Window.open()

参数

URL

name

系统对话框

alert()

confirm()

prompt()

location

属性

方法

assign()

replace()

reload()

history

length

back()

forward()

go()

间歇调用和超时调用

setTimeout()

参数:

setInterval()

参数:


事件是由三部分组成

事件源、事件类型、事件处理程序,我们也称为事件三要素。

1.事件源:事件被触发的对象 -->按钮对象

2.事件类型:如何触发?触发什么事件?例如鼠标点击,键盘按下等…

3.事件处理程序:通过一个函数赋值的方式

执行事件的步骤

1.获取事件源

2.注册事件(绑定事件)

3.采用函数赋值形式添加事件处理程序

常用事件:

  • 当用户点击鼠标时

  • 当网页加载后

  • 当图像加载后

  • 当鼠标移至元素上时

  • 当输入字段被改变时

  • 当 HTML 表单被提交时

  • 当用户敲击按键时

  • ....................

事件流

事件冒泡(IE事件流)

IE 事件流被称为事件冒泡,这是因为事件被定义为从最具体的元素(文档树中最深的节点)开始触发,然后向上传播至没有那么具体的元素(文档)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width: 300px;
            height: 300px;
            background-color: red;
            margin: 0 auto;
            padding: 50px;
            box-sizing: border-box;
        }
        .center{
            width: 200px;
            height: 200px;
            background-color: pink;
            padding: 50px;
            box-sizing: border-box;
        }
        .inner{
            width: 100px;
            height: 100px;
            background-image: linear-gradient(to right,red,pink,blue);
        }
    </style>
    <script>
        window.onload = function(){
            var outer = document.querySelector('.outer');
            var center = document.querySelector('.center');
            var inner = document.querySelector('.inner');
            outer.onclick = function(){
                console.log('我是outer');
                // alert('我是outer');
                console.log(event.target,'触发事件的目标源');
                console.log(event.currentTarget,'当前正在执行事件的dom元素');
            }
            center.onclick = function(){
                console.log('我是center');
                // alert('我是center');
                // event.stopPropagation();
                console.log(event.target,'触发事件的目标源');
                console.log(event.currentTarget,'当前正在执行事件的dom元素');
            }
            inner.onclick = function(){
                console.log('我是inner');
                // alert('我是inner');
                // 阻止事件冒泡 event表示当前的事件对象
                // console.log(event,'事件对象');
                // event.stopPropagation()
                console.log(event.target,'触发事件的目标源');
                console.log(event.currentTarget,'当前正在执行事件的dom元素');
            }
        }
    </script>
</head>
<body>
    <!-- 事件三要素   1.事件源   2.事件类型  3.事件处理程序 -->
    <!-- 事件流 描述的是页面接受事件的顺序 事件冒泡:事件由内向外触发 事件捕获:事件由外向内触发 事件流机制:事件捕获 --到达目标 --事件冒泡 -->
    <div class="outer">
        <div class="center">
            <div class="inner"></div>
        </div>
    </div>
</body>
</html>

 在点击页面中的id为inner的div元素,click事件会以如下顺序发生

div#inner-----div#center-----div#outer-----body-----html-----document

也就是说,div#inner元素,即被点击的元素,最先触发 click 事件。然后,click 事件沿DOM 树一路向上,在经过的每个节点上依次触发,直至到达 document 对象。

阻止事件冒泡        event.stopPropagation()

事件捕获(Netscape事件流)

Netscape Communicator 团队提出了另一种名为事件捕获的事件流。事件捕获的意思是最不具体的节点应该最先收到事件,而最具体的节点应该最后收到事件。事件捕获实际上是为了在事件到达最终目标前拦截事件。如果前面的例子使用事件捕获,则点击div元素会以下列顺序触发 click 事件:document-----html ----- body ----- div

在事件捕获中,click 事件首先由 document 元素捕获,然后沿 DOM 树依次向下传播,直至到达实际的目标元素div。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width: 300px;
            height: 300px;
            background-image: radial-gradient(red,pink,blue);
            margin: 0 auto;
            padding: 50px;
            box-sizing: border-box;
        }
        .center{
            width: 200px;
            height: 200px;
            background-color: red;
            padding: 50px;
            box-sizing: border-box;
        }
        .inner{
            width: 100px;
            height: 100px;
            background-color: blue;
        }
    </style>
    <script>
        window.onload = function(){
            var outer = document.querySelector('.outer');
            var center = document.querySelector('.center');
            var inner = document.querySelector('.inner');
            function hander1(){
                console.log('outer');
            }
            function hander2(){
                console.log('center');
            }
            function hander3(){
                console.log('inner');
            }
            /**
             * false表示事件在冒泡阶段执行
             * true 表示事件在捕获阶段执行
            */
            outer.addEventListener('click',hander1,true);
            center.addEventListener('click',hander2,true);
            inner.addEventListener('click',hander3,true);

        }
    </script>
</head>
<body>
    <div class="outer">
        <div class="center">
            <div class="inner"></div>
        </div>
    </div>
</body>
</html>

 

DOM事件流

DOM2 Events 规范规定事件流分为 3 个阶段:事件捕获、到达目标和事件冒泡。事件捕获最先发生,为提前拦截事件提供了可能。然后,实际的目标元素接收到事件。最后一个阶段是冒泡,最迟要在这个阶段响应事件。点击div元素会以如图所示的顺序触发事件。

在 DOM 事件流中,实际的目标(div元素)在捕获阶段不会接收到事件。这是因为捕获阶段从document 到html再到body就结束了。下一阶段,即会在div元素上触发事件的“到达目标”阶段,通常在事件处理时被认为是冒泡阶段的一部分。然后,冒泡阶段开始,事件反向传播至文档。大多数支持 DOM 事件流的浏览器实现了一个小小的拓展。虽然 DOM2 Events 规范明确捕获阶段不命中事件目标,但现代浏览器都会在捕获阶段在事件目标上触发事件。最终结果是在事件目标上有两个机会来处理事件。

Dom0级事件和2级事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            var btn = document.querySelector('button');
            // dom 0级事件绑定 on事件类型
            btn.onclick = function(){
                console.log(this);
            }
            // 追加事件
            btn.onclick = function(){
                console.log('第二次事件触发');
            }
            // 结果看出不可追加同一类型的事件
            // dom 0级事件解绑
            btn.onclick = null;
            
            // dom 2级事件绑定 addEventListener() 参数: 事件类型 事件处理程序 true捕获/false默认冒泡
            // btn.addEventListener('click',function(){
            //     console.log(this);
            // })
            // // 追加事件
            // btn.addEventListener('click',function(){
            //     console.log('第二次事件触发');
            // })
            var handler1 = function(){
                console.log(this);
            }
            var handler2 = function(){
                console.log('第二次事件触发');
            }
            btn.addEventListener('click',handler1);
            btn.addEventListener('click',handler2);
            // 结果看出可以追加同一类型的事件
            // dom 2级事件解绑 removeEventListener() 参数: 事件类型 事件处理程序
            // btn.removeEventListener('click',handler1);
        }   
    </script>
    
</head>
<body>
    <button>点击这里</button>
</body>
</html>

dom0级事件

dom2级事件

dom0级和dom2级事件的区别

            1.dom0级使用on关键字绑定和解绑事件,解绑将事件类型设置为null;

            2.dom2级使用addEventListener()绑定事件,解绑使用removeEventListener();

            3.dom0级事件不可追加同一类型事件    追加就是覆盖

            4.dom2级事件可以追加同一类型事件    追加后依次执行

阻止事件默认行为        preventDefault()

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function () {
            var input = document.querySelector('input');
            var a = document.querySelector('a');
            // 阻止默认行为 preventDefault()
            input.onclick = function () {
                event.preventDefault();
            }
            a.onclick = function () {
                event.preventDefault();
            }
        }
    </script>
</head>

<body>
    <form action="text.php">
        <input type="submit" value="提交">
    </form>
    <a href="https://www.baidu.com">百度</a>
</body>

</html>

事件委托

在 JavaScript 中,页面中事件处理程序的数量与页面整体性能直接相关。原因有很多。首先,每个函数都是对象,都占用内存空间,对象越多,性能越差。其次,为指定事件处理程序所需访问 DOM 的次数会先期造成整个页面交互的延迟。只要在使用事件处理程序时多注意一些方法,就可以改善页面性能。

事件委托就是当事件触发时,把要做的事委托给父元素(或父元素的父元素)来处理。也就是:利用冒泡的原理,把事件加到父级上,通过判断事件来源的子集,执行相应的操作。使用事件委托技术能让你避免对特定的每个节点添加事件监听器。

事件委托利用事件冒泡,可以只使用一个事件处理程序来管理一种类型的事件。例如,click 事件冒泡到 document。这意味着可以为整个页面指定一个 onclick 事件处理程序,而不用为每个可点击元素分别指定事件处理程序。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            var ul = document.querySelector('ul');
            // 在这里加的li可以变色
            // var newLi = document.createElement('li');
            // newLi.innerText = '第11个li';
            // ul.appendChild(newLi);
            // var lis = document.querySelectorAll('li');
            // for(var i=0;i<lis.length;i++){
            //     lis[i].onclick = function(){
            //         this.style.backgroundColor = 'red';
            //     }
            // }
            // 在这里加的li不可变色
            var newLi = document.createElement('li');
            newLi.innerText = '第11个li';
            ul.appendChild(newLi);

            // 事件委托,将子元素事件代理给父元素 绑定依次事件 管理一类事件
            ul.onclick = function(){
                // event 事件对象 event.target
                event.target.style.backgroundColor = 'red';
            }
        }
    </script>
</head>
<body>
    <ul>
        <li>第1个li</li>
        <li>第2个li</li>
        <li>第3个li</li>
        <li>第4个li</li>
        <li>第5个li</li>
        <li>第6个li</li>
        <li>第7个li</li>
        <li>第8个li</li>
        <li>第9个li</li>
        <li>第10个li</li>
    </ul>
</body>
</html>

 事件委托(事件代理)

            利用事件冒泡 只指定一个事件处理程序 就可以管理某一类事件

            将子元素的事件绑定给父元素

            目的:优化页面性能 减少事件的执行 减少浏览器的重排和回流 还可以给新增的元素绑定事件。

事件类型

用户界面事件--UIEvent

焦点事件--FocusEvent

鼠标事件--MouseEvent

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 200px;
            height: 200px;
            border: 1px solid blue;
            overflow: auto;
        }
    </style>
    <script>
        window.onload = function(){
            var input = document.querySelector('input');
            // select事件  在输入框中选择字符时触发
            input.onselect = function(){
                console.log('我被选择了');
                console.log(window.getSelection().toString());
            }

            // resize事件 窗口缩放时触发方法
            document.body.onresize = function(){
                console.log(window.outerHeight,window.outerWidth);
            }

            // scroll事件 绑定滚动事件
            var div = document.querySelector('div');
            div.onscroll = function(){
                console.log('正在滚动');
            }

            // 聚焦focus 失焦blur
            input.onfocus = function(){
                console.log('选中');
            }
            input.onblur = function(){
                console.log('取消选中');
            }

            // 双击 dblclick
            div.ondblclick = function(){
                console.log('被双击');
            }

            // 鼠标移入mouseenter 移除mouseleave 一直移动mousemove
            div.onmouseenter = function(){
                console.log('鼠标移入');
            }
            div.onmouseleave = function(){
                console.log('鼠标移出');
            }
            div.onmousemove = function(){
                console.log('鼠标一直在移动');
            }
        }
    </script>
</head>
<body>
    <div>我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div
        我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div
        我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div我是一个div
    </div>
    <input type="text">
</body>
</html>

键盘事件--KeyboardEvent

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            var input = document.querySelector('input');
            // 键盘按下事件 keydown 按键keyCode
            input.onkeydown = function(){
                console.log(event.keyCode);
            }
            // 键盘抬起事件 keyup
            input.onkeyup = function(){
                console.log('抬起');
            }
            // 键盘持续按下事件 keypress
            input.onkeypress = function(){
                console.log('持续按下');
            }
            // 输入框输入事件 获取文本输入值
            input.addEventListener('textInput',function(event){
                console.log(event.data);
            })

        }
    </script>
</head>
<body>
    <input type="text">
</body>
</html>

BOM

页面跳转        Window.open()

 open 打开页面 参数 url name 可配置对象 true自身打开 false 新窗口打开

window.open()方法可以用于导航到指定 URL,也可以用于打开新浏览器窗口。这个方法接收 4个参数:要加载的 URL、目标窗口、特性字符串和表示新窗口在浏览器历史记录中是否替代当前加载页面的布尔值。通常,调用这个方法时只传前 3 个参数,最后一个参数只有在不打开新窗口时才会使用。

参数
URL

可选。打开指定的页面的URL。如果没有指定URL,打开一个新的空白窗口。

name

可选。指定target属性或窗口的名称。支持以下值:

  • _blank - URL加载到一个新的窗口。这是默认

  • _parent - URL加载到父框架

  • _self - URL替换当前页面

  • _top - URL替换任何可加载的框架集

  • name - 窗口名称

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            var btn1 = document.querySelectorAll('button')[0];
            var btn2 = document.querySelectorAll('button')[1];
            btn1.onclick = function(){
                // open 打开页面 参数 url name 可配置对象 true自身打开 false 新窗口打开
                w = window.open('https://www.baidu.com','_blank','height = 600px,width = 600px');
                // 设置新窗口的宽高 resizeTo()
                w.resizeTo(400,400);
                // 设置新窗口的位置 moveTo()
                w.moveTo(100,100);
            }
            btn2.onclick = function(){
                // 关闭窗口
                w.close();
            }
        }
    </script>
</head>
<body>
    <button>百度页面</button>
    <button>关闭页面</button>
</body>
</html>

系统对话框

使用 alert()、confirm()和 prompt()方法,可以让浏览器调用系统对话框向用户显示消息。这些对话框与浏览器中显示的网页无关,而且也不包含 HTML。它们的外观由操作系统或者浏览器决定,无法使用 CSS 设置。此外,这些对话框都是同步的模态对话框,即在它们显示的时候,代码会停止执行,在它们消失以后,代码才会恢复执行。

alert()

alert()接收一个要显示给用户的字符串。与 console.log 可以接收任意数量的参数且能一次性打印这些参数不同,alert()只接收一个参数。调用 alert()时,传入的字符串会显示在一个系统对话框中。对话框只有一个“OK”(确定)按钮。如果传给 alert()的参数不是一个原始字符串,则会调用这个值的 toString()方法将其转换为字符串。

警告框(alert)通常用于向用户显示一些他们无法控制的消息,比如报错。用户唯一的选择就是在看到警告框之后把它关闭。

confirm()

确认框通过调用 confirm()来显示。确认框跟警告框类似,都会向用户显示消息。但不同之处在于,确认框有两个按钮:“Cancel”(取消)和“OK”(确定)。用户通过单击不同的按钮表明希望接下来执行什么操作。比如,confirm("你确定吗?");

要知道用户单击了 OK 按钮还是 Cancel 按钮,可以判断 confirm()方法的返回值:true 表示单击了 OK 按钮,false 表示单击了 Cancel 按钮或者通过单击某一角上的 X 图标关闭了确认框。

prompt()

提示框,通过调用 prompt()方法来显示。提示框的用途是提示用户输入消息。除了 OK 和 Cancel 按钮,提示框还会显示一个文本框,让用户输入内容。prompt()方法接收两个参数:要显示给用户的文本,以及文本框的默认值(可以是空字符串)。调用 prompt("你叫什么名字?"),如果用户单击了 OK 按钮,则 prompt()会返回文本框中的值。如果用户单击了 Cancel 按钮,或者对话框被关闭,则 prompt()会返回 null。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            // 弹框 alert()
            alert('弹框');
            // 确认框 confirm()
            var res = confirm('你确定么?')
            if(res){
                console.log('确定');
            }else{
                console.log('取消');
            }
            // 输入框 prompt()
            var res = prompt('请输入你的姓名');
            console.log(res);
        }
    </script>
</head>
<body>
    
</body>
</html>

location

location对象是最有用的BOM对象之一,提供了与当前窗口中加载的文档有关的信息,还提供一些导航功能。

location是个神奇的对象,既是window的对象也是document的对象。经过我们的对比发现,直接使用location对象也可以。

属性

host 返回服务器名称和端口号

hostname 返回不带端口号的服务器名称

href 返回当前加载页面的完整URL

pathname 返回URL的目录和文件名

port 返回URL中指定的端口号

protocol 返回页面使用的协议

search 返回URL的查询字符串。这个字符串以问号开头

方法
assign()

传递一个url参数,打开新url,并在浏览记录中生成一条记录。

replace()

参数为一个url,结果会导致浏览器位置改变,但不会在历史记录中生成新记录。

reload()

重新加载当前显示的页面,参数可以为boolean类型,默认为false,表示以最有效方式重新加载,可能从缓存中直接加载。如果参数为true,强制从服务器中重新加载。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            console.log(location.href);
            console.log(location.host);
            console.log(location.hostname);
            console.log(location.protocol);
            console.log(location.port);

            var btn1 = document.body.children[0];
            var btn2 = document.body.children[1];
            var btn3 = document.body.children[2];
            btn1.onclick = function(){
                // assign() 页面跳转 参数:url 会在浏览器中生成一条历史记录
                location.assign('./2-测试页面.html');
            }
            btn2.onclick = function(){
                // replace() 页面跳转 替换页面 参数:url  不会在浏览器中生成历史记录
                location.replace('./2-测试页面.html')
            }
            btn3.onclick = function(){
                // reload()  刷新页面 参数:默认是false请求缓存资源   true强制从服务器请求数据
                // 小刷和大刷区别   
                // 小刷f5刷新文档 请求浏览器缓存资源
                // 大刷 请求服务器资源
                location.reload();
            }
        }
    </script>
</head>
<body>
    <button>跳转页面</button>
    <button>替换页面</button>
    <button>刷新页面</button>
</body>
</html>

属性输出:

 方法跳转

区别在于是否生成历史记录,assingn()可前进后退 replace()则不可

history

  该对象保存着用户上网的历史记录。出于安全方面的考虑,开发人员无法得知用户浏览过的URL,不过借由用户访问过的页面列表,同样可以在不知道实际URL的情况下实现后退前进,注意: 没有应用于History对象的公开标准,不过所有浏览器都支持该对象。

length

返回历史列表中的网址数 注意:Internet Explorer和Opera从0开始,而Firefox、Chrome和Safari从1开始。

back()

加载 history 列表中的前一个 URL

forward()

加载 history 列表中的下一个 URL

go()

加载 history 列表中的某个具体页面,负数表示向后跳转,正数表示向前跳转。

间歇调用和超时调用

javascript是单线程语言,但是可以通过超时值和间歇时间来调度代码在特定时刻执行。

setTimeout()

该方法返回一个数值ID,表示超时调用,这个超时调用ID是计划执行代码的唯一标识符通过它来取消超时调用。可以通过clearTimeout(ID);

参数:

1.要执行的代码 2.以毫秒表示的时间。

例如在1秒后执行输出语句

<script>
  var id = setTimeout(() => {
    console.log('Hello World');
  }, 1000);
  console.log(id);
  // 清除超时调用
  clearTimeout(id);
</script>
setInterval()

按照指定的时间间隔重复执行代码,直到间歇调用被取消或页面被卸载。调用该方法也会返回一个间歇调用ID,该ID可以用户在将来某个时刻取消间歇调用。

参数:

1.要执行的代码 2.以毫秒表示的时间。

如动态显示时间

<script>
  var div = document.createElement('div');
  // 间歇调用
  var id = setInterval(() => {
    div.innerHTML = new Date().toLocaleString();
  }, 1000);
  document.body.appendChild(div);
  // 清除计时器
  clearInterval(id);
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试题28】什么是PHP-FPM?它与PHP和Nginx有什么关系

文章目录 一、前言二、什么是PHP-FPM&#xff1f;三、PHP-FPM的生命周期3.1 启动阶段3.2 初始化阶段3.3 请求处理阶段3.4 关闭阶段 四、PHP-FPM与PHP的关系五、PHP-FPM与Nginx的通信方式六、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖P…

【视觉SLAM入门】2.旋转--李群与李代数

"川泽纳污" 0. 一个例子1. 群和李群2. 李代数2.1 推导和性质2.2 s o ( 3 ) \mathscr{so(3)} so(3) 和 s e ( 3 ) \mathscr{se(3)} se(3)2.3 计算李代数的幂 e x p ( ϕ \;exp(\phi exp(ϕ^ ) ) )2.4 李代数乘法2.5 从李代数乘法到导数&#xff1a;2.5.1 直接求导2.…

100天精通Golang(基础入门篇)——第14天:深入解析Go语言函数->从概念到实践,助您精通基础知识!(基础)

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

第11章:C语言数据结构与算法初阶之排序

系列文章目录 文章目录 系列文章目录前言排序的概念及其运用排序的概念常见的排序算法 常见排序算法的实现1.直接插入排序2. 希尔排序&#xff08;缩小增量排序&#xff09;3. 直接选择排序4. 堆排序5. 冒泡排序6. 快速排序将区间按照基准值划分为左右两半部分的常见方式&#…

使用selenium爬取猫眼电影榜单数据

文章目录 前言导入所需的库&#xff1a;设置ChromeDriver的路径&#xff0c;并创建一个Chrome浏览器实例&#xff1a;打开目标网页&#xff0c;这里以猫眼电影榜单页面为例&#xff1a;使用XPath定位电影信息。通过查看网页源代码&#xff0c;发现电影信息所在的<dd>标签…

深度学习之目标检测Faster RCNN模型算法流程详解说明(超详细理论篇)

1.Faster RCNN论文背景 2. Faster-RCNN算法流程 &#xff08;1&#xff09;Fast-RCNN算法流程 &#xff08;2&#xff09;特征提取conv layers &#xff08;3&#xff09;Region Proposal Networks(RPN) &#xff08;4&#xff09;ROI Pooling作用 &#xff08;5&#xff09;Cl…

Spring定时器调度实现的原理

1、使用Spring定时器任务实现 package com.suyun.modules.vehicle.timetask;import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.JavaProcessor; import com.alibaba.schedulerx.worker.processor.ProcessResult; impo…

arm学习cortex-A7中断按键控制led灯亮灭

main.c #include "key.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); } int main() {//rcc初始化 RCC->MP_AHB4ENSETR | (0x3 << 4);//初始化按键GPIOF模式为输入模式…

cyclo(-D-Ala-Val),15136-27-3,可以通过肽筛选发现的多肽

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ 为大家介绍&#xff08;CAS&#xff1a;15136-27-3&#xff09;,试剂仅用于科学研究&#xff0c;不可用于人类&#xff0c;非药用&#xff0c;非食用。 英文名称&#xff1a…

从刷题到解决问题再到研究创新

题记&#xff1a;死的知识学再多也没大用。 明明自觉学会了不少知识&#xff0c;可真正开始做题时&#xff0c;却还是出现了“一支笔&#xff0c;一双手&#xff0c;一道力扣&#xff08;Leetcode&#xff09;做一宿”的窘境&#xff1f;你是否也有过这样的经历&#xff0c;题…

移动端H5页面引入高德地图的一些问题记录

web端显示 移动端显示 移动端和web端显示的地图范围一样大&#xff0c;并且在移动端地图的zoom和web端一致 这个问题是在公司开发邀请函的时候碰到的&#xff0c;因为要在移动端显示的范围足够大&#xff0c;使用zoom并不能满足需求了&#xff0c;例如如下代码 amap new AMa…

Sqlserver 中nchar(n)、varchar(n)、nvarchar(n)和nvarchar(max)的区别

nchar(n): 固定大小字符串数据。 n 用于定义字符串大小&#xff08;以双字节为单位&#xff09;&#xff0c;并且它必须是 1 到 4,000 之间的值。 存储大小为 n 字节的两倍。 varchar(n): 长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间…

解决Rstudio server is taking longer than usual.

经常用Rstudio server访问服务器&#xff0c;但长时间使用未清理缓存时出现了以下界面&#xff1a; 点任何一个键都无法解决&#xff0c;查询了一下原因是由于当使用RStudio Server处理占内存极大的数据后&#xff0c;长时间不清理内存&#xff0c;当再次打开rstudio&#xff0…

IPC-核间通讯

1. IPC通讯是AUTOSAR体系结构中的核心组成部分&#xff0c;它使得不同的软件组件可以相互通信、协同工作&#xff0c;从而实现整车系统的功能。IPC可以理解为核间通讯&#xff0c;就是一个芯片有多个核&#xff0c;现在想让多核之间通信&#xff0c;达到下面几个目的&#xff1…

Docker自学记录笔记

安装联系Docker命令 1. 搜索镜像 docker search nagin 2. 下载镜像 3. 启动nginx 强调文本 强调文本 加粗文本 加粗文本 标记文本 删除文本 引用文本 H2O is是液体。 210 运算结果是 1024. 插入链接与图片 链接: link. 图片: 带尺寸的图片: 居中的图片: 居中并…

初识win32

很多人都说windows编程凉了&#xff0c;实则不然&#xff0c;因为微软不倒&#xff0c;我们还在使用微软提供的winddows操作系统&#xff0c;windows编程就不会消亡&#xff0c;MFC也是一样&#xff0c;不可否认其他编程语言的方便&#xff0c;强大&#xff0c;但是windows编程…

深入理解linux物理内存

目录 物理内存热插拔 从 CPU 角度看物理内存架构 内核如何管理 NUMA 节点 NUMA 节点物理内存区域的划分 NUMA 节点的状态 node_states 物理内存区域中的水位线 物理内存区域中的冷热页 内核如何描述物理内存页 匿名页的反向映射 物理内存热插拔 物理热插拔阶段&#xff…

『赠书活动 | 第十四期』《Spring Cloud Alibaba核心技术与实战案例》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十四期』 本期书籍&#xff1a;《Spring Cloud Alibaba核心技术与实战案例》 公众号赠书&#xff1a;第五期 参与方式&#xff1a;关注公…

【Linux 驱动篇(四)】设备树

文章目录 一、什么是设备树二、DTS、 DTB 和 DTC三、DTS 语法1. .dtsi 头文件2. 设备节点3. 标准属性3.1 compatible 属性3.2 model 属性3.3 status 属性3.4 #address-cells 和#size-cells 属性3.5 reg 属性 ...... 一、什么是设备树 设备树(Device Tree)&#xff0c;将这个词分…

为什么不建议企业用薪资系统来跟踪项目时间?

身处在一个每分钟都很重要的世界里&#xff0c;企业必须勤于管理时间和工资。 虽然使用薪资系统进行时间跟踪似乎是一个实用的解决方案&#xff0c;但这种方法可能导致许多问题。 本文将讨论专用的时间跟踪软件对任何组织都必不可少的原因&#xff0c;以及依靠薪资系统进行时…