使用 Vue.js 从文本输入中按回车键时阻止表单提交
Prevent form submitting when pressing enter from a text input, using Vue.js
我在我的应用程序中使用 Vue.js 并在表单中输入文本
<div id="myVueForm">
<form>
<input type="text" v-on="keyup:addCategory | key 'enter'">
<!-- more form fields -->
<button type="submit">Submit Form</button>
</form>
</div>
在我的 Vue 实例中,我有以下内容
new Vue({
el: '#myVueForm',
methods: {
addCategory: function(e)
{
if(e) e.preventDefault();
console.log("Added a new category, thanks!");
}
}
});
尽管有 preventDefault()
调用,当用户在输入文本时按下回车键时,表单仍会提交(尽管 addCategory()
方法会触发)。这种行为可以在 this fiddle.
中得到证明
我知道我可以使用 jQuery 来捕获事件并阻止提交,但我想看看在 Vue 中是否可以这样做,因为这似乎很常见。
提交总是在按键按下时触发。所以使用 keydown 而不是 keyup.
<input type="text" v-on="keydown:addCategory | key 'enter'">
Vue.js 1.0 你可以做到:
<input type="text" @keyup.enter.prevent="addCategory">
为什么不直接禁用表单提交?
<form v-on:submit.prevent><input .../></form>
这是 Vue.js 2.x 的解决方案:
<input type='text' v-on:keydown.enter.prevent='addCategory' />
您可以从 HTML 获取事件并将其发送到 Vue 以防止出现默认情况,如下所示:
HTML
<input type="text" v-on:keydown.13="my_method($event)">
JS
methods: {
my_method(event){
// do something
if (event) event.preventDefault();
if (event) event.stopPropagation();
},
},
你可以使用这个:
HTML
<form name="..." @submit.prevent="onSubmitMethod">
JS
methods: {
onSubmitMethod() {
}
}
我为此写了一个助手。
export const preventFormSubmitOnEnter = {
mounted() {
let cb = event => {
if (event) event.preventDefault();
};
if (this.$el.nodeName.toLowerCase() === "form") {
this.$el.onsubmit = cb;
} else {
const forms = this.$el.getElementsByTagName("form");
for (let i = 0; i < forms.length; i++) {
const form = forms[i];
if (form) form.onsubmit = cb;
}
}
}
};
在你的 vue 组件中包含这个 mixin,它会自动运行。
这是一个示例(我使用的是 ElementUI):
<template>
<el-form :model="form" :rules="rules" ref="form">
<el-form-item prop="reference">
<el-input v-model="form.reference" placeholder="Your Reference"/>
</el-form-item>
</el-form>
</template>
<script>
import { preventFormSubmitOnEnter } from "./util";
export default {
mixins: [preventFormSubmitOnEnter],
data() {
return {
form: {
reference: ""
},
rules: {
reference: [{ required: true, message: "Reference is required!" }]
}
};
},
methods: {
validate() {
return new Promise((resolve, reject) => {
this.$refs.form.validate(valid => {
this.$emit("on-validate", valid, this.form);
resolve(valid);
});
});
},
validateField(prop) {
this.$refs.form.validateField(prop);
}
}
};
</script>
您可以使用禁用提交事件:
<form @submit.prevent="">
然后当你需要做一个表单提交时使用这样的东西:
<button type="submit" @click="mySubmitMethod"> Send </button>
我有一个极端情况,输入在弹出窗口中,而弹出窗口仅用于表单的一部分。我想阻止 enter 在弹出窗口打开时提交表单,但并非完全如此。这有效:
<input type="text" @keydown.enter.prevent = "" />
对于那些只是想阻止表单在输入时提交,但又不想在输入时触发任何方法的人,您可以简单地执行以下操作:
<input type="text" @keypress.enter.prevent />
或者在自定义组件上包含 native
修饰符:
<custom-input type="text" @keypress.enter.native.prevent />
可读性好且简洁。
这个有效
<input type="text" class="form-control" v-model="get_user" @keydown.enter.prevent = "">
我在我的应用程序中使用 Vue.js 并在表单中输入文本
<div id="myVueForm">
<form>
<input type="text" v-on="keyup:addCategory | key 'enter'">
<!-- more form fields -->
<button type="submit">Submit Form</button>
</form>
</div>
在我的 Vue 实例中,我有以下内容
new Vue({
el: '#myVueForm',
methods: {
addCategory: function(e)
{
if(e) e.preventDefault();
console.log("Added a new category, thanks!");
}
}
});
尽管有 preventDefault()
调用,当用户在输入文本时按下回车键时,表单仍会提交(尽管 addCategory()
方法会触发)。这种行为可以在 this fiddle.
我知道我可以使用 jQuery 来捕获事件并阻止提交,但我想看看在 Vue 中是否可以这样做,因为这似乎很常见。
提交总是在按键按下时触发。所以使用 keydown 而不是 keyup.
<input type="text" v-on="keydown:addCategory | key 'enter'">
Vue.js 1.0 你可以做到:
<input type="text" @keyup.enter.prevent="addCategory">
为什么不直接禁用表单提交?
<form v-on:submit.prevent><input .../></form>
这是 Vue.js 2.x 的解决方案:
<input type='text' v-on:keydown.enter.prevent='addCategory' />
您可以从 HTML 获取事件并将其发送到 Vue 以防止出现默认情况,如下所示:
HTML
<input type="text" v-on:keydown.13="my_method($event)">
JS
methods: {
my_method(event){
// do something
if (event) event.preventDefault();
if (event) event.stopPropagation();
},
},
你可以使用这个:
HTML
<form name="..." @submit.prevent="onSubmitMethod">
JS
methods: {
onSubmitMethod() {
}
}
我为此写了一个助手。
export const preventFormSubmitOnEnter = {
mounted() {
let cb = event => {
if (event) event.preventDefault();
};
if (this.$el.nodeName.toLowerCase() === "form") {
this.$el.onsubmit = cb;
} else {
const forms = this.$el.getElementsByTagName("form");
for (let i = 0; i < forms.length; i++) {
const form = forms[i];
if (form) form.onsubmit = cb;
}
}
}
};
在你的 vue 组件中包含这个 mixin,它会自动运行。
这是一个示例(我使用的是 ElementUI):
<template>
<el-form :model="form" :rules="rules" ref="form">
<el-form-item prop="reference">
<el-input v-model="form.reference" placeholder="Your Reference"/>
</el-form-item>
</el-form>
</template>
<script>
import { preventFormSubmitOnEnter } from "./util";
export default {
mixins: [preventFormSubmitOnEnter],
data() {
return {
form: {
reference: ""
},
rules: {
reference: [{ required: true, message: "Reference is required!" }]
}
};
},
methods: {
validate() {
return new Promise((resolve, reject) => {
this.$refs.form.validate(valid => {
this.$emit("on-validate", valid, this.form);
resolve(valid);
});
});
},
validateField(prop) {
this.$refs.form.validateField(prop);
}
}
};
</script>
您可以使用禁用提交事件:
<form @submit.prevent="">
然后当你需要做一个表单提交时使用这样的东西:
<button type="submit" @click="mySubmitMethod"> Send </button>
我有一个极端情况,输入在弹出窗口中,而弹出窗口仅用于表单的一部分。我想阻止 enter 在弹出窗口打开时提交表单,但并非完全如此。这有效:
<input type="text" @keydown.enter.prevent = "" />
对于那些只是想阻止表单在输入时提交,但又不想在输入时触发任何方法的人,您可以简单地执行以下操作:
<input type="text" @keypress.enter.prevent />
或者在自定义组件上包含 native
修饰符:
<custom-input type="text" @keypress.enter.native.prevent />
可读性好且简洁。
这个有效
<input type="text" class="form-control" v-model="get_user" @keydown.enter.prevent = "">