JS 之 事件Event对象详解(属性、方法、自定义事件)

news2025/4/20 4:32:55

一、Event对象

1、简介

​ 事件event对象是指在浏览器中触发事件时,浏览器会自动创建一个event对象,其中存储了本次事件相关的信息,包括事件类型、事件目标、触发元素等等。浏览器创建完event对象之后,会自动将该对象作为参数传递给绑定的事件处理函数,我们可以在事件处理函数中通过访问event对象的属性和方法,来获取事件的相关信息,并做出后续的逻辑处理。

​ 事件可以由用户操作触发,例如:鼠标事件、键盘事件等等;也可以通过 JS 脚本代码来触发,例如:通过element.click()方法,触发对应元素的点击事件;还可以由API生成,例如:动画完成后触发对应事件、视频播放被暂停时触发对应事件;最后还可以通过自定义事件来进行触发。这四种方式都会创建并传递event对象。

​ 除了我们自己绑定的事件处理函数之外,浏览器会对某些元素的某些事件存在默认处理,例如: a 标签的click点击事件,默认处理为跳转到链接的地址。当然我们也可以通过event对象的preventDefault() 方法来阻止浏览器的默认处理。

​ 我们还需要注意元素的嵌套关系,因为由于元素结构上的重叠,事件会随着嵌套关系依次传递,也就是事件冒泡和事件捕获。

2、Event对象示例

在这里插入图片描述

3、常用属性

① event.bubbles(只读)

​ 该属性值为布尔值,表示当前事件是否会进行冒泡,true表示会冒泡,false表示不会冒泡。在前端事件大部分都是默认冒泡的,例如:clickmousedown等等;但也有一些特殊事件是默认不冒泡的,例如:focusblur等等。

② event.cancelBubble

​ 该属性值为布尔值,表示是否阻止当前事件的冒泡,默认为false,不阻止冒泡;设置为true则表示阻止当前事件冒泡。目前该属性已经完全被stopPropagetion()方法所取代,虽然部分浏览器处于兼容性的考虑依旧支持该属性,但后续随时有可能停止支持,因此尽量不要使用该属性。

③ event.cancelable(只读)

​ 该属性值为布尔值,表示当前事件的默认行为是否可以被取消,即是否能通过event.preventDefault()来取消默认行为,true表示可以取消,false表示不可以取消。

​ 如果是自定义事件,则在初始化事件时可以声明该事件是否可以被取消。

④ event.composed(只读)

​ 该属性值为布尔值,曾用名:scoped,表示当前事件是否可以打破屏障,从Shadow DOM冒泡传递到普通DOM,如果值为true表示当事件可以冒泡,即bubbles属性为true时,事件可以从Shadow DOM冒泡传递到普通DOM,此时可以通过composedPath()方法,来获取事件冒泡的路径;如果值为false,则表示事件不会跨越Shadow DOM与普通DOM的屏障进行冒泡。

​ 关于Shadow DOM的概念,在下面有进行讲解。

⑤ event.currentTarget(只读)

​ 该属性值为一个DOM,表示当前事件所绑定的那个DOM元素。而且要注意的是,该属性值只能在事件处理函数的过程中event.currentTarget直接调用使用,如果我们通过console.log(event)输出事件对象,如同上面的示例,我们会发现该属性值的值为null,无法访问到正确的值。我们在调试阶段,还可以通过在事件处理函数中设置debugger暂停代码执行,从而在输出的event对象上看到该属性正确的值。

⑥ event.target(只读)

​ 该属性值为一个DOM,表示触发当前事件的那个DOM元素。通常情况下该属性的值与event.currentTarget相同,但是如果当前事件是在冒泡或者捕获阶段被调用,则两者的值不同,target的值为触发事件的DOM,currentTarget的值为绑定事件的DOM。

​ 我们还可以借助target属性实现事件委托,又称事件代理,是指在要对一批子元素设置类似的事件处理器时,利用事件冒泡的机制,将事件处理器绑定到其公共父元素上,然后通过target属性,来区分是由哪个子元素触发的事件,并进行相应的逻辑处理。这样即可以大大的减少事件处理器的数量,提高性能,又可以动态地添加或删除子元素而不需要添加或删除相应的事件处理器,减少代码复杂度。

