1. /**
    2. * @author {LDM}
    3. * @param {自定义指令名称} directiveName
    4. * @param {处理函数} funcName
    5. */
    6. function getDirective(directiveName, funcName) {
    7. const selfDirective = Vue.directive(directiveName, {
    8. bind: function(el, binding, vnode) {
    9. el.addEventListener('compositionstart', onCompositionStart)
    10. el.addEventListener('compositionend', onCompositionEnd)
    11. if (el.nodeName === 'input' || el.nodeName === 'INPUT') {
    12. el.addEventListener('keyup', function(e) {
    13. if (e.target.composing) return
    14. el.value = funcName(el.value, binding)
    15. vnode && vnode.data && vnode.data.model && vnode.data.model.callback && vnode.data.model.callback(funcName(el.value, binding))
    16. })
    17. el.addEventListener('blur', function(e) {
    18. if (e.target.composing) return
    19. el.value = funcName(el.value, binding)
    20. vnode && vnode.data && vnode.data.model && vnode.data.model.callback && vnode.data.model.callback(funcName(el.value, binding))
    21. })
    22. } else {
    23. const item = vnode.child.$refs['input']
    24. if (!item) return
    25. item.addEventListener('keyup', function(e) {
    26. if (e.target.composing) return
    27. item.value = funcName(item.value, binding)
    28. vnode && vnode.data && vnode.data.model && vnode.data.model.callback && vnode.data.model.callback(funcName(item.value, binding))
    29. })
    30. item.addEventListener('blur', function(e) {
    31. if (e.target.composing) return
    32. item.value = funcName(item.value, binding)
    33. vnode && vnode.data && vnode.data.model && vnode.data.model.callback && vnode.data.model.callback(funcName(item.value, binding))
    34. })
    35. }
    36. },
    37. update: function(el, binding, vnode) {
    38. if (vnode.child) {
    39. const currentValue = funcName(vnode.data.model.value, binding)
    40. vnode.child.currentValue = currentValue
    41. vnode.data.model.callback(currentValue)
    42. }
    43. }
    44. })
    45. return selfDirective
    46. }
    47. const _letterNumberZH = (value, binding) => {
    48. if (value) {
    49. const reg = /[^0-9a-zA-Z\u4e00-\u9fa5]/g
    50. const text = value.replace(reg, '')
    51. if (binding && binding.value) {
    52. return text.substr(0, binding.value)
    53. }
    54. return text
    55. }
    56. return value
    57. }
    58. // 字母数字中文 可配合 v-letterNumberZH="length" 限制输入长度 length 为长度,0 或者没有 则不限制输入长度
    59. const letterNumberZH = getDirective('letterNumberZH', _letterNumberZH)