所以我想出了如何使用e.target.setSelectionRange(0, 999)
:
onUp(e){
e.preventDefault() // By default, on mouse up the caret is placed between characters. That has to be negated.
e.target.setSelectionRange(0, 999) // Set the selection to (what is likely) all the text in the input field.
}
<input @mouseup="onUp" v-model="input"/>
https://codepen.io/kslstn/pen/ZvoEQa
但是,这仅适用于受信任事件:直接影响用户输入的事件(https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted)。我希望在用户通过单击请求时显示最初隐藏的Vue组件。当它出现时,该组件内的输入字段应该选择其内容。
我尝试了以下内容:
我想要太多吗?
答案 0 :(得分:2)
如果您的DOM元素没有焦点,您将无法setSelectionRange
。在您的codepen中,它确实(并且您可能应该使用focus
事件而不是mouseup
),但是当安装组件时,它不会。
更新:这通常有效,但显然不适用于IOS。 This page说:
如果元素没有,
setSelectionRange
将无法在iOS上运行 焦点。还要注意任何围绕给文本的东西 输入焦点is highly unreliable 在移动Safari上。
那里的链接说:
从iOS 5开始,由合成点击事件触发的处理程序是 允许触发对输入元素的关注。请尝试更新的FastClick input focus example。
因此,我们可能必须在输入上合成click
事件才能获得焦点。
更新(再次):您可以做的最好的事情是在focus
上选择文字。我相应地更新了我的代码。如果focus
以编程方式工作,则在组件出现时将选择文本;否则,当您点击该字段时将选择它。
new Vue({
el: '#app',
data: {
showing: false
},
components: {
autoSelected: {
data() {
return {
text: 'hi there'
}
},
mounted() {
this.$refs.input.focus();
},
methods: {
selectText(e) {
e.target.setSelectionRange(0, 9999);
}
}
}
},
methods: {
showIt() {
this.showing = true;
}
}
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
<div id="app">
<button @click="showIt">Show it</button>
<auto-selected v-if="showing" inline-template>
<input ref="input" v-model="text" @focus="selectText">
</auto-selected>
</div>