target与currentTarget在冒泡阶段对比

案例代码:

<div id="divBox">
  <div id="divClick">
    这里触发点击事件
  </div>
</div>

<script>
  // 事件绑定在子元素上 此时 target = 
  document.querySelector('#divClick').addEventListener('click', function (e) {
    console.log(e)
    console.log(e.target)
    console.log(e.currentTarget)
  })
  document.querySelector('#divBox').addEventListener('click', function (e) {
    console.log(e)
    console.log(e.target)
    console.log(e.currentTarget)
  })
</script>

执行结果:

在这里插入图片描述

⑦ event.defaultPrevented(只读)

​ 该属性值为布尔值,表示当前事件是否调用了event.preventDefault()方法,从而阻止了浏览器的默认行为,true表示已经调用过,false表示还未调用。

⑧ event.returnValue

​ 属性值为布尔值,表示当前事件的默认行为是否执行,该属性可读可写,true表示正常执行,false表示阻止默认行为。该属性是由IE率先引入,最后被收入web规范,该属性相当于event.defaultPreventedevent.preventDefault()的结合。

案例代码:

<a href="https://www.baidu.com" id="a0">不阻止默认行为</a>
<a href="https://www.baidu.com" id="a1">event.returnValue阻止默认行为</a>
<a href="https://www.baidu.com" id="a2">event.preventDefault()阻止默认行为</a>

<script>
  document.querySelector('#a0').addEventListener('click', function (e) {
    // 不阻止默认行为
    console.log('不阻止默认行为的e.returnValue---', e.returnValue)
    // 打断点 暂停页面跳转 方便查看控制台输出
    debugger
  })
  document.querySelector('#a1').addEventListener('click', function (e) {
     // 阻止默认行为
     e.returnValue = false
     console.log('通过returnValue = false阻止默认行为的e.returnValue---', e.returnValue)
  })
  document.querySelector('#a2').addEventListener('click', function (e) {
    // 阻止默认行为
    e.preventDefault()
    console.log('通过preventDefault()阻止默认行为的e.returnValue---', e.returnValue)
  })
</script>

执行结果:

在这里插入图片描述

⑨ event.eventPhase(只读)

​ 该属性值为整数数值,表示事件流的当前执行阶段,共分为四个阶段,每个阶段有不同的事件阶段常量,如下:

常量描述
Event.NONE0这个阶段,没有事件正在被处理
Event.CAPTURING_PHASE1这个阶段是指事件捕获的过程,事件正在被目标元素的祖先对象处理,是从最外层的祖先元素到目标元素的过程,从WindowDocument、…、目标元素的过程。
Event.AT_TARGET2这个阶段是指到达目标元素的过程。如果 Event.bubbles 的值为 false,即事件不会冒泡,则对事件对象的处理在这个阶段后就会结束。
Event.BUBBLING_PHASE3这个阶段是指事件冒泡的过程,从从目标元素到最外层的祖先元素的过程。

事件流的执行过程:

在这里插入图片描述

​ 当我们通过event.eventPhase获取当前事件流的执行阶段时,会直接获取到当前事件阶段常量的值,我们可以直接根据值判断事件流的执行阶段,也可以通过对比event.eventPhase与事件阶段常量是否强相等(===),判断事件流的执行阶段。

案例代码:

<div id="div0">
  <div id="div1">事件流演示</div>
</div>
<script>
   // addEventListener设置第三个参数为true 表示在捕获阶段触发事件
    document.querySelector('#div0').addEventListener('click', function (e) {
      console.log('div0--', e)
      // 输出事件阶段常量的值
      console.log('捕获阶段的事件阶段常量---', e.eventPhase)
      // 判断事件阶段是否为捕获阶段
      console.log(e.eventPhase === Event.CAPTURING_PHASE)
    }, true)
    // addEventListener设置第三个参数为false或者不设置 表示在冒泡阶段触发事件
    document.querySelector('#div0').addEventListener('click', function (e) {
      console.log('div0--', e)
      // 输出事件阶段常量的值
      console.log('冒泡阶段的事件阶段常量---', e.eventPhase)
      // 判断事件阶段是否为冒泡阶段
      console.log(e.eventPhase === Event.BUBBLING_PHASE)
    })
    // 目标元素
    document.querySelector('#div1').addEventListener('click', function (e) {
      console.log('div1--', e)
      // 输出事件阶段常量的值
      console.log('到达目标元素的事件阶段常量---', e.eventPhase)
      // 判断事件阶段是否为到达目标元素阶段
      console.log(e.eventPhase === Event.AT_TARGET)
    })
