動(dòng)態(tài)生成的一組input,觸發(fā)enter事件后怎么focus下一個(gè)input
<li class="border-none" v-for="(item,index) in prcHdAreaList" :key="item.pmcKeyVal">
<input
:ref="item.pmcKeyVal"
v-focus-next-on-enter="'item.pmcKeyVal'"
name="item.phaRate" class="cus_input"
v-model.trim="item.phaRate" type="number"/>
</li>
Vue.directive('focusNextOnEnter', {
bind: function(el, {value}, vnode) {
el.addEventListener('keyup', (ev) => {
if (ev.keyCode === 13) {
let nextInput = vnode.context.$refs[value]
if (nextInput && typeof nextInput.focus === 'function') {
nextInput.focus()
nextInput.select()
}
}
})
}
})
經(jīng)過(guò)我?guī)讉€(gè)小時(shí)的嘗試,使用自定義指令實(shí)現(xiàn)了該需求,沒(méi)有使用任何原生的DOM操作和插件,直接使用了vue
提供的方法實(shí)現(xiàn)的。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item,index) in inputs">
<input type="text" v-model="item.val" v-focus="focusIndex === index" @keyup.enter="nextFocus(index)">
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
// 注冊(cè)一個(gè)全局自定義指令 `v-focus`
Vue.directive('focus', {
// 當(dāng)被綁定的元素插入到 DOM 中時(shí)……
inserted: function (el,obj) { //這是需要頁(yè)面剛加載就能進(jìn)行聚焦操作使用的鉤子函數(shù),可以省略的,視具體需求而定
//console.log(obj);
if(obj.value) { //對(duì)值進(jìn)行判斷
// 聚焦元素
el.focus()
}
},
// 當(dāng)指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用
componentUpdated: function(el,obj) { //這是每當(dāng)綁定的值發(fā)生改變時(shí)觸發(fā)的鉤子函數(shù)
//console.log(obj); //可以打印看一下
if(obj.value) {
el.focus()
}
}
})
new Vue({
el: "#app",
data() {
return {
focusIndex: 0, //用來(lái)存放下一個(gè)應(yīng)該聚焦的index值
inputs: [{
val: 1
},{
val: 2
},{
val: 3
},{
val: 4
}]
}
},
methods: {
nextFocus(index) {
return this.focusIndex = index + 1;
}
}
});
</script>
</body>
</html>
希望我的回答對(duì)你有所幫助!^_^^_^ 不足之處,歡迎批評(píng)指正!
根據(jù)@luozz的提示精簡(jiǎn)了下代碼
<li class="border-none" v-for="(item,index) in prcHdAreaList" :key="item.pmcKeyVal">
<input
v-validate="'required'"
@keyup.enter="nextInput('hdArea',index)"
:class="{'input': true, 'is-danger': errors.has('item.phaRate'), 'hdArea': true }"
name="item.phaRate" class="cus_input"
v-model.trim="item.phaRate" type="number"/>
</li>
nextInput: function(name,index){
var inputs = document.getElementsByClassName(name);
inputs[index + 1].focus();
inputs[index + 1].select()
},
直接上代碼吧- 動(dòng)態(tài)數(shù)據(jù),動(dòng)態(tài)獲取,動(dòng)態(tài)焦點(diǎn)--ohye
<template>
<ul>
<li v-for="product in products">
{{ product.title }} - {{ product.price | currency }}
<br>
<input
type="text"
:value='product.title'
:ref='"nnnn"+product.id'
@keyup.enter="(e)=>doneEdit('nnnn'+product.id)"
></input>
<button
:disabled="!product.inventory"
@click="addProductToCart(product)">
Add to cart
</button>
</li>
</ul>
</template>
<script>
const allproducts = [
{"id": 1, "title": "iPad 4 Mini111", "price": 500.01, "inventory": 2},
{"id": 2, "title": "H&M T-Shirt White", "price": 10.99, "inventory": 10},
{"id": 3, "title": "Charli XCX - Sucker CD", "price": 19.99, "inventory": 5}
]
import { mapGetters, mapActions } from 'vuex'
export default {
computed:{
products:function(){ return allproducts}
},
methods:{
doneEdit:function(refid){
let dom=this.$refs[refid][0];
dom.parentNode.nextElementSibling
&& dom.parentNode.nextElementSibling.childNodes[3].focus()
},
...mapActions([
'addProductToCart',
])},
beforeCreate(){
console.log('生命周期');
},
created () {
this.$store.dispatch('getAllProducts')
}
}
</script>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div class="wrap">
<input type="text" @keydown.enter="fun()">
<input type="text" @keydown.enter="fun()">
<input type="text" @keydown.enter="fun()">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/javascript">
var vm = new Vue({
el: ".wrap",
methods: {
fun() {
const DOM = event.target
const nextDOM = DOM.nextElementSibling
nextDOM.focus()
}
}
})
</script>
</div>
</body>
</html>
如上代碼所示,nextElementSibling獲取下一個(gè)兄弟節(jié)點(diǎn),再focus()獲取焦點(diǎn)即可
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。