vue.js:如何处理同一元素上的click和dblclick事件

Cor*_*win 17 javascript vue.js

我有一个vue组件,其中包含click/dblclik的单独事件.单击(de)选择行,dblclick打开编辑表单.

<ul class="data_row"
  v-for="(row,index) in gridData"
  @dblclick="showEditForm(row,$event)"
  @click="rowSelect(row,$event)"
>
Run Code Online (Sandbox Code Playgroud)

这样做,我点击双击就发了3个事件.两次点击事件,最后一次是dblclick.由于点击事件首先触发,是否有一种方法(短暂的推迟点击事件的固定数量的ms),以便在双击时停止点击事件的传播?

在这里小提琴

Sau*_*abh 13

正如评论中所建议的那样,您可以通过在特定时间段(例如x)设置计时器来模拟dblclick事件.如果我们在该时间段内没有再次点击,请转到single_click_function().如果我们得到一个,请调用double_click_function().收到第二次点击后,计时器将被清除.一旦经过x毫秒,它也将被清除.

见下面的代码和工作小提琴.

new Vue({
    el: '#app',
    data: {
        result: [],
        delay: 700,
        clicks: 0,
        timer: null
    },    
     mounted: function() {
        console.log('mounted');
     },      
     methods: {
        oneClick: function(event){
          this.clicks++ 
          if(this.clicks === 1) {
            var self = this
            this.timer = setTimeout(function() {
              self.result.push(event.type);
              self.clicks = 0
            }, this.delay);
          } else{
             clearTimeout(this.timer);  
             this.result.push('dblclick');
             this.clicks = 0;
          }         
        }      
     }
});
Run Code Online (Sandbox Code Playgroud)


jaf*_*690 11

<div id="example-1">
 <button v-on:dblclick="counter += 1, funcao()">Add 1</button>
   <p>The button above has been clicked {{ counter }} times.</p>
</div>
Run Code Online (Sandbox Code Playgroud)
var example1 = new Vue({
 el: '#example-1',
 data: {
   counter: 0
 },
 methods: {
   funcao: function(){
     alert("Sou uma funcao");
   }
 }
})
Run Code Online (Sandbox Code Playgroud)

看看这个工作小提琴https://codepen.io/robertourias/pen/LxVNZX

  • 问题不是“@dblclick”不起作用,而是您不能同时使用“@click”和“@dblclick” (5认同)

Lk7*_*k77 9

我认为我有一个更简单的解决方案(我使用的是 vue-class 但适用相同的原则):

private timeoutId = null;
onClick() {
        if(!this.timeoutId)
        {
            this.timeoutId = setTimeout(() => {
                // simple click
            }, 50);//tolerance in ms
        }else{
            clearTimeout(this.timeoutId);
            // double click
        }
    }
Run Code Online (Sandbox Code Playgroud)

它不需要计算点击次数。

  • 谢谢!我还在清除超时后添加了“this.timeoutId = null;”。 (5认同)

fit*_*rec 5

单击和单击之间的时间必须很短。

为了获得点击和双击,只需要一个计数器来承载点击次数(例如0.2s),当用户缓慢点击或多次点击时,就足以捕获用户的意图双击或默认情况。

我在这里留下了如何实现这些功能的代码。

new Vue({
   el: '#app',
   data: {numClicks:0, msg:''},
   methods: {
      // detect click event
      detectClick: function() {
        this.numClicks++;
        if (this.numClicks === 1) {          // the first click in .2s
            var self = this;
            setTimeout(function() {
                switch(self.numClicks) {     // check the event type
                      case 1:
                        self.msg = 'One click';
                        break;
                      default:
                        self.msg = 'Double click';
                }
                self.numClicks = 0;               // reset the first click
            }, 200);                              // wait 0.2s
        } // if
      }  // detectClick function
   }
});
Run Code Online (Sandbox Code Playgroud)
span { color: red }
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.0/vue.js"></script>

<div id='app'>
  <button @click='detectClick'>
    Test Click Event, num clicks
    <span>{{ numClicks }}</span>
   </button>
  <h2>Last Event: <span>{{ msg }}</span></h2>
</div>
Run Code Online (Sandbox Code Playgroud)


Mar*_*sbo 5

我使用这种方法来解决同样的问题。我使用的 Promise 可以通过触发 200 毫秒的超时或通过检测到第二次点击来解决。它在我最近的网络应用程序中运行得很好。

<div id="app">
  <div 
    @click="clicked().then((text) => {clickType = text})">
      {{clickType}}
  </div>
</div>

<script>
new Vue({
  el: "#app",
  data: {
    click: undefined,
    clickType: 'Click or Doubleclick ME'
  },
  methods: {
    clicked () {
      return new Promise ((resolve, reject) => {
        if (this.click) {
          clearTimeout(this.click)
          resolve('Detected DoubleClick')
        }
        this.click = setTimeout(() => {
         this.click = undefined
         resolve('Detected SingleClick')
        }, 200)
      })
    }
  }
})
</script>
Run Code Online (Sandbox Code Playgroud)

工作小提琴: https://jsfiddle.net/MapletoneMartin/9m62Lrwf/

  • 实际上,您可以删除“@dblclick”事件处理程序,因为所有单击事件仅由“@click”处理程序处理! (2认同)