</script>

执行结果:
在这里插入图片描述

event.timeStamp(只读)

​ 该属性值为一个数值,表示从文档加载完成,到当前事件被触发之间的的毫秒数,Chrome、Safari和Edge返回的是带有小数的毫秒数,FireFox返回的是不带小数的毫秒数。

​ 因为各大浏览器之间的返回值并不统一,所以不太建议使用该属性。

案例代码:

<div style="width: 200px;height: 30px;" id="div2">点击获取事件发生时的毫秒数</div>

<script>
  // 获取事件发生时的毫秒数
    document.querySelector('#div2').addEventListener('click', function (e) {
      console.log('事件发生时的毫秒数---', e.timeStamp)
    })
</script>

执行结果:

在这里插入图片描述

⑪ event.type(只读)

​ 该属性值是一个字符串,表示当前事件的类型,不区分大小写。

案例代码:

<div style="width: 200px;height: 30px;" id="div3">
  点击获取事件的type属性
</div>

<script>
  // 获取事件的type属性
    document.querySelector('#div3').addEventListener('click', function (e) {
      console.log('事件的type属性---', e.type)
    })
</script>

执行结果:

在这里插入图片描述

⑫ event.isTrusted(只读)

​ 该属性值是一个布尔值,表示当前事件是由用户行为触发,还是通过JS脚本触发,true表示用户行为触发,false表示脚本触发。

案例代码:

<div style="width: 200px;height: 30px;" id="div4">点击获取事件的isTrusted属性</div>
<div id="div5"></div>

<script>
   // 获取用户手动触发时事件的isTrusted属性
    document.querySelector('#div4').addEventListener('click', function (e) {
      console.log('用户手动触发时事件的isTrusted属性---', e.isTrusted)
      // 设置定时器模拟脚本触发事件
      setTimeout(() => {
        document.querySelector('#div5').click();
      }, 1000)
    })
    // 获取脚本触发时事件的isTrusted属性
    document.querySelector('#div5').addEventListener('click', function (e) {
      console.log('脚本触发时事件的isTrusted属性---', e.isTrusted)
    })
</script>

执行结果:

在这里插入图片描述

4、常用方法

① event.composedPath()

​ 该方法用来获取当前事件的事件传播路径,从触发元素到最外层Window,而且阻止冒泡的方法不会影响到事件的传播路径。如果Shadow DOM根节点触发事件,并且ShadowRoot.mode是关闭的,则获取的路径中将不包括Shadow DOM节点。

案例代码:

<div id="div0">
  <div id="div0Son">
    验证target和currentTarget
  </div>
</div>

<script>
    // 获取事件对象的事件路径
    document.querySelector('#div0Son').addEventListener('click', function (e) {
      // 阻止事件冒泡 但并不会影响事件的传播路径
      e.stopPropagation()
      // 通过e.composedPath()获取事件对象的事件路径
      console.log(e.composedPath())
    })
</script>

执行结果:

在这里插入图片描述

② event.preventDefault()

​ 该方法用来取消当前事件的默认行为,当然如果当前事件存在冒泡行为,即bubbles属性为true,那么事件的冒泡行为还是会继续向上传播,不会被影响。

案例代码:

<div id="div1">
  <input type="checkbox" id="checkbox">
</div>

<script>
    // 阻止多选按钮的默认行为
    document.querySelector('#checkbox').addEventListener('click', function (e) {
      e.preventDefault()
    })
    // 验证阻止默认行为后是否会继续冒泡
    document.querySelector('#div1').addEventListener('click', function (e) {
      console.log('阻止默认行为后会继续冒泡')
    })
