精华内容
下载资源
问答
  • 2020-04-07 20:46:21

    事件是什么

    事件是指对象能够识别并做出反应的外部刺激。如一个迟到的学生这个对象,当听到上课铃声这个事件,学生这个对象做出的反应,即对事件的处理过程就是向教室急跑。

    在VB中的对象事件是什么

    在VIsual Basice应用程序中,对象事件是由Visual Basic预先定义好的,能够被对象识别和响应的动作。

    分类:

    事件可分为系统事件和用户事件两种

    1、系统事件是由系统或对象自己产生的,如当一个窗体被加载到内存准备显示时, 发生的加载(Load)事件,“定时器时间到”事件等:

    2、用户事件是由用户操作引起的,如鼠标单击(Click)事件、双击(DbIClick) 事件、标移动(ouseMove事件等。

          不同的对象所能识别的事件是不同的,如窗体对象能识别加载(Load) 事件,而其他控件对象就不能识别这个事件。每个事件都有名称,即事件名。事件名也是Visual Basic系统的关键字,不要用作对象名、文件名、变量名等。

    事件驱动机制
     Visual Basic应用程序的运行过程就是对事件的处理过程。程序运行时,由用户、系统或对象产生各种不同的事件,程序设计者已分别为各种不同的事件编写了处理代码程序,窗体和控件等对象在响应不同事件时执行不同的代码程序,这就是Visual Basic事件驱动机制。

    事件过程

    当对窗体和控件对象产生如单击(Click)、 双击(DIClick)、 鼠标移动(MouseMove)等事件时,接受事件的对象就会对事件产生反应,即执行-段程序代码,所执行的这段程序代码就称为事件过程。

    事件过程是一个独立的程序段,是应用程序的重要组成部分。

    在设计一个工程中,当在工程中添加了窗体和控件等对象,并通过属性设置他们的初始属性值之后,就应该编写他们的事件过程。这样在程序运行过程中,各种对象才能对用户的操作做出响应,完成应用程序要实现的功能。



     

    更多相关内容
  • VB对象事件和方法

    千次阅读 2020-09-15 12:44:45
    事件是Visual Basic预先编辑好的并且能够被对象识别的的动作,VB采用的是事件驱动机制,当用户触发了某个事件时,程序就会执行该事件过程下的代码。 例如,用户点击一次按钮,就会触发一次该按钮的单击事件,即...

    对象的事件:
    事件是指对象对于外部动作的响应,当对象发生了某个事件,就会执行相应的代码,这段代码被称为“事件过程”。

    事件是Visual Basic预先编辑好的并且能够被对象识别的的动作,VB采用的是事件驱动机制,当用户触发了某个事件时,程序就会执行该事件过程下的代码。

    例如,用户点击一次按钮,就会触发一次该按钮的单击事件,即Command1_Click事件。

    一个事件,就好比一个动作,用户单击按钮是一个事件,双击按钮也是一个事件,按下一个键盘的按键是一个事件,关闭某个窗口也是一个事件。实际上,VB编程的思想就是在于如何编写各种事件下的代码。

    事件过程的语法:

    Private Sub 对象名称_事件名称()  
         '响应事件的程序代码
    End Sub
    

    其中对象名称就是对象的Name属性

    例如:窗口Form1的双击事件过程为:

    Private Sub Form_DblClick()   
          '响应事件的程序代码
    End Sub
    

    注意:窗体的事件只要写Form_事件名称即可,不需要写窗体的名称,即不用写成Form1_DblClick()。

    通常事件过程的头尾不需要自己编写,只需要在代码区的上方选择相应的对象,再选择相应的事件后,即可自动产生。每个对象都有一个默认事件,在窗体设计界面双击该控件,会自动跳转到该对象的默认事件下,如果没有该事件,则系统会自动创建其默认事件。例如,按钮的默认事件是单击事件,窗体的默认事件是Form_Load()。

    对象事件练习:
    目标:设计一个应用程序,当单击窗体时,在窗体上随机位置打印一个五角星,当双击窗体时清除窗体上所有五角星。

    步骤一:新建一个工程
    步骤二:进入代码编辑区,写入以下代码:

    在这里插入图片描述

    步骤三:运行程序,查看效果。

    在这里插入图片描述

    本练习,通过对窗体的单击事件和双击事件编程,使学员可以清晰的了解如何创建事件过程,并对于同一个对象的不同事件过程有了初步的认知。

    每种对象都有很多事件,掌握它们的常用事件含义对于今后使用VB编程是会有很大的作用的,希望大家多去练习掌握。

    对象的方法:
    方法是对象所具有的动作,或者说该对象可以执行的功能。对象的方法是VB中已经定义封装好的通用子程序,用户可以直接调用。上面打印五角星的练习中,Form1.cls语句就是清除窗体的方法。

    使用方法的语句为:

    对象名称.方法名称
    

    例如,让文本框Text1获得焦点的方法为:

    Text1.SetFoucs
    

    对象方法的练习:
    目标:设计一个应用程序,当单击按钮1时,文本框无法输入内容,当单击按钮2时,文本框可以输入内容。

    步骤一:新建工程,并按下图所示创建控件。

    在这里插入图片描述

    步骤二:进入代码区,分别在按钮一和按钮二的单击事件过程中写入如下代码:

    在这里插入图片描述

    步骤三:运行程序,查看效果

    好啦,对象的事件和方法就讲到这里,通过这两节课程,相信大家对于VB的对象已经有了一个全面的认识,希望大家多加练习,如果还有疑问可以给我留言,我会及时回复的。

    接下来的课程会开始讲解VB的标准控件,大家敬请期待哦。

    展开全文
  • Python基于BP神经网络算法实现家用热水器用户行为分析与事件识别

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

    1.项目背景

          居民在使用家用热水器的过程中,会因为地区气候、不同区域和用户年龄性别差异等原因形成不同的使用习惯。家电企业若能深入了解其产品在不同用户群中的使用习惯,开发符合客户需求和使用习惯的功能,就能开拓新市场。

          本项目将依据BP神经网络算法构建洗浴事件识别模型,进而对不同地区的用户的洗浴事件进行识别,然后根据识别结果比较不同客户群的客户使用习惯,以加深对客户需求的理解等。从而厂商便可以对不同的客户群提供最适合的个性化产品,改进新产品的智能化研发并制定相应的营销策略。

    2.项目目标

           自1988年中国第一台真正意义上的热水器诞生至今,该行业经历了翻天覆地的变化。随着入场企业的增多,热水器行业竞争愈发激烈,如何在众多的企业中脱颖而出,成了热水器企业发展的重中之重。从用户的角度出发,分析用户的使用行为,改善热水器的产品功能,是企业在竞争中脱颖而出的重要方法之一。

           随着我国国内大家电品牌的进入和国外品牌的涌入,电热水器相关技术在过去20年间得到了快速发展,屡创新高。从首次提出封闭式电热水器的概念到水电分离技术的研发,再到漏电保护技术的应用及出水断电技术和防电墙技术专利的申请突破,如今高效能技术颠覆了业内对电热水器“高能耗”的认知。然而,当下的热水器行业也并非一片“太平盛世”,行业内正在上演一幕幕“弱肉强食”的“丛林法则”戏码,市场份额逐步向龙头企业集中,尤其是那些在资金、渠道和品牌影响力等方面拥有实力的综合家电品类巨头,它们正在不断“蚕食鲸吞”市场“蛋糕”。要想在该行业立足,只能走产品差异化路线,提升技术实力和产品质量,在功能卖点、外观等方面做出自身的特色。

           国内某热水器生产厂商新研发的一种高端智能热水器,在状态发生改变或者有水流状态时,会采集各监控指标数据。本项目基于热水器采集的时间序列数据,根据水流量和停顿时间间隔,将顺序排列的离散的用水时间节点划分为不同大小的时间区间,每个区间都是一个可理解的一次完整的用水事件,并以热水器一次完整用水事件作为一个基本事件,将时间序列数据划分为独立的用水事件,并识别出其中属于洗浴的事件。基于以上工作,该厂商可从热水器智能操作和节能运行等方面对产品进行优化。

           在热水器用户行为分析过程中,用水事件识别是最为关键的环节。根据该热水器生产厂商提供的数据,热水器用户用水事件划分与识别案例的整体目标如下:

    1)根据热水器采集到的数据,划分一次完整用水事件。

    2)在划分好的一次完整用水事件中,识别出洗浴事件。

    3.项目过程

    热水器用户用水事件划分与识别案例的总体流程如图所示:

    热水器用户用水事件划分与识别项目的总体流程

    热水器用户用水事件划分与识别项目主要包括以下5个步骤:

    1)对热水器用户的历史用水数据进行选择性抽取,构建专家样本。

    2)对步骤1形成的数据集,进行数据探索分析与预处理,包括探索水流量的分布情况,删除冗余属性,识别用水数据的缺失值,并对缺失值进行处理,然后根据建模的需要进行属性构造等。最后根据以上处理,对热水器用户用水样本数据建立用水事件时间间隔识别模型和划分一次完整的用水事件模型,接着在一次完整用水事件划分结果的基础上,剔除短暂用水事件、缩小识别范围等。

    3)在步骤2得到的建模样本数据基础上,建立洗浴事件识别模型,对洗浴事件识别模型进行模型分析评价。

    4)应用步骤3形成的模型结果,并对洗浴事件划分进行优化。

    5)调用洗浴事件识别模型,对实时监控的热水器流水数据进行洗浴事件自动识别。

    4.数据采集

    本次建模数据来源于网络(本项目撰写人整理而成),数据如下:

    本项目对原始数据采用无放回随机抽样法,抽取200家热水器用户某段时间的用水记录作为原始建模数据。由于热水器用户不仅使用热水器来洗浴,还有洗手、洗脸、刷牙、洗菜、做饭等用水行为,所以热水器采集到的数据来自各种不同的用水事件。热水器采集的用水数据包含12个属性:热水器编码、发生时间、开关机状态、加热中、保温中、有无水流、实际温度、热水量、水流量、节能模式、加热剩余时间和当前设置温度等。其解释说明如表所示:

    热水器数据属性说明

    部分数据展示如下:

    5.探索性数据分析

    在热水器的使用过程中,热水器的状态会经常发生改变,如开机和关机、由加热转到保温、由无水流到有水流、水温由50℃变为49℃等。而智能热水器在状态发生改变或水流量非零时,每两秒就会采集一条状态数据。由于数据的采集频率较高,并且数据来自大量用户,因此数据总量非常大。

    探索分析热水器的水流量状况,其中“有无水流”和“水流量”属性最能直观体现热水器的水流量情况,对这两个属性进行探索分析,关键代码如下:

    通过代码清单得到不同水流状态的记录条形图,如下图所示,无水流状态的记录明显比有水流状态的记录要多。

    不同水流状态的记录条形图

    通过代码得到不同水流状态的记录箱型图,如下图所示,箱体贴近0,说明无水流量的记录较多,水流量的分布与水流状态的分布一致。

    水流量分布箱型图

    “用水停顿时间间隔”定义为一条水流量不为0的流水记录同下一条水流量不为0的流水记录之间的时间间隔。根据现场实验统计,两次用水过程的用水停顿间隔时长一般不大于4分钟。为了探究热水器用户真实用水停顿时间间隔的分布情况,统计用水停顿的时间间隔并做出频率分布表。通过频率分布表分析用户用水停顿时间间隔的规律性,具体的数据如表所示:

    用水停顿时间间隔频数分布表(单位:分钟)

    通过分析表可知,停顿时间间隔为0~0.3分钟的频率很高,根据日常用水经验可以判断其为一次用水时间中的停顿;停顿时间间隔为6~13分钟的频率较低,分析其为两次用水事件之间的停顿。根据现场实验统计用水停顿的时间间隔可知,两次用水事件的停顿时间间隔分布在3~7分钟。

    6.数据预处理

    6.1.属性归约

    由于热水器采集的用水数据属性较多,本项目做以下处理。因为分析的主要对象为热水器用户,分析的主要目标为热水器用户洗浴行为的一般规律,所以“热水器编号”属性可以去除;因为在热水器采集的数据中,“有无水流”属性可以通过“水流量”属性反映出来,“节能模式”属性取值相同均为“关”,对分析无作用,所以可以去除。

    删除冗余属性“热水器编号”“有无水流”“节能模式”,关键代码如下:

     删除冗余属性后得到用来建模的属性如表所示:

    删除冗余属性后部分数据列表

    6.2.划分用水事件

    热水器用户的用水数据存储在数据库中,记录了各种各样的用水事件,包括洗浴、洗手、刷牙、洗脸、洗衣、洗菜等,而且一次用水事件由数条甚至数千条的状态记录组成。所以本项目首先需要在大量的状态记录中划分出哪些连续的数据是一次完整的用水事件。

    在用水状态记录中,水流量不为0,表明热水器用户正在使用热水;而水流量为0时,则表明热水器用户用热水时发生停顿或者用热水结束。对于任何一个用水记录,如果它的向前时差超过阈值T,则将它记为事件的开始编号;如果它的向后时差超过阈值T,则将其记为事件的结束编号。划分模型的符号说明如表所示。

    一次完整用水事件模型构建符号说明表

    一次完整用水事件的划分步骤如下:

    1)读取数据记录,识别所有水流量不为0的状态记录,将它们的发生时间记为序列t1。

    2)对序列t1构建其向前时差列和向后时差列,并分别与阈值进行比较。向前时差超过阈值T,则将它记为新的用水事件的开始编号;如果向后时差超过阈值T,则将其记为用水事件的结束编号。

    循环执行步骤2,直到向前时差列和向后时差列与均值比较完毕,则结束事件划分。

    用水事件划分主要分为两个步骤,即确定单次用水时长间隔,计算两条相邻记录的时间,实现代码如代码清单所示。

    划分用水事件

     对热水器用户的用水数据进行划分,结果如表所示:

    用水数据划分结果

    6.3.确定单次用水事件时长阈值

    对某热水器用户的数据,根据不同的阈值划分用水事件,得到相应的事件个数,阈值变化与划分得到事件个数如表所示,阈值与划分事件个数关系如图所示:

    某热水器用户家庭某时间段不同用水时间间隔阈值事件划分个数

    阈值与划分事件个数的关系

    图为阈值与划分事件个数的散点图。图中某段阈值范围内,下降趋势明显,说明在该段阈值范围内,热水器用户的停顿习惯比较集中。如果趋势比较平缓,则说明热水器用户停顿热水的习惯趋于稳定,所以取该段时间开始的时间点作为阈值,既不会将短的用水事件合并,又不会将长的用水事件拆开。在图中,热水器用户停顿热水的习惯在方框中的位置趋于稳定,说明该热水器用户的用水停顿习惯用方框开始的时间点作为划分阈值会有好的效果。

    曲线在图中,方框趋于稳定时,其方框开始的点的斜率趋于一个较小的值。为了用程序来识别这一特征,将这一特征提取为规则。图A可以说明如何识别上图方框中起始的时间。

    每个阈值对应一个点,给每个阈值计算得到一个斜率指标,如图A所示。其中,A点是要计算的斜率指标点。为了直观展示,用表1-7所示的符号来进行说明。

    图A 斜率计算图表

    1-7 阈值寻优模型符号说明

     将K作为A点的斜率指标,特别指出横坐标上的最后4个点没有斜率指标,因为找不出在它以后的4个更长的阈值。但这不影响对最优阈值的寻找,因为可以提高阈值的上限,以使最后的4个阈值不在考虑范围内。

    先统计出各个阈值下的用水事件的个数,再通过阈值寻优的方式找出最优的阈值,关键代码如下:

    确定单次用水事件时长阈值

    得到阈值优化的结果如下:

    1)当存在一个阈值的斜率指标K<1时,则取阈值最小的点A(可能存在多个阈值的斜率指标小于1)的横坐标xA作为用水事件划分的阈值,其中K<1中的“1”是经过实际数据验证的一个专家阈值。

    2)当不存在一个阈值的斜率指标K<1时,则找所有阈值中斜率指标最小的阈值;如果该阈值的斜率指标小于5,则取该阈值作为用水事件划分的阈值;如果该阈值的斜率指标不小于5,则阈值取默认值的阈值——4分钟。其中,“斜率指标小于5”中的“5”是经过实际数据验证的一个专家阈值。

    6.4.属性构造

    6.4.1构建用水时长与频率属性

    不同用水事件的用水时长是基础属性之一。例如,单次洗漱事件一般总时长在5分钟左右,而一次手洗衣物事件的时长则根据衣物多少而不同。根据用水时长这一属性可以构建如表所示的事件开始时间、事件结束时间、洗浴时间点、用水时长、总用水时长和用水时长/总用水时长这6个属性。

    主要用水时长类属性构建说明

    构建用水开始时间或结束时间两个特征时分别减去或加上了发送阈值(发送阈值是指热水器传输数据的频率的大小)。其原因以图B为例。在20:00:10时,热水器记录到的数据是数据还没有用水,而在20:00:12时,热水器记录的数据是有用水行为。所以用水开始时间在20:00:10~20:00:12之间,考虑到网络不稳定导致的网络数据传输延时数分钟或数小时之久等因素,取平均值会导致很大的偏差,综合分析构建“用水开始时间”为起始数据的时间减去“发送阈值”的一半。 

    图B 一次用水事件及相关属性说明

    用水时长相关的属性只能区分出一部分用水事件,不同用水事件的用水停顿和频率也不同。例如,一次完整洗漱事件的停顿次数不多,停顿的时间长短不一,平均停顿时长较短;一次手洗衣物事件的停顿次数较多,停顿时间相差不大,平均停顿时长一般。根据这一属性,可以构建如表所示的停顿时长、总停顿时长、平均停顿时长、停顿次数4个属性。

    主要用水频率类属性

     构建用水时长与用水频率属性,关键代码如下:

    构建用水时长与用水频率属性

    6.4.2构建用水量与波动属性

    除了用水时长、停顿和频率外,用水量也是识别该事件是否为洗浴事件的重要属性。例如,用水事件中的洗漱事件相比洗浴事件有停顿次数多、用水总量少、平均用水少的特点;手洗衣物事件相比于洗浴事件则有停顿次数多、用水总量多、平均用水量多的特点。根据这一原因可以构建出下表所示的两个用水量属性。

    用水量属性构建说明

    同时用水波动也是区分不同用水事件的关键。一般来说,在一次洗漱事件中,刷牙和洗脸的用水量完全不同;而在一次手洗衣物事件中,每次用水的量和停顿时间相差却不大。根据不同用水事件的这一特征可以构建下表所示的水流量波动和停顿时长波动两个特征。

    用水波动属性构建说明

    在用水时长和频率属性的基础之上构建用水量和用水波动属性,需要充分利用用水时长和频率属性,关键代码如下:

    构建用水量和用水波动属性

    6.5.筛选候选洗浴事件

    洗浴事件的识别是建立在一次用水事件识别的基础上的,也就是从已经划分好的一次用水事件中识别出哪些一次用水事件是洗浴事件。

    可以使用3个比较宽松的条件筛选掉那些非常短暂的用水事件,确定不可能为洗浴事件的数据就删除,剩余的事件称为“候选洗浴事件”。这3个条件是“或”的关系,也就是说,只要一次完整的用水事件满足任意一个条件,就被判定为短暂用水事件,即会被筛选掉。3个筛选条件如下:

    1)一次用水事件中总用水量小于5升。

    2)用水时长小于100秒。

    3)总用水时长小于120秒。

    基于构建的用水时长、用水量属性,筛选候选洗浴事件,关键代码如下:

    筛选候选洗浴事件

    筛选前,用水事件数目总共为172个,经过筛选,余下75个用水事件。结合日志,最终用于建模的属性的总数为11个,其基本情况如下表所示:

    属性基本情况

    7.构建BP神经网络模型

    根据建模样本数据建立BP神经网络模型识别洗浴事件。由于洗浴事件与普通用水事件在特征上存在不同,而且这些不同的特征要被体现出来。于是,根据热水器用户提供的用水日志,将其中洗浴事件的数据状态记录作为训练样本训练BP神经网络。然后根据训练好的BP神经网络来检验新采集的数据,具体过程如下图所示:

    BP神经模型识别洗浴事件

       训练BP神经网络的时候,选取了“候选洗浴事件”的11个属性作为BP神经网络的输入,分别为:洗浴时间点、总用水时长、总停顿时长、平均停顿时长、停顿次数、用水时长、用水时长/总用水时长、总用水量、平均水流量、水流量波动和停顿时长波动。训练BP神经网络时给定的输出为1与0,其中1代表该次事件为洗浴事件,0表示该次事件不是洗浴事件。是否为洗浴事件的标签的依据是热水器的用水记录日志。

    构建BP神经网络模型需要注意数据本身属性之间存在的量级差异,因此需要进行标准化,消除量级差异。另外,为了便于后续应用模型,可以用joblib.dump函数保存模型,关键代码如下:

    构建BP神经网络模型

    在训练BP神经网络时,对神经网络的参数进行了寻优,发现含有两个隐层的神经网络训练效果较好,其中两个隐层的隐节点数分别为17和10时训练的效果较好。

    根据样本,得到训练好的神经网络后,就可以用来识别对应的热水器用户的洗浴事件,其中待检测的样本的11个属性作为输入,输出层输出一个在[-1,1]范围内的值,如果该值小于0,则该事件不是洗浴事件,如果该值大于0,则该事件是洗浴事件。某热水器用户记录了两周的热水器用水日志,将前一周的数据作为训练数据,将后一周的数据作为测试数据,代入上述模型进行测试。

    8.模型评估

    结合模型评价的相关知识,使用精确率(precision)、召回率(recall)和F1值来衡量模型评价的效果较为客观、准确。同时结合ROC曲线,可以更加直观地评价模型的效果,关键代码如下:

    8.1.评估指标

    根据该热水器用户提供的用水日志判断事件是否为洗浴事件,多层神经网络模型识别结果报告如下表所示:

     根据模型评估报告表以看出,在洗浴事件的识别上精确率(precision)达到73%,同时召回率(recall)达到了90%,F1分数80%,说明模型效果良好。

    8.2.分类报告

    通过上图可以看到,分类为0的F1值为0.58;分类为1的F1值为0.81,准确率为0.73.

    8.3.ROC曲线

     从上图可以看到,此模型AUC值为0.89,说明模型效果良好。

    9.结论与展望

    综合上述结果,可以确定此次创建的模型是有效且效果良好的,能够用于实际的洗浴事件的识别中。

     本次机器学习项目实战所需的资料,项目资源如下:

    项目说明:
    链接:https://pan.baidu.com/s/1c6mQ_1YaDINFEttQymp2UQ 
    提取码:thgk

    网盘如果失效,可以添加博主微信:zy10178083

    展开全文
  • 文章目录事件传统方式addEventListener常见的事件对象得属性和方法返回触发事件对象e.target 返回的是触发事件对象(元素)this 返回的是绑定事件对象(元素)扩展 this 有个非常相似的属性 currentTarget 在IE678...

    事件

    传统方式

    <div>123</div>
    
    var div = document.querySelector('div')
          div.onclick = function (event) {
            console.log(event)
          }
    

    addEventListener

    div.addEventListener('click', function (event) {
            console.log(event)
          })
    

    事件对象也是兼容性问题 IE678 通过winndow.event

    div.onclick = function () {
            console.log(window.event) //IE678只能识别这种写法
          }
    

    为了解决兼容性:

    div.onclick = function (e) {
            e = e || window.event
            console.log(e) //这是兼容性写法
          }
    

    1.event就是一个事件对象 写到我们的侦听函数得 小括号里面 当形参来看
    2.事件对象只有有了事件才存在 他是系统给我们自动创建得,不需要为我们传递参数
    3.事件对象 是 我们事件得一系列相关的数据得集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信息,鼠标坐标等,如果是键盘事件里面就包含了键盘事件,比如判断用户按下了哪个键位都知道
    4.这个事件对象我们可以自己命名 比如 even、evt、e

    常见的事件对象得属性和方法

    返回触发事件的对象

    e.target 返回的是触发事件得对象(元素)

    <div>123<div>
    
    	var div = document.querySelector('div')
        div.addEventListener('click', function (e) {
          console.log(e.target) //返回的<div>123</div>
        })
    

    而有一个相同的this

    this 返回的是绑定事件得对象(元素)

    <ul>
    	<li>123</li>
    	<li>123</li>
    	<li>132</li>
    </ul>
    
    var ul = document.querySelector('ul')
          ul.addEventListener('click', function () {
            //我们给别 绑定了事件 那么this 就指向ul
            console.log(this) //返回的是<ul><li>abc</li><li>abc</li><li>abc</li></ul>
          })
    

    两者区别:
    e.target 指向我们点击的对象 谁触发了这个事件 我们点击的是li e.target 指向的就是li
    我们给ul 绑定了事件 那么this 就指向ul

    扩展 this 有个非常相似的属性 currentTarget 在IE678兼容

    	ul.addEventListener('click', function (e) {
            console.log(e.currentTarget)//返回的是<ul><li>abc</li><li>abc</li><li>abc</li></ul>
          })
    

    因为e.target IE678 不支持所以我们使用 e.srcElement 不标准IE678支持

    为了使用所以我们使用兼容性写法
    div.onclick = function () {
            e = e || window.event
            var target = e.target || e.srcElement
            console.log(target)
          }
    

    返回事件类型

    e.type返回事件类型

    <div>123</div>
    
    var div = document.querySelector('div')
          //e.type返回事件类型 比如 click mouseover 不带on
          div.addEventListener('click', fn)
          div.addEventListener('mouseover', fn)
          div.addEventListener('mouseout', fn)
          function fn(e) {
            console.log(e.type) //得到相应的事件类型
          }
    

    阻止默认行为(事件) 让链接不跳转 或者让提交按钮不提交

    e.preventDefault()

    <a href="http://www.baidu.com">百度</a>
    
    var a = document.querySelector('a')
          a.addEventListener('click', function (e) {
            e.preventDefault() //  dom 标准写法
          })
    

    在这里有一个需要注意 element.addEventListener 只支持 e.preventDefault()

    传统的注册方式
    <a href="http://www.baidu.com">百度</a>
    
    • 普通浏览器 e.preventDefault(); 方法 不考虑兼容性可用
    a.onclick = function (e) {
             e.preventDefault()
          }
    
    • 低版本浏览器 ie678 returnValue 属性
    a.onclick = function (e) {
             e.returnValue
          }
    
    • 我们可以利用return false 也能阻止默认行为 没有兼容性问题
      特点: return 后面的代码不执行了, 而且只限于传统的注册方式 addEventListener不支持
    a.onclick = function (e) {
            return false
            alert(11)
          }
    

    阻止冒泡

    • e.stopPropagation()

    css是我们更方便辨认从上倒下的层次关系

    .father {
            overflow: hidden;
            width: 300px;
            height: 300px;
            margin: 100px auto;
            background-color: pink;
            text-align: center;
          }
    
          .son {
            width: 200px;
            height: 200px;
            margin: 50px;
            background-color: purple;
            line-height: 200px;
            color: #fff;
          }
    

    上次我们提到,他的层次由 document -> html -> body -> father -> son

    <div class="father">
          <div class="son">son儿子</div>
        </div>
    

    在这里我们输出 document -> father -> son 作为示范

     var son = document.querySelector('.son')
          // e.stopPropagation()要阻止哪个冒泡就放在哪个函数里面
          son.addEventListener(
            'click',
            function (e) {
              alert('son')
            },
            false
          )
    var father = document.querySelector('.father')
          father.addEventListener(
            'click',
            function () {
              alert('father')
            },
            false
          )
          document.addEventListener('click', function () {
            alert('document')
          })
    

    输出得结果为点击son块时,分别弹出son -> father -> document

    当我们在son函数添加e.stopPropagation()时:

    var son = document.querySelector('.son')
          son.addEventListener(
            'click',
            function (e) {
              alert('son')
              e.stopPropagation() // stop 停止  Propagation 传播
            },
            false
          )
          var father = document.querySelector('.father')
          father.addEventListener(
            'click',
            function () {
              alert('father')
            },
            false
          )
          document.addEventListener('click', function () {
            alert('document')
          })
    

    注意:e.stopPropagation()要阻止哪个冒泡就放在哪个函数里面
    写在son函数里面,点击father时不能阻止冒泡

    注意:e.stopPropagation()虽然很方便,但是IE6、7、8并不支持,我们在IE低版本只有通过window.event.cancelBubble = true来实现阻止冒泡

    var son = document.querySelector('.son')
          son.addEventListener(
            'click',
            function (e) {
              alert('son')
              e.cancelBubble = true // 非标准 cancel 取消 bubble 泡泡
            },
            false
          )
          var father = document.querySelector('.father')
          father.addEventListener(
            'click',
            function () {
              alert('father')
            },
            false
          )
          document.addEventListener('click', function () {
            alert('document')
          })
    

    为了解决兼容性问题,所以我们用兼容性的写法

    	if (e && e.stopPropagation) {
            e.stopPropagation()
          } else {
            window.event.cancelBubble = true
          }
    

    事件委托

    事件委托的核心原理:给父节点添加侦听器, 利用事件冒泡影响每一个子节点

    <ul>
          <li>知否知否,点我应有弹框在手!</li>
          <li>知否知否,点我应有弹框在手!</li>
          <li>知否知否,点我应有弹框在手!</li>
          <li>知否知否,点我应有弹框在手!</li>
          <li>知否知否,点我应有弹框在手!</li>
        </ul>
    
    	var ul = document.querySelector('ul')
          var flag = 0
          ul.addEventListener('click', function (e) 			 {
            // alert('知否知否,点我应有弹框在手!')
            // e.target //这个可以得到我们点击的对象
            e.target.style.backgroundColor = 'pink'
          })
    

    鼠标事件

    禁用右键

    选中文字无法右击出菜单

    //1.contextmenu禁用右击菜单
          document.addEventListener('contextmenu', function (e) {
            e.preventDefault()
          })
    

    禁止鼠标选中

    document.addEventListener('selectstart', function (e) {
            e.preventDefault()
          })
    

    扩展 禁用F12键

    	document.onkeydown = document.onkeyup = document.onkeypress = function (
            event
          ) {
            var e = event || window.event || arguments.callee.caller.arguments[0]
    
            if (e && e.keyCode == 123) {
              mAlert()
              e.returnValue = false
              return false
            }
          }
          function mAlert() {
            alert('禁止操作控制台')
          }
          document.onmousedown = function mdClick(event) {
            var e = event || window.event || arguments.callee.caller.arguments[0]
            if (e.button == 2 || e.button == 3) {
              mAlert()
            }
          }
    

    鼠标事件对象

    e.clientX 和 e.clientY 只获取可视区 就算文章很长有滚动条得到的也只是可视区的坐标

    	document.addEventListener('click', function (e) {
            console.log(e.clientX) //距离左边距距离坐标
            console.log(e.clientY) //距离上边距距离坐标
        })
    

    e.pageX 和 e.pageY 获取整个文档 e.pageY随着文档长度而变化 此方法有兼容性问题 ie9以上才支持

    body {
            height: 3000px;
          }
    
    document.addEventListener('click', function (e) {
            console.log(e.pageX) //距离整个页面大的左边距距离坐标
            console.log(e.pageY) //距离整个页面大的上边距距离坐标
          })
    

    e.screenX 和 e.screenY是得到整个屏幕坐标

    body {
            height: 3000px;
          }
    
    document.addEventListener('click', function (e) {
            console.log(e.screenX) //距离电脑屏幕的左边距距离坐标
            console.log(e.screenY) //距离电脑屏幕的上边距距离坐标
          })
    

    下为图解
    在这里插入图片描述

    鼠标事件案例

    mousemove只要我们鼠标移动1px 就会触发这个事件

    • 因为我们是在页面移动,所以我们给document注册事件
    • 图片·移动距离不占用位置,使用绝对定位
    • 核心原理: 每次鼠标移动,我们都会获得最新的鼠标坐标, 把这个x和y坐标做为图片的top和left 值就可以移动图片
    <style>
          img {
            position: absolute;
            top: 2px;
          }
        </style>
    
    	<img src="images/angel.gif" alt="" />
        <script>
          var pic = document.querySelector('img')
          document.addEventListener('mousemove', function (e) {
            // 1. mousemove只要我们鼠标移动1px 就会触发这个事件
            // console.log(1);
            // 2.核心原理: 每次鼠标移动,我们都会获得最新的鼠标坐标, 把这个x和y坐标做为图片的top和left 值就可以移动图片
            var x = e.pageX
            var y = e.pageY
            console.log('x坐标是' + x, 'y坐标是' + y)
            //3 . 千万不要忘记给left 和top 添加px 单位
            pic.style.left = x - 50 + 'px'
            pic.style.top = y - 40 + 'px'
          })
        </script>
    

    常见的键盘事件

    onkeyup 按键弹起的时候 触发
    onkeydown 按键按下的时候 触发
    keypress 按键按下的时候 触发 注意 他不识别功能键 比如 ctrl shift 左右键等

    //常见的键盘事件
          // document.onkeyup = function () {
          //   console.log('我弹起了')
          // }
          document.addEventListener('keyup', function () {
            console.log('我弹起了')
          })
          document.addEventListener('keydown', function () {
            console.log('我按下了')
          })
          document.addEventListener('keypress', function () {
            console.log('我按下了press')
          })
          
    

    注意 : 优先级 keydown > keypress 左后执行keyup

    键盘对象

    键盘事件对象keyCode属性可以i得到相应的ASCII码值
    我们的 keyupkeydown 事件不区分字母大小写 a 和 A 得到的都是65
    我们的 keypress 虽然不知别功能键 但是区分字母大小写 返回不同的

    <script>
          ASCII码
          document.addEventListener('keyup', function (e) {
            console.log('keyup:' + e.keyCode)
            if (e.keyCode === 65) {
              alert('您按下了a键')
            } else {
              alert('您没有按下了a键')
            }
          })
          // 我们可以利用keyCode返回的ASCII值确定我们按的哪个值
          document.addEventListener('keypress', function (e) {
            console.log('keypress:' + e.keyCode)
          })
        </script>
    

    ASCII表

    在这里插入图片描述

    键盘对象案例
    模拟京东按键快速定位搜索框
    <input type="text" />
        <script>
          // 核心思路: 检测用户是否按下了s 键,如果按下s 键,就把光标定位到搜索框里面
          // 使用键盘事件对象里面的keyCode 判断用户按下的是否是s键
          // 搜索框获得焦点: 使用 js 里面的 focus() 方法
          var search = document.querySelector('input')
          // document.addEventListener('keydown', function (e) {
          //   // console.log(e.keyCode);
          //   if (e.keyCode === 83) {
          //     search.focus()
          //   }
          // })
          //使用keydown时会在按下同时执行所以会输出s
          document.addEventListener('keyup', function (e) {
            // console.log(e.keyCode);
            if (e.keyCode === 83) {
              search.focus()
            }
          })
        </script>
    
    键盘事件-模拟京东快递单号查询案例
    <body>
        <div class="search">
          <div class="con">123</div>
          <input type="text" placeholder="请输入您的快递单号" class="jd" />
        </div>
      </body>
    
    
    ```html
    
    ```css
    <style>
          * {
            margin: 0;
            padding: 0;
          }
    
          .search {
            position: relative;
            width: 178px;
            margin: 100px;
          }
    
          .con {
            display: none;
            position: absolute;
            top: -40px;
            width: 171px;
            border: 1px solid rgba(0, 0, 0, 0.2);
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
            padding: 5px 0;
            font-size: 18px;
            line-height: 20px;
            color: #333;
          }
    
          .con::before {
            content: '';
            width: 0;
            height: 0;
            position: absolute;
            top: 28px;
            left: 18px;
            border: 8px solid #000;
            border-style: solid dashed dashed;
            border-color: #fff transparent transparent;
          }
        </style>
    
    
    
    <script>
        var con = document.querySelector('.con')
        var jd_input = document.querySelector('.jd')
        jd_input.addEventListener('keyup', function () {
          // console.log('123456')
          if (this.value == '') {
            con.style.display = 'none'
          } else {
            con.style.display = 'block'
            con.innerText = this.value
          }
        })
        //当我们失去焦点就影藏这个从盒子
        jd_input.addEventListener('blur', function () {
          con.style.display = 'none'
        })
        // 当我们获取焦点就影藏这个从盒子
        jd_input.addEventListener('focus', function () {
          if (this.value == '') {
            con.style.display = 'none'
          } else {
            con.style.display = 'block'
          }
        })
      </script>
    

    展开全文
  • 基于人脸识别的口罩识别算法

    千次阅读 多人点赞 2021-05-12 14:56:47
    在许多的场景下人们都需要进行口罩的佩戴的,如果进行人工的检查将会浪费大量的人力,口罩识别某些方面更好的代替人力进行检测.虽然国内的疫情形势比较稳定,但是不排除境外输入的可能,因此在公共场合应该佩戴...
  • 第十章:面向对象分析(2)

    千次阅读 2022-03-28 16:16:15
    3、泛化关系 泛化关系和类找那个的泛化概念...像一个函数调用,以这种方式被使用的用例称为抽象用例,因为它不单独存在而必须被其他使用用例使用。图10.5用例之间的关系示意图 10.3建立对象模型 对象模型是面..
  • 模式识别介绍

    万次阅读 多人点赞 2020-10-31 20:38:52
    1.模式识别是什么? 作为人工智能的一个重要方向,模式...人脑具有很强的模式识别和推广能力,即使对于某种不同写法的“4”,以前虽未见过,也把它分到“4”所属的这一类别。人脑的这种对模式(事物、现象等)进行
  • 刚刚,清华大学的一条重大发现,利用人脸识别技术的漏洞,“ 15分钟解锁19个陌生智能国产手机 ”的事件,引发无数网友关注。 据悉,清华大学的RealAI 团队共选取了 20 款手机,其中1款是国外的,另外19款都是我们...
  • 手势识别 技术

    万次阅读 多人点赞 2019-04-19 16:02:27
    手势识别可以分为基于可穿戴设备的识别、基于触摸技术的识别和基于计算机视觉的识别。 一、基于可穿戴设备的识别 1、在手势交互过程中,可以直接采集每根手指的弯曲姿态,通过数据归一化和平滑处理两根手指之间...
  • 随着20世纪40年代计算机的出现以及50年代人工智能的兴起,人们当然也希望用计算机来代替或扩展人类的部分脑力劳动。(计算机)模式识别在20世纪60年代初迅速发展并成为一门新学科,是指对表征事物或现象的各种形式的...
  • 使用领域事件时,首先就是要对不同事件进行定义。 《领域驱动设计》并未给出领域事件的定义,因为该模型是在该书出版后才被提出。 当前对领域事件的定义:领域专家所关心的发生在领域中的一些事件。将领域中所发生的...
  • 一、人脸识别简介 1. 绪论 1.1 人脸识别的背景和意义 人脸是反应人身份的最直接的,最可靠的信息资源。通过人脸我们可以很快辨识一个人,这就是所谓的人脸识别。最初的人脸研究人员是一些从事社会心理学的工作者,从...
  • 人脸识别及数据流处理

    千次阅读 2020-08-20 20:17:45
    文章目录人脸识别及数据流处理1人脸识别1.1 基础简介1.1.1 人脸识别技术1.1.2 技术介绍1.2 原理1.3识别过程1.4 技术流程1.4.1 人脸图像采集及检测1.4.2 人脸图像预处理1.4.3 人脸图像特征提取1.4.4 人脸图像匹配与...
  • 《模式识别》期末考试考题汇总带答案

    万次阅读 多人点赞 2021-01-09 21:52:42
    样本(sample):所研究对象的一个个体。 样本集(sample set):若干样本的集合。 类或类别(class):在所有样本上定义的一个子集,处于同一类的样本在我们所关心的某种性质上是不可区分的,即具有相同的模式...
  • 基于STM32的嵌入式语音识别模块设计

    千次阅读 2020-12-21 01:16:44
    引言服务机器人以服务为目的,因此人们需要一种更方便、更自然、更加人性化的方式与机器人交互,而不再满足于复杂的键盘和按钮操作。基于听觉的人机交互是该...嵌入式语音识别系统和PC机的语音识别系统相比,虽然其...
  • 行人重识别(ReID) ——技术实现及应用场景

    万次阅读 多人点赞 2018-11-01 13:20:55
    跨镜追踪(Person Re-Identification,简称 ReID)技术是现在计算机视觉研究的热门方向,主要解决跨摄像头跨场景下行人的识别与检索。该技术能够根据行人的穿着、体态、发型等信息认知行人,与人脸识别结合能够适用...
  • 一文看懂人脸识别

    千次阅读 2019-05-29 10:46:11
    简要介绍人脸识别相关流程
  • Unit接入百度语音识别。 跟之前写过的接入讯飞语音识别一样,都要去官网下载对应的SDK 所以我们去官网下载SDK,大家都是聪明人 怎样获取SDK部分就不做过多介绍了,进入官网按照介绍。
  • 模式识别

    千次阅读 2019-06-04 21:53:52
    模式可以看作是对象的组成成分或影响因素间存在的规律性关系,或者是因素间存在确定性或随机性规律的对象、过程或事件的集合。 模式识别就是对模式的区分和认识,把对象根据其特征归到若干类别中适当的一类。 模式...
  • OpenCV图像识别技术介绍

    万次阅读 2021-12-26 14:41:37
    OpenCV图像识别技术介绍
  • 传统感烟式传感器探测时间长,不及时的将火灾信息传递给我们,并且检测精度低。因此,为了弥补传统的火灾检测系统的不足,降低火灾对我们的危害,要把对火灾的安全预防以及新型火灾检测系统的研究当做我们不懈追求...
  • 看了他的需求描述,大概是要做一个Java web版本的人脸识别功能,然后存储人物的特征,再扫脸比对。可是我不会啊。。。不过,作为一个宠粉的暖男,别说有困难就是没困难制造困难也要上,既然人家这么真诚的咨询,...
  • 事件事件抽取与事理图谱

    万次阅读 多人点赞 2019-01-04 23:06:04
    人类社会是一个静态事物进行动态活动所创造形成的世界,人类的命题记忆是以“事件”为存储单位的,存储的是组成事件的概念及其之间的关系以及事件及其之间的关系,以事件作为知识的基本单元更反映客观世界的知识,...
  • Linux内核中识别USB设备过程

    千次阅读 2019-09-28 21:50:24
    Usb设备种类很多,怎么一接入电脑就能识别出来?? Usb和pc设备都要遵守一些规范 当usb设备接入电脑后,pc会发送指令询问你是什么? Usb回复我是什么什么设备。 两人都要用一样的协议都要说中文 ...
  • 图像识别的工作原理是什么?商业上如何使用它?

    千次阅读 多人点赞 2020-01-09 17:02:36
    电子商务,汽车,医疗保健和游戏等不同领域的公司正在迅速采用图像识别。根据MarketsandMarkets的报告,图像识别市场分为硬件,软件和服务。以智能手机和扫描仪为主的硬件部分可以在图像识别市场的...
  • HarmonyOS之AI能力·语音识别技术

    万次阅读 2021-06-29 18:21:09
    语音识别技术,也称为自动语音识别(Automatic Speech Recognition, ASR),可以基于机器识别和理解,将语音信号转变为文本或命令。 语音识别支持的输入文件格式有 wav 或 pcm。 语音识别当前仅支持对普通话的识
  • 人脸识别研究

    千次阅读 2019-01-14 13:41:54
    一、发展史1、人脸识别的理解: 人脸识别(Face Recognition)是一种依据人的面部特征(如统计或几何特征等),自动进行身份识别的一种生物识别技术,又称为面像识别、人像识别、相貌识别、面孔识别、面部识别等。...
  • 基于图像识别的火灾检测系统设计

    千次阅读 多人点赞 2020-10-15 20:49:43
    传统感烟式传感器探测时间长,不及时的将火灾信息传递给我们,并且检测精度低。因此,为了弥补传统的火灾检测系统的不足,降低火灾对我们的危害,要把对火灾的安全预防以及新型火灾检测系统的研究当做我们不懈追求...
  • 软考(软件设计师)考点总结 -- 面向对象设计基础

    千次阅读 多人点赞 2021-05-21 17:31:21
    软考软件设计师考点总结 -- 面向对象基础:面向对象基本概念、面向对象的特性、分析、设计原则、设计模式:创建型模式、结构型模式、行为型模式、UML基本概念、UML模型。
  • 语音识别api接口

    千次阅读 2020-10-27 18:00:05
    广告关闭2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品。未来,我们一起乘风破浪,创造无限可能。... 加上参数,也是404,程序调用也是404.....语音识别只支持中国大陆公有云地域。 操作步骤...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 130,859
精华内容 52,343
关键字:

不同对象能识别不同事件