精华内容
下载资源
问答
  • 事件分发机制是Android中的一个难点,但是现在很多人都在写关于Android事件分发机制的文章,并且讲的都很不错,很多人也基本明白了事件是首先一级一级向下分发(如果父View不拦截的话,即父View的...

      事件分发机制是Android中的一个难点,但是现在很多人都在写关于Android事件分发机制的文章,并且讲的都很不错,很多人也基本明白了事件是首先一级一级向下分发(如果父View不拦截的话,即父View的onInterceptTouchEvent方法返回false),交由子View去处理,然后子View再将事件的处理结果一级一级向上反馈,子View没有处理完(子View的onTouchEvent方法返回了false),那么事件又会向上传递给父View,交由父View进行处理。
      很多时候子View并不希望父View拦截事件,这时我们该怎么做能够阻止父View拦截事件呢?首先我们看下ViewGroup的dispatchTouchEvent方法的部分源码:

    // Check for interception.
    final boolean intercepted;
    if (actionMasked == MotionEvent.ACTION_DOWN
            || mFirstTouchTarget != null) {
        final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
        if (!disallowIntercept) {
            intercepted = onInterceptTouchEvent(ev);
            ev.setAction(action); // restore action in case it was changed
        } else {
            intercepted = false;
        }
    } else {
        // There are no touch targets and this action is not an initial down
        // so this view group continues to intercept touches.
        intercepted = true;
    }

      从源码中我们可以看到这一句:
    final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
    首先我们可以看到mGrouipFlag的声明protected int mGroupFlags;它并没有被赋值,因此默认为0,而FLAG_DISALLOW_INTERCEPT默认为0x80000,因此默认情况下(mGroupFlags & FLAG_DISALLOW_INTERCEPT) = 0,所以disallowIntercept为false,!disallowIntercept就为true了,因此代码接着向下执行intercepted = onInterceptTouchEvent(ev);即我们的父View会默认执行拦截事件。那我们怎么能够让父View默认不执行拦截事件呢,我们很多人都知道调用requestDisallowInterceptTouchEvent(true)方法就能够阻止父View拦截事件。那么为什么呢,接下来我们就从源码的角度来讲解这一句到底做了什么让父View就不拦截事件了,我们采用逆推的方法来说明。
      要想让dispatchTouchEvent方法中intercepted = onInterceptTouchEvent(ev);这一句不执行,必须的保证disallowIntercept 为 true,即(mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;成立,现在我们就只要证明为什么(mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;一定成立,接着我们就要看requestDisallowInterceptTouchEvent()方法的源码了:

    /**
     * {@inheritDoc}
     */
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
        if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
            // We're already in this state, assume our ancestors are too
            return;
        }
    
        if (disallowIntercept) {
            mGroupFlags |= FLAG_DISALLOW_INTERCEPT;
        } else {
            mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
        }
    
        // Pass it up to our parent
        if (mParent != null) {
            mParent.requestDisallowInterceptTouchEvent(disallowIntercept);
        }
    }

    我们设置了参数disallowIntercept 为 true,首先我们看到该方法中的第一个判断

    if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
            // We're already in this state, assume our ancestors are too
            return;
        }

    1、假设(mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0) 为 true,此时if语句的条件成立,然后就return了,接着回到dispatchTouchEvent方法中,父View不拦截事件的要求就是要保证(mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;明显成立,所以父View将不会拦截事件。
    2、假设(mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0) 为 false,因为disallowIntercept为true,因此会接着向下执行mGroupFlags |= FLAG_DISALLOW_INTERCEPT;即mGroupFlags = mGroupFlags | FLAG_DISALLOW_INTERCEPT;,然后我们回到dispatchTouchEvent方法中,父View不拦截事件的要求是要保证(mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;即(mGroupFlags | FLAG_DISALLOW_INTERCEPT & FLAG_DISALLOW_INTERCEPT) != 0成立,而这个又等价于 FLAG_DISALLOW_INTERCEPT != 0,显然FLAG_DISALLOW_INTERCEPT是不等于0的,所以条件成立,父View不会拦截事件。
      至于为什么(mGroupFlags | FLAG_DISALLOW_INTERCEPT & FLAG_DISALLOW_INTERCEPT) != 0等价于FLAG_DISALLOW_INTERCEPT != 0,即为什么a | b & b = b,有兴趣的同学可以去了解java逻辑运算相关的知识。

    展开全文
  • 委派事件

    2021-05-02 11:42:06
    在看代码之前,我们先来了解一下什么事件委派。 事件委派的定义就是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。 换句话说,就是把一个本来让下属干的事情交给上司做了。 ...

    利用事件委派完成背景图片的切换

    在看代码之前,我们先来了解一下什么叫事件委派。

     

    事件委派的定义就是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。

     

    换句话说,就是把一个本来让下属干的事情交给上司做了。

     

    比如说,鼠标点击事件,本来页面上有很多的鼠标点击事件,需要一个个的去写实现函数,但是如果你把鼠标点击事件交个上司来完成,那么就是你鼠标点击那里的时候,就相当于上司找对应的下属来完成此事件,而不像前面的一个个的去找实现函数。

    这里我写的代码是关于事件委派完成背景图切换

     

    效果代码就是关于事件对象兼容问题并且实现图片切换

     

     

     

    最终的效果就是点击图片换背景

     

    事件委派适用于未来的元素(动态添加的元素)。

    利用事件冒泡,将后代元素上事件的处理程序委派给祖先元素。

    event.target || event.srcElement - 在事件传播的过程中,获取最初触发事件的事件源元素

     

     

    生成一个click事件传递给

    来处理

    由于没有事件处理函数直接绑定在 <divgt; 上,所以事件冒泡到DOM树上

    事件不断冒泡一直到DOM树的根节点,默认情况下上面绑定了这个特殊的事件处理函数。

    执行由 .live() 绑定的特殊的 click 事件处理函数。

    这个事件处理函数首先检测事件对象的 target 来确定是不是需要继续。这个测试是通过检测 $(event.target).closest('.clickme') 能否找到匹配的元素来实现的。

    如果找到了匹配的元素,那么调用原始的事件处理函数。

    由于只有在事件发生时才会在上面的第五步里做测试,因此在任何时候添加的元素都能够响应这个事件。

    附加说明

     

    .live() 虽然很有用,但由于其特殊的实现方式,所以不能简单的在任何情况下替换 .bind()。主要的不同有:

     

    在jQuery 1.4中,.live()方法支持自定义事件,也支持所有的 JavaScript 事件。在jQuery 1.4.1中,甚至也支持 focus 和 blue 事件了(映射到更合适,并且可以冒泡的focusin和focusout上)。另外,在jQuery 1.4.1中,也能支持hover(映射到"mouseenter mouseleave")。然而在jQuery 1.3.x中,只支持支持的JavaScript事件和自定义事件:click, dblclick, keydown, keypress, keyup, mousedown, mousemove, mouseout, mouseover, 和 mouseup.

    .live() 并不完全支持通过DOM遍历的方法找到的元素。取而代之的是,应当总是在一个选择器后面直接使用 .live() 方法,正如前面例子里提到的。

    当一个事件处理函数用 .live() 绑定后,要停止执行其他的事件处理函数,那么这个函数必须返回 false。 仅仅调用 .stopPropagation() 无法实现这个目的。

    展开全文
  • 事件与事件处理 什么是事件? 事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了。...说白了,事件是文档或浏览器中发生的特定...

    事件与事件处理

    什么是事件?
    事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了。

    事件可能是用户在某些内容上的点击、鼠标经过某个特定元素或按下键盘上的某些按键,事件还可能是Web浏览器中发生的事情,比如说某个Web页面加载完成,或者是用户滚动窗口或改变窗口大小。说白了,事件是文档或浏览器中发生的特定交互瞬间!

    通过使用JavaScript,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应。

    一、常用事件

    onabort: 对象载入被中断时触发;
    onblur: 元素或窗口本身失去焦点时触发;
    onchange: 改变元素中的选项或其他表单元素失去焦点,并且在其获取焦点后内容发生改变时触发;
    onerror: 出现任何错误时触发;
    onfocus: 任何元素或窗口本身获得焦点时触发;
    onkeydown: 键盘键(包括shift alt等)被按下时触发;
    onkeypress: 键盘被按下并产生一个字符时触发,也就是说按下shit、alt等不会触发;
    onkeyup: 释放键盘上的按键时触发;
    onload: 页面完全载入后触发;
    onunload: 页面完全卸载后触发;
    onclick: 点击鼠标左键时触发,当光标的焦点在按钮上并按enter按键时也会触发;
    ondblclick: 双击鼠标左键时触发;
    onmousedown: 单击任何一个鼠标按键时触发;
    onmousemove: 鼠标在某个元素上移动时持续触发;
    onmouseout: 鼠标从制定的元素上移开时触发;
    onmouseover: 鼠标移到某个元素上时触发;
    onmouseup: 释放任意一个鼠标按键时触发;
    onreset: 单击重置按钮时,在上触发;
    onresize: 窗口或框架的大小发生改变时触发;
    onscroll: 在任何带滚动条的元素或窗口上滚动时触发;
    onselect: 选中文本时触发;
    onsubmit: 单击提交按钮时触发,在上触发

    二、事件处理

    1、在js中事件处理的过程分为三步:

    1.发生事件

    2.启动事件处理程序

    3.事件处理程序做出反应

    2、事件处理程序的调用

    1.在javascript中

    在javascript中调用事件处理程序,首先要获得要处理对象的引用,然后将要执行的处理函数赋值给对应的事件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>时间处理</title>
    </head>
    <body>
    <input type="button" name="save" value="保存" id="saveId" >
    <script type="text/javascript">
        var btSave=document.getElementById('saveId');
        btSave.οnclick=function () {
            alert("保存按钮被点击");
        }
    </script>
    </body>
    </html>
    
    

    2.在html中

    在html中分配事件处理程序,只需要在html标记中添加相应的事件,并在其中指定要执行的代码或函数名即可

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>时间处理</title>
    </head>
    <body>
    <input type="button" name="save" value="保存" id="saveId" onclick="save()">
    <script type="text/javascript">
        function save() {
            alert("保存按钮被点击");
        }
    </script>
    </body>
    </html>
    

    3.DOM事件模型

    DOM结构是一个树形结构,当一个HTML元素产生一个事件时,该事件会在元素节点与根节点直接的路径传播,路径所经过的节点都会收到该事件,这个传播过程可称为DOM事件流

    1)DOM0级事件处理程序

    <input id="btn" value="按钮" type="button">
    <script>
       var btn= document.getElementById("btn");
       btn.onclick=function(){
          alert("DOM级添加事件处理");
        } 
        btn.onclick=null;//如果想要删除btn的点击事件,将其置为null即可
    </script>
    

    2)DOM2级事件处理程序
    DOM2也是对特定的对象添加事件处理程序,但是主要涉及到两个方法,用于处理指定和删除事件处理程序的操作:

    addEventListener()和removeEventListener()。它们都接收三个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值(是否在捕获阶段处理事件)

    <input id="btn" value="按钮" type="button">
    <script>
     var btn=document.getElementById("btn");
      btn.addEventListener("click",showmsg,false);
      //这里我们把最后一个值置为false,即不在捕获阶段处理,一般来说冒泡处
    理在各浏览器中兼容性较好
      function showmsg(){
     	 alert("DOM级添加事件处理程序");
      }
      btn.removeEventListener("click",showmsg,false);
      //如果想要把这个事件删除,只需要传入同样的参数即可
    </script>
    

    三、DOM高级事件处理

    1、注册事件

    1)传统方式 事件源.事件类型=事件处理 // btn.οnclick=function(){}
    唯一性

    2)方法监听注册方式
    addEventListener() IE9之前的IE不支持 用attachEvent()
    事件监听注册addEventListener里面的事件类型是字符串 必定加引号 而且不带on
    btn.addEventListener(‘click’,function() {
    方法
    })

    2、删除事件的方式
    removeEventListener

    <body>
    <div id="myDIV">
      <p>删除 div删除 div删除 div删除 div删除 div删除 div删除 div删除 div </p>
      <button onclick="removeHandler()" id="myBtn">删除</button>
    </div>
    <p id="demo"></p>
    
    <script>
    document.getElementById("myDIV").addEventListener("mousemove", myFunction);
    function myFunction() {
      document.getElementById("demo").innerHTML = Math.random();
    }
    function removeHandler() {
      document.getElementById("myDIV").removeEventListener("mousemove", myFunction);
    }
    </script>
    </body>
    

    3、Dom的事件流
    事件流描叙的是从页面中接收事件的顺序
    事件发生会在元素的节点之间按照特定的顺序传播,这个传播过程即为DOM事件流

    4、事件流分为3个事件
    1)捕获阶段
    2)当前目标阶段
    3)冒泡阶段

    5、 事件对象
    常见的事件对象属性和方法
    e.target
    e.srcElement
    e.type

    展开全文
  • 事件绑定与事件委托机制 事件绑定顾名思义则在元素标签上绑定相应的...来帮助初学者彻底了解什么是事件绑定与委托。 结构层(HTML) <ul calss="parent">  <li class="child"></li>  ...

    事件绑定与事件委托机制

    事件绑定顾名思义则是在元素标签上绑定相应的行为事件。事件委托也就是说,自身元素的行为事件交由其他父类元素去监管实现。具体js代码我们可以看下面代码实现,

    来帮助初学者彻底了解什么是事件绑定与委托。

     

    结构层(HTML)

    <ul calss="parent">

      <li class="child"></li>

      <li class="child"></li>

      <li class="child"></li>

      <li class="child"></li>

    </ul>

    行为层(JavaScript 本文采用ES5标准编写)

    (function(){ 

    //简单的事件委托工具,未考虑IE6下的兼容性,仅供理解委托事物

    window.EventUtil = {
      hadelrs:{},
        on:function(dom,dom1,event,fn){
        //判断是否存在委托,不存在则创建一个dom1的委托事件函数池
        if(this.hadelrs[dom1] ){
          this.hadelrs[dom1] .push(fn);
        } else {
          this.hadelrs[dom1] = [fn];
        } 
        //监听受委托的dom根据对应的事件触发对象,来触发dom1事件函数
        document.querySelector(dom).addEventListener(event, function(evn){
          //判断 事件触发是否来源于委托 元素dom1
          if(evn.target == document.querySelector(dom1)) {
            for(var i in EventUtil.hadelrs[dom1]){
              try {
                EventUtil.hadelrs[dom1][i](event); //执行事件函数
              } catch(err){
                console.warn(err);
              }
            }
          }
        })
      },
      off: function(dom1,fn){
        if(EventUtil.hadelrs[dom1]){
          for(var i in EventUtil.hadelrs[dom1]){
            if(EventUtil.hadelrs[dom1][i] == fn){
              EventUtil.hadelrs[dom1].splice(i,1);  //事件函数池移除事件
              breack;
            }
         }
        }
      }
    }}())
     
    //调用实现
    EventUtil.on('.parent','.parent li',click,function(e){console.log('----------li--------')})
     

    转载于:https://www.cnblogs.com/zerox-cn/p/6074496.html

    展开全文
  • 近期互联网行业比较重要事件就是拼多多平台优惠券漏洞被盗取几千万元,武汉新闻的小李和多位电商平台的技术人员沟通了解到,这个漏洞很平常的Bug没什么特殊的,而且其他的电商平台也有这样的BUG,难免遭到黑色产业...
  • 事件委托和jQuery事件绑定

    千次阅读 2016-02-17 20:01:44
    什么是事件委托?用现实中的理解就是:100个学生在同一天的中午都要收取快递,这100个学生难道都会在门口等着么?不会,他们会委托门卫代收,然后门卫再逐个将包裹到学生手中。在jQuery中我们会通过事件冒泡的特性,...
  • 什么是MVC

    2012-06-11 16:16:13
    什么是MVC MVC 一种设计模式,它将应用划分为3 个部分:数据(模型)、展现层(视图)和用 户交互层(控制器)。换句话说,一个事件的发生这样的过程: 1. 用户和应用产生...
  • 行为事件分析

    千次阅读 2018-09-25 20:46:35
    在用户行为领域,通过数据分析方法的科学应用,经过理论推导,能够相对完整地揭示用户...一、什么是行为事件分析? 行为事件分析法来研究某行为事件的发生对企业组织价值的影响以及影响程度。企业借此来追踪或记录...
  • 随机事件的概率

    2019-03-04 23:09:00
    前言 一、廓清认知 频率与概率 频率概率的近似值,概率频率的稳定值。 为什么学习事件的关系和事件的运算 包含关系\(A\subseteq C\);...积事件(交事件):\(AB\)或\(A\bigcap B\) 以上内容可以借助集...
  • JS的事件委托

    2019-06-06 10:49:00
    什么是js事件委托,首先从词语上理解。事件:js的事件有一大堆,比如mouseup、mouseenter和click等等事件 。 委托:把事情托付给别人或别的机构办理。 所以JS事件委托算是以冒泡的原理来做的。 事件委托的好处: ...
  • 2、交叉事件测试:又叫事件或冲突测试,指一个功能正在执行过程中,同时另外一个事件或操作对该过程进行干扰的测试。例如通话过程中接收到短信或闹铃触发,应用软件运行过程中插拔充电器等。执行干扰的冲突事件不...
  • Android事件分发浅析

    2018-05-10 22:22:55
    什么是事件分发? 大家知道Android中的视图由一个个View嵌套构成的层级视图,即一个View里包含有子View,而这个子View里面又可以再添加View。当用户触摸屏幕产生一系列事件时,事件会由高到低,由外向内依次传递...
  • .ssover dose)NIH-PC表选用的交叉剂量为116cGy照射因子F(D)=D+D2/116B.9概率(probability):某随机事件发生的可能性当对随机事件进行重复观察的次数够多时该事件发生的频率其概率的近似值B.10病因概率...
  • 关注西安奔驰事件的人都会发现,其中提到了汽车的PDI检测,那么到底什么是PDI检测呢?PDI全拼为Pre Delivery Inspection,说的明白点就是4S点将车辆到客户手中之前,要对车辆进行全面检查,并调整到正常的状态。...
  • 关于事件的理解

    2010-12-09 23:40:49
    在我们常用的情况是事件的发送者发出事件,并且自己来监听事件。但也可以自己发出的事件交由其他对象来处理,也就是说向其他对象传递了消息。  具体参看下面的例子:  package { import flash.display.Sprite...
  • 事件分发机制原理及其分析

    千次阅读 2018-11-08 11:12:42
    先给大家讲讲什么是事件分发? 大家知道Android中的视图由一个个View嵌套构成的层级视图,即一个View里包含有子View,而这个子View里面又可以再添加View。当用户触摸屏幕产生一系列事件时,事件会由高到低,由...
  • View事件分发情况总结

    2016-12-20 09:49:35
    View事件分发情况总结看了事件分发的文章,但是几天不用就要忘,时常忘了为什么事件会这样分发,记录一下开发中遇到的情况。1.ViewGroup 默认不拦截事件,如果子控件在ACTION_DOWN返回true,则剩余事件由子控件...
  • javascript 中的事件处理词汇:事件 event 事件处理 event handling内容:事件是js程序的心脏。下面我将要讲述什么是event handling,他存在什么问题,以及如何书写跨浏览器的脚本。可以说没有event 就没有 Js.网上的...
  • 什么是事件分发? 大家知道Android中的视图由一个个View嵌套构成的层级视图,即一个View里包含有子View,而这个子View里面又可以再添加View。当用户触摸屏幕产生一系列事件时,事件会由高到低,由外向内依次传递...
  • 首先我们要搞明白,什么是事件分发?Android中的视图由一个个View嵌套构成的层级视图,即一个View里包含有子View,而这个子View里面又可以再添加View。当用户触摸屏幕产生一系列事件时,事件会由高到低,由外向内...
  • 事件委托前端面试的经典面试题型,上次面试给我整的一脸懵逼,好尴尬。准备找工作的小伙伴赶紧学习学习,也许会对你有帮助。 时间委托原理 事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以...
  • wxpython编程之 事件处理原理

    千次阅读 2009-04-13 20:02:00
    原文出自:...在这章中我们将讨论什么是事件驱动应用程序,它与传统的应用程序有什么不同。我们将对在GUI编程中所使用的概念和术语提供一些介绍,包括与用户
  • 事实上,平台杀熟已经不是个例了,前有某猫会员杀熟事件,后有某猪酒店价格杀熟事件,现在又爆出了外卖平台杀熟,可见大数据的渗透面积之广。 在互联网时代,每个人的信息通过网络交叉连接,数据在后台可视的,而...
  • 最近这段时间因为每天要修改网站,为网站做特效,所以看了很多的js接触事件,自己只会使用一小...事件(Event)JavaScript应用跳动的心脏,也把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的...
  • 穿透图片响应下层image事件

    千次阅读 2016-07-05 17:15:56
    在做绚丽的界面的时候经常会用到不规则的图片,而我们美工给的图片一般都方形的图片,在...如果我们要解决这个问题就需要我们清晰的了解事件的发生和传递怎么一个流程。为什么我们点击一个按钮,只有这个按钮会触发
  • 事件委托在C#的实现

    2004-08-17 15:35:00
    对象中触发了某个事件,但是,这个对象却并不处理这个事件(原因可能这个对象并不关心这个事件等),而由其他对象来进行处理。 这个就叫事件委托。 举例: 例如一个搜索页面,有两个用户控件,一个用于搜索...
  • H5是什么,具体包括哪些内容H5本指第5代html标准规范,但因为html5规则对视频音频和触屏互动等事件的支持远超前代,因此H5逐渐演变成一种可以在移动端展示的动态页面。现有的H5包括普通的幻灯片形式、需要简单点击的...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 235
精华内容 94
关键字:

交事件是什么