</script>

执行结果:

在这里插入图片描述

③ event.stopPropagation()

​ 该方法用来阻止当前事件在捕获阶段和冒泡阶段中的传播,如果点击了子元素,但是在子元素中阻止了事件的冒泡,那么父元素对应的事件不会被触发;如果点击了子元素,但是在父元素中阻止了事件的捕获传播,那么子元素对应的事件将不会被触发。

案例代码:

<div id="div2">
  <div id="div2Son">
    验证stopPropagation()方法阻止事件冒泡传播
  </div>
</div>
<div id="div3">
  <div id="div3Son">
    验证stopPropagation()方法阻止事件捕获传播
  </div>
</div>

<script>
    // 验证stopPropagation()方法阻止事件冒泡
    document.querySelector('#div2Son').addEventListener('click', function (e) {
      console.log('子元素阻止事件冒泡');
      e.stopPropagation()
    })
    // 验证stopPropagation()方法阻止事件冒泡后父元素是否接收到冒泡的事件
    document.querySelector('#div2').addEventListener('click', function (e) {
      console.log('父元素是否接收到冒泡的事件')
    })
    // 验证stopPropagation()方法阻止事件捕获传播
    document.querySelector('#div3').addEventListener('click', function (e) {
      console.log('父元素阻止事件捕获传播');
      e.stopPropagation()
    }, true)
    // 验证stopPropagation()方法阻止事件捕获后子元素是否接收到捕获的事件
    document.querySelector('#div3Son').addEventListener('click', function (e) {
      console.log('子元素是否接收到捕获传播的事件')
    }, true)
</script>

执行结果:

在这里插入图片描述

④ event.stoplmmediatePropagation()

​ 该方法用来阻止当前事件的其他事监听器被触发,如果我们通过addEventListener()方法给同一个事件,增加多个事件监听器,那当该事件被触发时,多个事件监听器会按照添加的顺序依次执行。但如果我们在其中某个事件监听器绑定的函数中,执行event.stoplmmediatePropagation()方法,那么位于该事件监听器之后的其他监听器将不会被触发。

案例代码:

<div id="div4">
  验证stopImmediatePropagation()法
</div>

<script>
  // 验证stopImmediatePropagation()方法
    document.querySelector('#div4').addEventListener('click', function (e) {
      console.log('第一个事件监听器');
    })
    document.querySelector('#div4').addEventListener('click', function (e) {
      console.log('第二个事件监听器');
      // 阻止后续事件监听器的执行
      e.stopImmediatePropagation()
    })
    document.querySelector('#div4').addEventListener('click', function (e) {
      console.log('第三个事件监听器');
    })
</script>

执行结果:

在这里插入图片描述

5、Shadow DOM

​ Shadow DOM 是Web components 的核心内容,用于构建独立的web组件,可以将一个DOM树和相应的CSS样式封装隔离起来,与页面的常规DOM相互隔离,不会出现影响和冲突。然后可以将封装的Shadow DOM附加到常规的DOM节点上。操作Shadow DOM 的方式与常规DOM并无太大区别,都可以给DOM添加子节点、设置属性,以及为节点添加自己的样式。唯一有所不同的是:Shadow DOM内部的元素除了设置 :focus-within之外,设置其他任何属性都不会影响到常规 DOM。

​ Shadow DOM 有以下四个主要概念:

  • Shadow host:一个常规的DOM节点,Shadow DOM将会附加在该节点上。
  • Shadow tree:一个DOM树,即Shadow DOM 内部的DOM结构。
  • Shadow boundary:Shadow DOM与常规DOM的分界线,是 Shadow DOM 结束的地方,也是常规 DOM 开始的地方。
  • Shadow root :Shadow tree所代表的DOM树的根节点。

Shadow DOM主要概念图解:

在这里插入图片描述

​ 虽然Shadow DOM看起来比较陌生,但这并不是一个新特性,浏览器很早之前便在使用该特性,例如:<video>标签,虽然我们在DOM中只能看到一个单独的标签,但其实在该标签的Shadow DOM中,包含了进度条、播放按钮、倍速按钮等DOM结构。 Firefox(从版本 63 开始)、Chrome、Opera 、 Safari、Edge 都默认支持 Shadow DOM。

