Exemplo n.º 1
0
function sameInputType (a, b) {
  if (a.tag !== 'input') return true
  let i
  const typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type
  const typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type
  return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
}
Exemplo n.º 2
0
const directive = {
  inserted (el, binding, vnode, oldVnode) {
    // 指令的inserted钩子 仅对select有效
    if (vnode.tag === 'select') {
      // #6903
      if (oldVnode.elm && !oldVnode.elm._vOptions) {
        mergeVNodeHook(vnode, 'postpatch', () => { //mergeVNodeHook 解决
          directive.componentUpdated(el, binding, vnode)
        })
      } else {
        setSelected(el, binding, vnode.context) // 设置默认值
      }
      el._vOptions = [].map.call(el.options, getValue) // 映射选项拿到opts并且复制
      // 文本框或者input = text
    } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
      el._vModifiers = binding.modifiers // 拿到修饰符储存
      // 如果不是lazy 那么就绑定 compositionstart\compositionend 事件 (中文输入的处理,之前说过的)
      if (!binding.modifiers.lazy) {
        el.addEventListener('compositionstart', onCompositionStart)
        el.addEventListener('compositionend', onCompositionEnd)
        // Safari < 10.2 & UIWebView doesn't fire compositionend when
        // switching focus before confirming composition choice
        // this also fixes the issue where some browsers e.g. iOS Chrome
        // fires "change" instead of "input" on autocomplete.
        /** Safari<10.2&uiWebView不会触发合成,在确认合成选择之前切换焦点时,
         * 这也解决了一些浏览器(如iOS Chrome)在自动完成时触发“更改”而不是“输入”的问题。 **/
        el.addEventListener('change', onCompositionEnd) // 解决兼容问题
        /* istanbul ignore if */
        if (isIE9) {
          el.vmodel = true // ie9标志状态