forked from vuejs-tips/v-money
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdirective.js
42 lines (34 loc) · 1.16 KB
/
directive.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { format, setCursor } from './utils';
import opt from './options';
function run(el, eventName) {
let positionFromEnd = el.value.length - el.selectionEnd;
el.value = format(el.value, opt);
positionFromEnd = el.value.length - positionFromEnd;
positionFromEnd = Math.max(positionFromEnd, opt.prefix.length + 1); // left
setCursor(el, positionFromEnd);
el.dispatchEvent(new Event(eventName));
}
function getInput(el) {
if (el.tagName.toLocaleUpperCase() !== 'INPUT') {
const els = el.getElementsByTagName('input');
if (els.length !== 1)
throw new Error(`v-money requires 1 input, found ${els.length}`);
else
el = els[0];
}
return el;
}
function bind(el) {
el = getInput(el);
el.addEventListener('input', run(el, 'input'));
el.addEventListener('change', run(el, 'change'));
run(el, 'input');
}
function componentUpdated(el, binding, vnode, oldVnode) {
// Prevent firing endless events
if (vnode.data.props && vnode.data.props.value === oldVnode.data.props.value) return;
el = getInput(el);
el.value = vnode.data.props ? vnode.data.props.value : el.value;
run(el, 'input');
}
export default { bind, componentUpdated };