二、自定义事件

1、简介

​ 在日常开发中我们通常使用的都是浏览器提前定义好的事件,例如:点击事件click、失去焦点事件blur等等。当这些基础事件不能满足我们的业务需求时,我们也可以通过创建自定义Event事件对象来自定义相关事件。

​ 目前实现自定义事件的方式有两种:Event()构造函数和CustomEvent()构造函数。

​ 触发自定义事件的方式为:element.dispatchEvent(event)

2、Event()

​ 构造函数Event(typeArg[,eventInit])用来创建一个新的event事件对象,该构造函数拥有两个参数:第一个参数typeArg为必填参数,参数值为DOMString类型,表示所创建事件的名称;第二个参数eventInit为可选参数,参数值为EventInit类型的对象数据,拥有三条可选属性:① bubbles:属性值为Boolean类型,默认值为false,表示创建的事件是否能进行冒泡。② cancelable:属性值为Boolean类型,默认值为false,表示创建的事件的行为是否可以被preventDefault()取消。③ composed: 属性值为为Boolean类型,默认值为false,表示创建的事件是否可以穿透Shadow DOM 与常规DOM的屏障,进行冒泡。

案例代码:
<div class="div1">
  <div class="div1Son">
    验证自定义事件
  </div>
</div>

<script>
    // 1、创建一个支持冒泡,支持取消,支持穿透 的look事件
    let myEvent = new Event('look', { "bubbles": true, "cancelable": true, "composed": true });
    // 2、监听自定义事件
    document.querySelector('.div1Son').addEventListener('look', function (e) {
      console.log('监听到自定义事件----', e.type)
    })
    // 3、利用点击事件 去触发自定义事件
    document.querySelector('.div1Son').addEventListener('click', function (e) {
      // 触发自定义事件
      document.querySelector('.div1Son').dispatchEvent(myEvent)
    })
    // 4、监听父元素是否收到冒泡的自定义事件
    document.querySelector('.div1').addEventListener('look', function (e) {
      console.log('父元素是否收到冒泡的自定义事件----', e.type)
    })
</script>
执行结果:

在这里插入图片描述

3、CustomEvent()

​ 构造函数CustomEvent(typeArg[,customEventInit])用来创建一个新的CustomEvent事件对象,该构造函数拥有两个参数:第一个参数typeArg为必填参数,参数值为DOMString类型,表示所创建事件的名称;第二个可选参数customEventInit,参数值为CustomEventInit 类型的对象数据,拥有四条可选属性:① bubbles:属性值为Boolean类型,默认值为false,表示创建的事件是否能进行冒泡。② cancelable:属性值为Boolean类型,默认值为false,表示创建的事件的行为是否可以被preventDefault()取消。③ composed: 属性值为为Boolean类型,默认值为false,表示创建的事件是否可以穿透Shadow DOM 与常规DOM的屏障,进行冒泡。④ detail:属性值为任意类型的数据,默认值为null,通常用来表示与当前事件相关的信息。

Event 接口是 CustomEvent 接口的父级接口,因此 CustomEvent 继承了 Event 的所有属性和方法,并且在 Event 的基础上添加了一个 detail 属性,用于在事件处理程序中传递自定义数据。除此之外,CustomEvent 还允许我们在事件对象上添加自定义属性和方法,以便在事件处理程序中使用。这使得我们可以创建更灵活、更具体的事件类型,并在事件处理程序中访问和操作事件对象。

​ 总的来说:CustomEvent 是自定义的事件类型,可操作性强,可以更好地满足开发人员的特定需求,而 Event 则更适合表示标准的、通用的事件类型,可操作性弱。

案例代码:
<div class="div2">
  <div class="div2Son">
    验证CustomEvent()构造函数创建自定义事件
  </div>
</div>

