我昨天才开始使用vue.js
进行编码,而且我不知道如何关注"在没有使用"传统"的文本框上JS方式,即document.getElementById('myTextBox').focus()
。
最初,我的文本框已隐藏。我有一个"开始"按钮,当用户点击它时,会显示文本框,我想在那里设置focus
,可以这么说。我已经尝试使用ref
,但无济于事(请参阅下面的代码)。
HTML:
<input id="typeBox" ref="typeBox" placeholder="Type here..." />
的Javascript
export default {
name: 'game',
methods: {
startTimer () {
setTimeout(function () { /* .focus() won't work without this */
/* ugly and not recommended */
// document.getElementById('typeBox').focus()
/* Throws the error: Cannot read property 'typeBox' of undefined */
this.$refs.typeBox.focus()
// ... any other options?
// ...
}, 1)
}
} /* END methods */
} /* END export default */
有谁知道怎么做?请帮忙。
更新
在autofocus
上添加input
可以在加载页面后立即进行聚焦。但在我的应用程序中,需要重新聚焦&#34;在输入字段上多次没有重新加载页面,这就是为什么我需要一种方法来调用.focus()
。
答案 0 :(得分:12)
在这里分享解决方案,万一有人遇到同样的问题......
我终于在一位资深程序员的帮助下解决了这个问题。我还能够使用setTimeout
版本vue
消除nextTick()
。
正确的JS代码:
startTimer () {
this.$nextTick(() => {
// this won't work because `this.$refs.typeBox` returns an array
// this.$refs.typeBox.focus()
//this one works perfectly
this.$refs.typeBox[0].focus()
})
} /* END startTimer */
<强>解释强>
当我使用console.log(this.$refs.typeBox)
时,它返回了这个数组:
这就是代码工作的原因,它必须是typeBox[0].focus()
而不是typeBox.focus()
。
答案 1 :(得分:3)
this
函数中setTimeout
的值将被设置为window
个对象,因为它是一段时间后执行的回调函数,它已经失去{{1}的范围关键字,它是从调用函数的位置动态设置的。
箭头功能不会绑定它自己的this
值。
this
OR
startTimer () {
setTimeout(() => {
this.$refs.typeBox.focus()
}, 1)
}
答案 2 :(得分:0)
最后,不用setTimeout
就解决了问题,这要归功于window.requestAnimationFrame
(我不知道为什么):
startTimer () {
window.requestAnimationFrame(() => this.$refs.typeBox.focus())
}
它甚至可以用于自定义组件聚焦。
答案 3 :(得分:-3)
看到这个:
$(function(){
$("#my_text").hide();
})
function onClickTest(){
$("#my_text").show();
document.getElementById("my_text").focus();
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="my_text"/>
<button onclick="onClickTest()">click</button>
&#13;