Prevent form submitting when pressing enter from a text input, using Vue.js

JavascriptHtmlvue.js

Javascript Problem Overview


I am using Vue.js in my app and have a text input within a form

<div id="myVueForm">
<form>
   <input type="text" v-on="keyup:addCategory | key 'enter'">

   <!-- more form fields -->
   <button type="submit">Submit Form</button>
</form>
</div>

In my Vue instance I have the following

new Vue({
    el: '#myVueForm',

    methods: {
        addCategory: function(e)
        {
           if(e) e.preventDefault();
           console.log("Added a new category, thanks!");
        }
    }
});

Despite the preventDefault() call, when a user presses enter whilst on the text input the form still submits (although the addCategory() method does fire). This behaviour can be demonstrated in this fiddle.

I know I can use jQuery to catch the event and prevent the submit, but I'd like to see if it's possible in Vue to do this as it seems quite a common usage.

Javascript Solutions


Solution 1 - Javascript

Here's a solution for Vue.js 2.x:

<input type='text' v-on:keydown.enter.prevent='addCategory' />

Solution 2 - Javascript

The submit is always fired on keydown. So use keydown instead of keyup.

<input type="text"  v-on="keydown:addCategory | key 'enter'">

Solution 3 - Javascript

why dont just disable the form submission ?

<form v-on:submit.prevent><input .../></form>

Solution 4 - Javascript

You can use for disable the submit event:

<form @submit.prevent="">

and then when you need to do a form submit use something like this:

<button type="submit" @click="mySubmitMethod"> Send </button>

Solution 5 - Javascript

Vue.js 1.0 you could do:

<input type="text" @keyup.enter.prevent="addCategory">

Solution 6 - Javascript

You can use this:

HTML

<form name="..." @submit.prevent="onSubmitMethod">

JS

methods: {
  onSubmitMethod() {
    
  }
}

Solution 7 - Javascript

For those simply looking to prevent a form submitting on enter, but not wanting to trigger any method on the input, you can simply do:

<input type="text" @keypress.enter.prevent />

Or on a custom component include the native modifier:

<custom-input type="text" @keypress.enter.native.prevent />

Beautifully readable and succinct.

Solution 8 - Javascript

I had an edge case where an input was within a popup, and the popup was for only part of the form. I wanted to prevent enter from submitting the form while the popup was open, but not altogether. This worked:

<input type="text" @keydown.enter.prevent = "" /> 

Solution 9 - Javascript

You can get event from the HTML and send it to Vue just to preventDefault like so:

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();
    },
},

Solution 10 - Javascript

i wrote a helper for this.

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;
      }
    }
  }
};

Include this mixin in your vue component and it will automagically work.

here is an example (Im using 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>

Solution 11 - Javascript

This works

 <input type="text" class="form-control" v-model="get_user" @keydown.enter.prevent = "">

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionharrygView Question on Stackoverflow
Solution 1 - Javascriptbradlis7View Answer on Stackoverflow
Solution 2 - JavascriptSebastian NetteView Answer on Stackoverflow
Solution 3 - JavascriptClemView Answer on Stackoverflow
Solution 4 - JavascriptcjeronimomxView Answer on Stackoverflow
Solution 5 - JavascriptRyunView Answer on Stackoverflow
Solution 6 - JavascriptRafael Andrs Cspedes BasterioView Answer on Stackoverflow
Solution 7 - JavascriptfredrivettView Answer on Stackoverflow
Solution 8 - Javascriptcrash springfieldView Answer on Stackoverflow
Solution 9 - JavascriptYevgeniy AfanasyevView Answer on Stackoverflow
Solution 10 - JavascriptStefan QuyView Answer on Stackoverflow
Solution 11 - JavascriptmodeisseyView Answer on Stackoverflow