diff --git a/src/core/view/components/input/index.vue b/src/core/view/components/input/index.vue index 7279062a8bb27ac2e05c89c4c158275b735dee99..d65db8b00103553ec30bab6293d455124db897d5 100644 --- a/src/core/view/components/input/index.vue +++ b/src/core/view/components/input/index.vue @@ -32,6 +32,7 @@ @input.stop="_onInput" @compositionstart.stop="_onComposition" @compositionend.stop="_onComposition" + @compositionupdate.stop="_onComposition" @keyup.enter.stop="_onKeyup" > @@ -201,7 +202,7 @@ export default { _onInput ($event, force) { let outOfMaxlength = false - if (this.composing) { + if (this.composing && this.ignoreCompositionEvent) { return } @@ -241,18 +242,28 @@ export default { if (outOfMaxlength) return + if (!this.ignoreCompositionEvent) this.valueSync = this.$refs.input.value + this.$triggerInput($event, { value: this.valueSync }, force) }, _onComposition ($event) { - if ($event.type === 'compositionstart') { - this.composing = true - } else if (this.composing) { - this.composing = false - // 部分输入法 compositionend 事件可能晚于 input - this._onInput($event) + switch ($event.type) { + case 'compositionstart': + this.composing = true + break + case 'compositionend': + if (this.composing) { + this.composing = false + // 部分输入法 compositionend 事件可能晚于 input + this._onInput($event) + } + break } + + !this.ignoreCompositionEvent && + this.$trigger($event.type, $event, { data: $event.data }) }, _resetFormData () { this.valueSync = '' diff --git a/src/core/view/components/textarea/index.vue b/src/core/view/components/textarea/index.vue index fb182e3da5535def184dbbd6e42d4532030c19d2..b6f12ab7d4c0e0af61446e97e940df2d6d95bafd 100644 --- a/src/core/view/components/textarea/index.vue +++ b/src/core/view/components/textarea/index.vue @@ -41,8 +41,9 @@ :enterkeyhint="confirmType" class="uni-textarea-textarea" @change.stop - @compositionstart.stop="_onCompositionstart" - @compositionend.stop="_onCompositionend" + @compositionstart.stop="_onComposition" + @compositionend.stop="_onComposition" + @compositionupdate.stop="_onComposition" @input.stop="_onInput" @focus="_onFocus" @blur="_onBlur" @@ -190,15 +191,22 @@ export default { !this.confirmHold && this.$refs.textarea.blur() } }, - _onCompositionstart ($event) { - this.composing = true - }, - _onCompositionend ($event) { - if (this.composing) { - this.composing = false - // 部分输入法 compositionend 事件可能晚于 input - this._onInput($event) + _onComposition ($event) { + switch ($event.type) { + case 'compositionstart': + this.composing = true + break + case 'compositionend': + if (this.composing) { + this.composing = false + // 部分输入法 compositionend 事件可能晚于 input + this._onInput($event) + } + break } + + !this.ignoreCompositionEvent && + this.$trigger($event.type, $event, { data: $event.data }) }, // 暂无完成按钮,此功能未实现 _confirm ($event) { @@ -218,10 +226,13 @@ export default { this.height = height }, _onInput ($event, force) { - if (this.composing) { + if (this.composing && this.ignoreCompositionEvent) { this.valueComposition = $event.target.value return } + + if (!this.ignoreCompositionEvent) this.valueSync = this.$refs.textarea.value + this.$triggerInput($event, { value: this.valueSync, cursor: this.$refs.textarea.selectionEnd diff --git a/src/core/view/mixins/field.js b/src/core/view/mixins/field.js index b3e1273ed755a6abc17e6c722cc9b3ee6f0d2efc..8e6aa8796e044353e61564bb5c0f802bee46b2ae 100644 --- a/src/core/view/mixins/field.js +++ b/src/core/view/mixins/field.js @@ -66,6 +66,10 @@ export default { confirmHold: { type: Boolean, default: false + }, + ignoreCompositionEvent: { + type: Boolean, + default: true } }, data () { diff --git a/src/platforms/app-plus/runtime/web-view-api.js b/src/platforms/app-plus/runtime/web-view-api.js index ccb79891fee2a58a2f4ab8cae9d470fed98206b7..5cb5217a52a20d851405b2f3bb9b902d544b6c1b 100644 --- a/src/platforms/app-plus/runtime/web-view-api.js +++ b/src/platforms/app-plus/runtime/web-view-api.js @@ -3,7 +3,7 @@ const webviewIds = [] const UNIAPP_SERVICE_NVUE_ID = '__uniapp__service' const WEB_INVOKE_APPSERVICE = 'WEB_INVOKE_APPSERVICE' -function isNvue() { +function isNvue () { return (window.__dcloud_weex_postMessage || window.__dcloud_weex_) }