<script>
    // 利用CustomEvent()构造函数创建自定义事件
    // 1、创建一个支持冒泡,支持取消,支持穿透,具有自定义属性 的look事件
    let myEvent2 = new CustomEvent('look', {
      "bubbles": true, "cancelable": true, "composed": false, detail: {
        info: '这是CustomEvent的detail属性', // 自定义属性
        getTime: function () { // 自定义方法
          return new Date()
        }
      }
    });
    // 2、监听自定义事件
    document.querySelector('.div2Son').addEventListener('look', function (e) {
      console.log('监听到自定义事件----', e)
      console.log('调用自定义事件上的自定义方法----', e.detail.getTime())
    })
    // 3、利用点击事件 去触发自定义事件
    document.querySelector('.div2Son').addEventListener('click', function (e) {
      // 触发自定义事件
      document.querySelector('.div2Son').dispatchEvent(myEvent2)
    })
    // 4、监听父元素是否收到冒泡的自定义事件
    document.querySelector('.div2').addEventListener('look', function (e) {
      console.log('父元素是否收到冒泡的自定义事件----', e.type)
    })
</script>
执行结果:

在这里插入图片描述

三、相关资料

事件参考

Event

CustomEvent

shadow DOM

:focus-within

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

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

相关文章

NLP——WordNet;Word Similarity; Word Sense Disambiguition

WordNet WordNet是一个广泛使用的英语词汇数据库和语义网络。它由普林斯顿大学认知科学实验室开发&#xff0c;旨在帮助人们理解单词之间的关系和意义。WordNet的主要目标是将英语词汇组织成一种层次结构&#xff0c;其中每个词都与其他相关词联系起来。WordNet中的单词按照它们…

[6]PCB设计实验|认识常用元器件|电阻器|18:30~19:00

目录 一、电阻器主要用途 1. 稳定和调节电路中的电流和电压 2. 作为分流、分压和负载使用 二、常见电阻器 1. 贴片电阻 2. 热敏电阻 3. 限流电阻 4. 可调电阻 5. 排阻(网络电阻) 三、几种常用电阻器的结构特点 四、电阻的参数 1. 额定功率 电阻器功率的表示 ​2…

自学黑客/网络安全工具软件大全100套

黑客工具软件大全100套 1 Nessus&#xff1a;最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器&#xff0c;它可以运行于几乎所有的UNIX平台之上。它不止永久升级&#xff0c;还免费提供多达11000种插件&#xff08;但需要注册并接受EULA-acceptance–终端用户授权…

【六一儿童节】回忆一下“童年的记忆”

文章目录 [TOC](文章目录) 前言一、EasyX带我们步入了童话的世界1.1绘画哆啦A梦2.2绘画出来喜羊羊 二、我的六一故事总结 前言 我们都有过童年&#xff0c;并且从现在看来&#xff0c;童年是我们最希望可以回去的那段时光&#xff0c;那时候的我们傻傻的&#xff0c;并且很天真…

电子元器件解析02之电容(一)——定义与性能参数

下篇文章&#xff1a;电子元器件解析02之电容(二)——电容分类与应用场景&#xff1a;https://blog.csdn.net/weixin_42837669/article/details/131142767 摘要 电容是最基本的电子元器件之一&#xff0c;本文介绍了电容的定义&#xff0c;并总结了电容的各个性能参数&#xff…

leetcode143. 重排链表(java)

重排链表 leetcode143. 重排链表题目要描述 解题思路代码链表专题 leetcode143. 重排链表 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/reorder-list 题目要描述 给定一个单链表 L 的头节点 head &#xff0c;单链表 …

根据字节、华为、阿里、腾讯等大厂整理的2023最新面试热点问题,还不行我也救不了你了~

大厂面试热点问题 1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工作的开展越有利 可以尽早的确定测试思路 减少与开发人员的交互 减少对需求理解上的偏差 2、软件测试与调试的关系 测…

MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据

MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据 1、msa311简介 使用i2c总线 可以读取xyz轴的加速度 可以监测单击双击事件 可以监测运动与静止状态 可以监测自由落体事件&#xff0c;可用来监测摔倒或跌落。 可以监测旋转事件&#xff0c;类似手机…

工作中自我或者团队管理的几个有用工具

