【问题标题】:How to trigger only one event 'change' or 'click'如何仅触发一个事件“更改”或“点击”
【发布时间】:2019-04-26 10:40:37
【问题描述】:

我有一个数字输入标签,上面有两个事件监听器“点击”和“改变”。当我点击箭头时,它会触发两者。我希望有一个先触发的,而不删除任何事件侦听器。 单击快速更改事件不会触发,直到它失去输入标签的焦点(如果我只保留更改事件)。如果我只保留点击事件,那么我将无法捕获更改事件。

<input type="number" @click="function()" @change="function()" />

【问题讨论】:

标签: javascript html vue.js event-handling


【解决方案1】:

使用 Observables。您可以将它们视为事件的流。去抖动输出应该会得到你想要的结果。

var event_a = Rx.Observable.fromEvent(document, 'mousemove'); 
var event_b = Rx.Observable.fromEvent(document, 'click'); // or in this case (input_element, 'click')

var debounce_ms = 100;
var debounced_event = merge(event_a, event_b).debounceTime(debounce_ms);

去抖动步骤会移除在指定时间间隔内发生的多个事件。如果两个事件(或同一事件的多个副本)在 100 毫秒内发生,则只会发出一个事件。

关于去抖动 Observables:https://www.learnrxjs.io/operators/filtering/debouncetime.html

上面的例子使用了与你不同的事件;只需调整它以收听您想要的任何事件。最后,订阅 Observable,并在那里调用相关的事件处理代码:

debounced_event.subscribe(() => {
    // do event handling things here
});

要在您的页面上使用 Observables,请在某处包含 rx.js。这是从 CDN 加载它的示例代码。

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>

【讨论】:

【解决方案2】:

您可以向数据添加布尔值 (例如 isInvoked:false)。 函数运行时检查:

if (this.isInvoked) return; this.isInvoked=true; //rest of your code here.....

【讨论】:

  • 我尝试了这种方法,但问题是方法没有同时调用。当方法完成时,“isInvoked”需要设置为 false。
  • 好的。你能解释一下你想要达到的目标吗?也许 onBlur 或 onInput 会更有效..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多