精华内容
下载资源
问答
  • 一直想写一下自己对事件分发是总结的,但是又不知道从何写起。那我们就先从一个一个案例,再到源码一步步深入总结。 案例 案例一: btn_click = (Button) findViewById(R.id.btn_click); btn_click....

    一直想写一下自己对事件分发是总结的,但是又不知道从何写起。那我们就先从一个一个案例,再到源码一步步深入总结。

    案例

    案例一:

      btn_click = (Button) findViewById(R.id.btn_click);
            btn_click.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("TAG","点击事件OnClick");
                }
            });
            btn_click.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
    
                    Log.i("TAG","点击事件OnTouch");
    
                    return false;
                }
            });

    我们先从一个按钮的点击与触摸事件开始,我们现在来猜一下,我们点击按钮打印一个,还是会打印两个呢?

    如果setOnTouchListener返回true 的时候呢?

    我们可以看到,当setOnTouchListener返回true 的时候,我们的点击事件里边的语句并没有执行,返回false的时候,才会执行。这是为什么呢?

    我们可以看到在View的事件分发处理dispatchTouchEvent(MotionEvent event)里边,当setOnTouchListener返回true的时候,有个result的变量值为true,如果值为true,那么在接下来的流程里边onTouchEvent(event)方法将不会执行,我们会在onTouchEvent(event)中找到这么一个方法performClickInternal(),然后再不断的往下追寻,你就会发现这样一段代码

     final boolean result;
            final ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnClickListener != null) {
                playSoundEffect(SoundEffectConstants.CLICK);
                li.mOnClickListener.onClick(this);
                result = true;
            } else {
                result = false;
            }

    所以这个时候,我们可以明白当返回false的时候OnClickListener会执行打印语句,返回false的时候为什么不执行了吧。这个时候又让我想起了事件冲突的定义:事件只有一个,有多个方法想要处理。处理的对象不是我们想给的,这个时候我们就叫事件冲突。

    案例二:

    了解了事件冲突,那么我们接下来就开始了解事件分发了。

    Activity:

    public class EventDemoOneActivity extends AppCompatActivity {
    
    
        private EventViewB ev_b;
        private EventViewGroupA evg_a;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_event_demo_one);
            initView();
        }
    
        private void initView() {
            ev_b = (EventViewB) findViewById(R.id.ev_b);
            evg_a = (EventViewGroupA) findViewById(R.id.evg_a);
        }
    
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
    
            Log.i("TAG","...........................dispatchTouchEvent..............Activity");
    
            return super.dispatchTouchEvent(ev);
        }
    
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            Log.i("TAG","...........................onTouchEvent..............Activity");
    
            return super.onTouchEvent(event);
        }
    }

    ViewGroup:

    /**
     * 版本:1.0
     * 创建日期:2/23/21 10:21 AM
     * 描述:
     */
    public class EventViewGroupA extends LinearLayout {
        public EventViewGroupA(Context context) {
            super(context);
        }
    
        public EventViewGroupA(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
    
            Log.i("TAG","...........................dispatchTouchEvent..............EventViewGroupA");
    
            return super.dispatchTouchEvent(ev);
    
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
    
            Log.i("TAG","...........................onInterceptTouchEvent..............EventViewGroupA");
    
            return super.onInterceptTouchEvent(ev);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            Log.i("TAG","...........................onTouchEvent..............EventViewGroupA");
    
            return true;
        }
    }
    

    View:

    /**
     * 版本:1.0
     * 创建日期:2/23/21 10:35 AM
     * 描述:
     */
    public class EventViewB extends View {
    
    
        public EventViewB(Context context) {
            super(context);
        }
    
        public EventViewB(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
    
            Log.i("TAG","...........................dispatchTouchEvent..............ViewB");
    
            return super.dispatchTouchEvent(event);
        }
    
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            Log.i("TAG","...........................onTouchEvent..............ViewB");
    
            return super.onTouchEvent(event);
        }
    }

    1.事件分发过程由dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()三个方法协助完成
    2.Android事件分发顺序:Activity(Window) -> ViewGroup -> View
    3.在事件分发三大类(Activity、ViewGroup、View)中,Activity和View不会去拦截事件(也就是不能重写onInterceptTouchEvent()方法)
    跑起来

    我们再结合事件分发流程图来看

    1.dispatchTouchEvent 和 onTouchEvent 一旦return true,事件就停止传递了(到达终点)(没有谁能再收到这个事件)。看图中只要return true事件就没再继续传下去了,对于return true我们经常说事件被消费了,消费了的意思就是事件走到这里就是终点,不会往下传,没有谁能再收到这个事件了。

    2.dispatchTouchEvent 和 onTouchEvent方法在return false的时候事件都回传给父控件的onTouchEvent处理。

    • 对于dispatchTouchEvent 返回 false 的含义应该是:事件停止往子View传递和分发同时开始往父控件回溯(父控件的onTouchEvent开始从下往上回传直到某个onTouchEvent return true),事件分发机制就像递归,return false 的意义就是递归停止然后开始回溯。
    • 对于onTouchEvent return false 就比较简单了,它就是不消费事件,并让事件继续往父控件的方向从下往上流动。

    3.onInterceptTouchEvent 的作用

    • onInterceptTouchEvent方法中 return true就会交给自己的onTouchEvent的处理,如果不拦截就是继续往子控件往下传。默认是不会去拦截的,因为子View也需要这个事件,所以onInterceptTouchEvent拦截器return super.onInterceptTouchEvent()和return false是一样的,是不会拦截的,事件会继续往子View的dispatchTouchEvent传递。

    案例三

    ViewPager:

    /**
     * 版本:1.0
     * 创建日期:5/9/21 9:35 PM
     * 描述:
     */
    public class BadViewPager extends ViewPager {
    
    
        private int mLastX,mLastY;
    
    
        public BadViewPager(@NonNull Context context) {
            super(context);
        }
    
        public BadViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            return true;
        }
    }
    

    ListView:

    /**
     * 版本:1.0
     * 创建日期:5/9/21 9:37 PM
     * 描述:
     */
    public class MyListView extends ListView {
    
        public MyListView(Context context) {
            super(context);
        }
    
        public MyListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        
    
    }

    Activity:

    public class ListViewAndViewPagerActivity extends AppCompatActivity {
    
    
        private BadViewPager bad_view_pager;
        private MyPagerAdapter myPagerAdapter;
        private int[] iv = new int[]{R.mipmap.iv_0, R.mipmap.iv_1, R.mipmap.iv_2,
                R.mipmap.iv_3, R.mipmap.iv_4, R.mipmap.iv_5,
                R.mipmap.iv_6, R.mipmap.iv_7, R.mipmap.iv_8};
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_list_view_and_view_pager);
            initView();
        }
    
        private void initView() {
            bad_view_pager = (BadViewPager) findViewById(R.id.bad_view_pager);
    
    
            List<Map<String, Integer>> strings = new ArrayList<>();
    
            Map<String, Integer> map;
    
            for (int i = 0; i < 20; i++) {
                map = new HashMap<>();
                map.put("key", iv[i % 9]);
                strings.add(map);
            }
    
            MyPagerAdapter adapter = new MyPagerAdapter(this, strings);
            bad_view_pager.setAdapter(adapter);
    
        }
    }

    当ViewPager返回true 无法上下滑动,当ViewPager返回false 无法左右滑动,如果把 onInterceptTouchEvent(MotionEvent ev) 都注释掉,那么上下左右滑动正常。这是因为谷歌工程师已经给我们在源码里边进行处理了。加入谷歌工程师并没有处理,那我们应该怎么做呢?

    我们先来看事件分发流程图

    ViewGroup的事件分发:

    在ViewGroup的 boolean dispatchTouchEvent(MotionEvent ev) 中,当为Down事件的时候,会调用cancelAndClearTouchTargets(ev); resetTouchState();对状态进行清零。

    清零后,会进入如下,进行判断时间是否拦截:

    如果不拦截,进行分发,就会进入如下代码,进行分发或者处理:

    在代码中,我可以看到,如果是down事件,才会分发。

    里边有个方法是对子View进行排序

    分发判断是进行倒序排序的,并判断能否接收事件:1、VISIBLE 2、child.getAnimation()!=null 3、触点在View的范围内。

    进入分发处理事件,第三个参入传入的触点处的view

    如果是ViewGroup就走ViewGroup的 dispatchTouchEvent,如果是View就走View的事件分发事件。(这个属于递归事件)

     

    如果全部不处理,就跟拦截是一样的。

     

     

     

     

     

     

     

    如果拦截,if (!canceled && !intercepted) 将进不去,直接走到下边(分发或者处理),事件到底处不处理,相当于是最后一个:

    首先,第一次mFirstTouchTarget肯定为空,dispatchTransformedTouchEvent这个方法就是处理;

    这个时候是最后一个,子View为空 。

    所以,分发的最终又回到了View 的 dispatchTouchEvent(MotionEvent event),也就是回到了我们前边的案例一事件处理中

    所以,当Viewpager拦截的时候,ListView是无法处理事件,所以没办法上下滑动。

    @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            return true;
        }

    为true 就没办法事件分发。

    我们再来看看move事件,move不会再走分发

     

    总结:

    ViewGroup需要先走分发流程,如果没人处理,就再走处理流程;View只能走处理流程

    分发流程:1、先看是否拦截后自己处理  2、分发下去:排序、遍历分发、领取View的处理事件。3、没人处理,再看下自己是否处理事件;

    move事件不会再走分发事件

    那么我们应该怎么处理事件冲突?

    1、内部拦截法,子View处理事件分发

    View:

    /**
     * 版本:1.0
     * 创建日期:5/9/21 9:37 PM
     * 描述:
     */
    public class MyListView extends ListView {
    
        public MyListView(Context context) {
            super(context);
        }
    
        public MyListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        // 内部拦截法:子view处理事件冲突
        private int mLastX, mLastY;
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    getParent().requestDisallowInterceptTouchEvent(true);
                    break;
                }
                case MotionEvent.ACTION_MOVE: {
                    int deltaX = x - mLastX;
                    int deltaY = y - mLastY;
                    if (Math.abs(deltaX) > Math.abs(deltaY)) {
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    break;
    
                }
                default:
                    break;
            }
    
            mLastX = x;
            mLastY = y;
            return super.dispatchTouchEvent(event);
        }
    
    }

    Viewpager:(当它为Down事件的时候不拦截)

    public class BadViewPager extends ViewPager {
    
    
        private int mLastX,mLastY;
    
    
        public BadViewPager(@NonNull Context context) {
            super(context);
        }
    
        public BadViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
    
            if (ev.getAction()==MotionEvent.ACTION_DOWN){
                super.onInterceptTouchEvent(ev);
                return false;
            }
    
            return true;
        }
    }
    

    2、外部拦截法,是父容器处理冲突

    Listview:

    
    /**
     * 版本:1.0
     * 创建日期:5/9/21 9:37 PM
     * 描述:
     */
    public class MyListView extends ListView {
    
        public MyListView(Context context) {
            super(context);
        }
    
        public MyListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        
    }
    

    ViewPager:

    /**
     * 版本:1.0
     * 创建日期:5/9/21 9:35 PM
     * 描述:
     */
    public class BadViewPager extends ViewPager {
    
    
        private int mLastX,mLastY;
    
    
        public BadViewPager(@NonNull Context context) {
            super(context);
        }
    
        public BadViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
    
    
            int x = (int) event.getX();
            int y = (int) event.getY();
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    mLastX = (int) event.getX();
                    mLastY = (int) event.getY();
                    break;
                }
                case MotionEvent.ACTION_MOVE: {
                    int deltaX = x - mLastX;
                    int deltaY = y - mLastY;
                    if (Math.abs(deltaX) > Math.abs(deltaY)) {
                        return true;
                    }
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    break;
                }
                default:
                    break;
            }
    
            return super.onInterceptTouchEvent(event);
    
        }
    }
    

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 1.MotionEvent事件类型有哪些呢? ACTION_DOWN 手指首次触摸到屏幕时触发 ACTION_UP 手指离开屏幕时触发 ACTION_CANCEL 事件被上层拦截时触发!!! ACTION_MOVE 手指在屏幕上滑动时触发,会多次触发 2.需特别关注...

    一、预备知识

    1.MotionEvent事件类型有哪些呢?

    ACTION_DOWN 手指首次触摸到屏幕时触发
    ACTION_UP 手指离开屏幕时触发
    ACTION_CANCEL 事件被上层拦截时触发!!!
    ACTION_MOVE 手指在屏幕上滑动时触发,会多次触发
    

    2.需特别关注的view的事件有哪些呢?

    dispatchTouchEvent 用于事件分发或事件处理
    【对于ViewGroup要先走分发流程,再走处理流程;对于View,只能走处理流程】
    
    onInterceptTouchEvent 用于事件拦截
    【返回true,代表拦截了不会分发下去;返回false,代表不拦截会分发下去】
    
    onTouchEvent用于事件消费
    

    3.setOnClickListener和setOnTouchListener特殊案例讲解下?

     btnClick.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.e(TAG, "onClick");
                }
            });
    
            btnClick.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    Log.e(TAG, "onTouch: " + event.getAction());
                    return false;
                }
            });
    

    特别注意,当setOnTouchListener返回true时,log onClick不会打印;setOnTouchListener返回false时,log onClick 和onTouch 正常打印。
    这是为什么呢?setOnTouchListener的返回值是如何影响到setOnClickListener的执行的?
    我们来看看View的处理流程:
    当执行到View,并且这个View准备处理时就会执行View的dispatchTouchEvent,如下图:
    在这里插入图片描述
    执行dispatchTouchEvent一进来就会走onTouch,看onTouch是否执行。(onTouch执行的唯一条件,就是 看我们的代码里有没有写setOnTouchListener,如果写了的话,并且clickable=true,那么onTouch就能执行,onTouch执行后还需要看返回值,如果返回值为false,setOnClickListener也写了,那就能执行,没写就不能执行)。
    所以:
    当满足这两个条件【1.有setOnTouchListener 2.clickable=true 】onTouch可以执行;
    当满足这两个条件【1.onTouch返回值为false 2.有setOnClickListener 】setOnTouchListener的onTouch()和setOnClickListener的onClick会执行;
    当onTouch返回值为true,setOnTouchListener的onTouch()执行、setOnClickListener的onClick不执行;

    二、冲突解决

    1.什么是事件冲突呢?

    当一个事件,对应有多个人想要去处理它?而如果处理的对象不是我们想要的对象,就叫发生了冲突。

    2.来一个案例分析下?

    有一个viewpaper和listview,存在上下滑动和左右滑动,两者会发生冲突?需要解决下:
    根据已有的知识,直接上解决方案:

    2.1.内部拦截法

    内部拦截法的思路是子View在dispatchTouchEvent方法中通过调用requestDisallowInterceptTouchEvent(true)方法,禁止父View拦截事件。并在合适的场景将其置为fase允许拦截。

    View:

    public class MyListView extends ListView {
    
        private int mLastX, mLastY;
    
        public MyListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    getParent().requestDisallowInterceptTouchEvent(true);
                    break;
                }
                case MotionEvent.ACTION_MOVE: {
                    int deltaX = x - mLastX;
                    int deltaY = y - mLastY;
                    //垂直滑动,还是由listview处理;水平滑动,由viewpaper处理
                    if (Math.abs(deltaX) > Math.abs(deltaY)) {
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    break;
    
                }
                default:
                    break;
            }
    
            mLastX = x;
            mLastY = y;
            return super.dispatchTouchEvent(event);
        }
    }
    
    

    viewpaper:

    public class BadViewPager extends ViewPager {
     
     
        private int mLastX,mLastY;
     
     
        public BadViewPager(@NonNull Context context) {
            super(context);
        }
     
        public BadViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
     
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
     
            if (ev.getAction()==MotionEvent.ACTION_DOWN){//当为down事件时,不拦截
                super.onInterceptTouchEvent(ev);
                return false;
            }
     
            return true;
        }
    }
    

    2.2.外部拦截法

    外部拦截法的思路是由父View通过重写onInterceptTouchEvent方法,在合适的场景拦截事件。
    viewPaper:

    public class BadViewPager extends ViewPager {
    
        private int mLastX, mLastY;
    
        public BadViewPager(@NonNull Context context) {
            super(context);
        }
    
        public BadViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        // 我想要把事件分发给谁就分发给谁
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            int x = (int) event.getX();
            int y = (int) event.getY();
    
            switch (event.getAction()) {
                //down事件时,不拦截
                case MotionEvent.ACTION_DOWN: {
                    mLastX = (int) event.getX();
                    mLastY = (int) event.getY();
                    break;
                }
                //move事件时,拦截
                case MotionEvent.ACTION_MOVE: {
                    int deltaX = x - mLastX;
                    int deltaY = y - mLastY;
                    if (Math.abs(deltaX) > Math.abs(deltaY)) {
                        return true;
                    }
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    break;
                }
                default:
                    break;
            }
    
            return super.onInterceptTouchEvent(event);
    
        }
    }
    
    

    view:

     
    public class MyListView extends ListView {
     
        public MyListView(Context context) {
            super(context);
        }
     
        public MyListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
     
        public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
     
        
    }
    

    以上两个方法,都能很好地处理滑动冲突,让左右滑动和上下滑动都顺畅。

    展开全文
  • 需求:echarts地图单击地图外的区域时,需要返回上一级。 地图需要放大时候进行拖拽,鼠标松开后,还是会返回上一级 <div id="parent" @click="closeMap" @mousedown="mousedown" > <...

    需求:echarts地图单击地图外的区域时,需要返回上一级。

    地图需要放大时候进行拖拽,鼠标松开后,还是会返回上一级

    <div id="parent"  @click="closeMap" @mousedown="mousedown" >
        <div v-if="!flagMap"  id="chartDs" ref="totalChart" style="width: 900px;height: 900px;margin-left:0;" ></div>
    </div>
    data() {
          return {
            firstTime: '', //开始时间
            lastTime: '', 
          }
    },
    methods: {
        mousedown(){
            this.firstTime = new Date().getTime();
          },
        closeMap() {
            this.lastTime = new Date().getTime();
            //>200毫秒
            if(this.lastTime - this.firstTime > 200){
              
            }else {
              //调用地图
              this.flagMap = true
              this.getChart3()
            }
            this.firstTime = ''
            this.lastTime  = ''
            
          }
    }

    打印出来:mousedown()方法先执行,closeMap()后执行

    展开全文
  • table行点击事件和操作栏事件冲突 1. 找到layui文件夹下table.js 2. 找到table.js代码: i.layBody.on("click", "*[lay-event]", function() { var e = t(this), a = e.parents("tr").eq(0).data("index")...

    table行点击事件和操作栏事件冲突

    1.	找到layui文件夹下table.js
    2.	找到table.js代码:
    			i.layBody.on("click", "*[lay-event]", function() {
    			var e = t(this),
    				a = e.parents("tr").eq(0).data("index");
    			layui.event.call(this, y, "tool(" + p + ")", v.call(this, {
    				event: e.attr("lay-event")
    			})), i.setThisRowChecked(a);
    3.修改为:
    				i.layBody.on("click", "*[lay-event]", function(event) {
    			var e = t(this),
    				a = e.parents("tr").eq(0).data("index");
    			layui.event.call(this, y, "tool(" + p + ")", v.call(this, {
    				event: e.attr("lay-event")
    			})), i.setThisRowChecked(a);layui.stope(event);//阻止冒泡
    
    展开全文
  • LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) { @Override public boolean canScrollHorizontally() { //连读时... 使用LinearLayoutManager 管理点击事件
  • 原因:其实这是事件间的执行优先级问题,blur的优先级比click高,所以blur事件先执行了且把列表隐藏了,列表就没有触发click事件咯 解决方法: 1、改用其他事件优先级可以比blur高的事件 2、使用setTimeout延时器 ...
  • JS: openWin() { // 解决鼠标拖拽与点击事件冲突 const isDrag = this.$refs.helpControl.getAttribute('drag-flag'); if (isDrag === 'true') { return false; } this.setIsOpenDocWin(true); }, // 拖拽监听鼠标...
  • //设备号失焦事件 blurInput(){ setTimeout(() => { this.isShowAuto = false },100) }, ②可以把点击事件修改成@mousedown鼠标按下事件(推荐这样解决) <div v-show="isShowAuto" class="auto"> &...
  • document.onmousemove = (e1) => { //解决onmouseup事件有时候不触发 if ( e1.stopPropagation ) { e1.stopPropagation() } if ( e1.preventDefault ) { e1.preventDefault() } let left...
  • 如图,需要做成的效果就是,鼠标悬停的时候显示reader_id,点击的时候显示另外一些信息,但是因为在鼠标点击位置...所以上面说法其实是错的,两个事件应该也不会冲突,只是设置的问题,导致点击事件不生效而已。。 ..
  • 最近项目中要做一个音乐播放...按常规思路,先给整个悬浮窗setOnTouchListener,然后再给你里面的按钮setOnClickListener,点击运行,结果发现,点击事件是可以响应,拖拽也没问题,但是当手指放在ImageView上拖拽时,o
  • 背景: 示例代码: 事件冲突演示: 如上示例,在单机按钮时,会触发单机事件处理函数,在双击按钮时,会触发2次单机事件处理函数和1次双击事件处理函数
  • 解决layui中的form表单与button的点击事件冲突问题layui的form表单位置和button标签的位置重合,会使得button的click事件得不到响应,如图:蓝色底为form的位置,“重新搜索”为标签的位置,此时,button标签的click...
  • 该示例可解决列表长按事件与点击事件冲突问题,并且滑动时不会触发长按事件,且容器内可以再套一个点击事件。 使用方法 Gitee:https://gitee.com/wangjiabin-x/list-methods 直接 克隆项目到本地,然后导入项目...
  • SpannableStringBuilder进行拼接,对文章行数以及字数进行相关的处理,然后进行点击事件的处理 结果最后出现了问题:在同一段文字中,点击可点击文字部分时,所有的文字也会响应,也就是span响应的同时,onclick也...
  • 需求:表格内某项点击时,不触发el-table的行点击事件。 举个栗子: toExplor(id){ //根据id return 相应的网址 } <el-table-column label="浏览器" > <template slot-scope="scope"> <el-link ...
  • Android高级进阶 -事件冲突与解决方案大揭秘前言:事件分发流程简单的滑动冲突常见滑动冲突解决思路解决办法内部解决法:外部拦截法总结 前言: 事件冲突在开发过程中经常碰到,比如说2个可以滑动的布局ViewPager和...
  • 描述:在input输入框得焦的状态下,点击button的click事件时,页面执行了blur(虚拟键盘消失),而没有执行click事件 原因:因为blur优先级大于click,所以导致click没执行,要再点击才执行 解决方法就是使用下面...
  • $('.export').hover(function(){ $(this).addClass("active"); }).mouseout(function(){ if($(this).html() != _nowText){ $(this).removeClass("active"); } }); var _nowText ;... $(this).ad.
  • element-table 单元格双击事件 @cell-dbclick与el-switch 的@change事件冲突问题,可试试 event.stopPropagation() 方法
  • list列表项item和列表项item中按钮的点击事件冲突 点击list列表项item执行列表项item点击事件 点击列表项item中按钮,先执行按钮的点击事件,然后继续执行列表项item点击事件(重复) 解决办法: 修改列表项...
  • 如果单行点击和单元格事件发生冲突,如点击编辑会加载整行中展开关闭功能, 可以给按钮的点击事件加修饰符 如:@click.native.stop=“search(scope.row)”,可阻止冒泡事件 重点:.native为必填
  • vue项目中blur和click事件冲突

    千次阅读 2021-02-04 16:48:57
    blur和click事件 blur事件:当元素失去焦点时触发blur事件;其为表单事件,blur和focus事件不会冒泡,其他表单事件都可以。...其实还有其他方法,这篇博文里讲述的比较详细些【解决blur与click冲突】 ...
  • 问题 输入框,需要处理onblur事件与onclick事件,在项目中点击button按钮的时候同时也触发了onblur...经过一步步定位问题发现该问题,查找资料后进一步测试问题得以解决,将button的onclick事件更改为onMouseDown ...
  • 需要用到mousedown mousemove mouseup的时候一般都是在拖拽事件中,但是click的触发条件就是mousedown+mouseup,而且它们的执行顺序也是 mousedown > mousemove > mouseup > click 先说一下我的场景:我在...
  • 由于React-Native自带阻止事件冒泡行为,在我各种百度寻求解决办法无果即将放弃时,我在官网api中寻求到了解决办法 PanResponder PanResponderreconciles several touches into a single gesture. It makes ...
  • 【2】解决事件冲突的常用方案 注意:解决事件冲突只能在Move动作的时候 ①外部处理 外部处理就是在希望处理的子View的父容器中处理 ②内部处理 直接在希望处理的容器中处理 【3】先来过一遍Move的
  • 文章目录前言一、失焦不修改内容回车才保存第一版第二版注意点一:回车触发失焦事件(失焦事件触发两次)注意点二:使用.native注意点三:回车和换行事件冲突(回车和清空回车默认事件)第三版总结 前言 最近做的一...
  • 解决移动端input点击与失焦事件冲突

    千次阅读 2020-12-29 17:32:28
    问题描述 如下图所示,移动端的输入框,后面是...input点击事件与失焦事件冲突了,在click的时候会先触发blur事件,再触发click事件 解决方案 1、思路 监听清除按钮的mousedown事件,阻止默认事件,即阻止点击后默认失
  • 在child位置或里面如有一个按钮, 然后此时点击parent触发的事件与该按钮触发的事件并不相同, 若child设置的点击为bindtap, 则会触发parent的效果, 此时应将childd的bindtap方法换为catchtap方法, 则不会令点击事件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,066
精华内容 69,226
关键字:

事件冲突