个人或者团队管理过程中&#xff0c;采用一些有效的管理工具或者方法&#xff0c;可以提升工作效率和结果。它们包括SMART原则、PDCA循环、SWOT分析、5W2H分析、鱼骨图分析、七个凡是。这几个工具或者方法之间有互通性&#xff0c;比如&#xff0c;PDCA循环中&#xff0c;在P这…

数学建模预备知识(1)全网最全的数学建模竞赛汇总,别再被坑了!

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;Qq及各类联系方式在图片上&#xff01; 喜欢的朋友可以关注下&#xff0c;下次更新不迷路&…

【MySQL】为什么MySQL选择B+Tree来做索引?

B树和B树的区别? B树 B树 B*树 B树和B树的区别 &#xff08;1&#xff09;存储量大&#xff1a;B树叶子及非叶子节点存索引数据&#xff0c;B树叶子非叶子节点存索引&#xff0c;叶子节点存数据&#xff1b; &#xff08;2&#xff09;查找速度&#xff1a; 查单个值&…

细说websocket - php篇

下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分&#xff0c;这个部分在 node 中可以十分轻松的完成&#xff0c;因为 node 提供的 net 模块已经对 socket 套接字做了封装处理&#xff0c;开发者使用的时候只需要考虑数据的交互而不用处理连接的建立…

运营-22.内容分发

内容分发 内容分发本质要解决的问题包含两点&#xff1a; 1. 高效的连接人与信息&#xff1b; 2. 过滤出有价值的信息&#xff0c;让合适的人看到合适的信息 。 常见的内容分发方式&#xff1a; 1. 编辑分发&#xff1b; 2. 订阅分发&#xff1b; 3. 社交分发&#xff1b; 4. 算…

Oracle中使用【Interval】对【日期】进行【相加减】,报错 ORA-01839:指定月份的日期无效(Interval的坑)

文章目录 1. 前言2. 先说结论3. 案例演示 1. 前言 最近在对某些表进行旧数据的删除&#xff0c;必然是通过【时间】删除之前较为久远的数据&#xff0c;比如1年前&#xff0c;6个月前&#xff0c;7天前的数据等等情况&#xff0c;这个时候的SQL&#xff0c;必然会出现条件&…

pandas---数据结构(Series、DataFrame 和 MultiIndex)创建方式、属性

1. 数据结构 Pandas中一共有三种数据结构&#xff0c;分别为&#xff1a;Series、DataFrame 和MultiIndex。 其中Series是一维数据结构&#xff0c;DataFrame是二维表格型数据结构&#xff0c;MultiIndex是三维数据结构。 1.1 Series Series是一个类似于一维数组的数据结构…

【LeetCode】每日一题 -- 1170. 比较字符串最小字母出现频次 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/compare-strings-by-frequency-of-the-smallest-character/ 1. 题解&#xff08;1170. 比较字符串最小字母出现频次&#xff09; 昨天的每日一题 2699. 修改图中的边权 有点难&#xff0c;研究了一会儿&#xff0c;学习了一…

文件讲解—【C语言】

目录 1.为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 4.1 顺序读写函数介绍 4.2 对比一组函数 例子 例子 5.3 rewind 例子 6. 文本文件和二进制文件 测试代…

机器学习 day15(神经网络的工作原理,激活值a的公式)

1. 隐藏层的内部实现 如图通常来说&#xff0c;该模型一共有两层&#xff0c;不包括输入层&#xff08;layer 0&#xff09;&#xff0c;第一层是隐藏层&#xff08;layer 1&#xff09;&#xff0c;第二层是输出层&#xff08;layer 2&#xff09;&#xff0c;我们可以用方括…

【力扣刷题 | 第三天】242.有效字母异位词 349 两个数组的交集

目录 1.242. 有效的字母异位词 2.349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09;​​​​​​ 使用算法笔记&#xff1a; 总结&#xff1a; 1.242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意…

学习记录 -- Accurate and fast cell marker gene identification with COSG

文章目录 brief代码演示安装实操 个人感受 brief 单细胞数据分析当中&#xff0c;细胞聚类分群完成之后&#xff0c;我们希望得知每一个细胞类群是什么细胞&#xff0c;也就是细胞类型注释。 通常情况下&#xff0c;我们可以找到细胞类群间表达量存在差异的基因&#xff0c;我…