我有一个名为styled-input
的组件,它是一个带有样式,图标,验证等的输入。
我试图在自定义指令中使用addEventListener
来监听事件并使事情发生。
<styled-input
v-model=""
v-on:input=""
v-on:blur=""
></styled-input>
内部:
value
是道具(允许外v-model
绑定)
<template>
<div>
<input
v-bind:value="value"
v-on:input="$emit('input', $event.target.value)"
v-on:blur="$emit('blur', $event.target.value)"
/>
</div>
</template>
我尝试addEventListener
通过自定义指令进行自定义验证。
<styled-input
v-model=""
v-custom-validator:credit-card
></styled-input>
在指令中我使用addEventListener
来监听输入字段中的事件。
Vue.directive('custom-validator', {
bind: function(el, binding) {
el.addEventListener('blur', (event) => {
// Does not fire
});
el.addEventListener('input', (event) => {
/// Fires
});
},
});
为什么模糊事件不会触发,而输入事件会触发?
如何触发模糊事件?
答案 0 :(得分:5)
您没有选择blur
,因为您没有指定useCapture
argument。这是强制性的,因为blur
event does not bubble。因此,添加useCapture
可以解决您的问题:
el.addEventListener('blur', (e) => {
// it will work now
}, true); // useCapture is the third argument to addEventListener
从您的代码(并参见下面的演示)中,似乎,当blur
和input
被触发时,.addEventListener()
会选择发出的内容按$emit()
。 情况并非如此。
您可能会得到这个想法,因为除了$emit()
的{{1}}之外,v-on
还会触发原生事件{{1} }和<input>
。
所以你实际拥有的是blur
的两种不同的事件,input
的两种事件(见下面的演示)。
blur
是什么? input
是Vue内部的。它是一个部分或every Vue实例events interface。
$emit()
适用于原生DOM事件。它会收听.dispatchEvent()
s,而不是$emit()
s。
要收听Vue的.addEventListener()
,您必须使用Vue $emit()
。
见下面的演示。请注意$emit()
和.$on()
中的e
(事件)对象不同。
.$on()
.addEventListener()