vue中input type=file上传后@change事件无效的解决方案

 更新时间:2023年05月25日 10:27:40   作者:高效编程  
这篇文章主要介绍了vue中input type=file上传后@change事件无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

input type=file上传后@change事件无效的解决

为什么@change事件会无效?

绑定事件无效的问题,不仅仅是Vue中才会出现的,写原生js时同样是上传完文件后将无法触发事件,简单查阅资料,似乎与上传的DOM组件相关,因项目紧急也没有深究。

怎么解决事件不触发的问题?

网上大多文章说是要移除<input type='file' id='demo'\>再通过JS动态添加,这样确实可以解决问题,vue 中也有很多文章说 通过 v-if ,我试过之后发现v-if也不生效了

借助jQuery重新添加事件,可以解决

我们在上传文件处理完成后,重新添加事件

$("#demo").on("change",function);

将input 选择的文件置空(初始化)

document.getElementById("demo").value='';

input的type=file触发的相关事件

今天突然用到input相关的事件,突然发现自己还没有总结过input相关事件的运行原理。而且我还竟然翻api去了解了,所以,为了记恨自己,就写了相关与input相关的事件运行的过程。

添加了一些相关的方法测试了一下。这一节首先介绍一个input的type=file的运行流程。

我们书写了mousedown,mouseup,click,input,change,focus,blur绑定到了input上面,模拟点击选择了一个文件,触发事件的流程是下面这样的:

  • (1)mousedown
  • (2)focus
  • (3)mouseup
  • (4)click
  • (5)blur
  • (6)focus
  • (7)change

首先触发了鼠标按下事件,然后就是焦点到了input上面,然后鼠标抬起,触发click点击事件,失去焦点以后弹出了文件选择框,选中文件以后触发焦点,最后触发的change事件。

如果你没有选择文件的话,直接点击取消的话,就不会触发change事件。

所以说,如果要监听input 的type=file的内容变更事件的话,最好直接用change事件去监听。

附上案例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="file" id="input">
</body>
<script>
    document.getElementById("input").addEventListener("focus",function () {
        console.log("focus");
    });
    document.getElementById("input").addEventListener("mousedown",function () {
        console.log("mousedown");
    });
    document.getElementById("input").addEventListener("mouseup",function () {
        console.log("mouseup");
    });
    document.getElementById("input").addEventListener("input",function () {
        console.log("input");
    });
    document.getElementById("input").addEventListener("change",function () {
        console.log("change");
    });
    document.getElementById("input").addEventListener("blur",function () {
        console.log("blur");
    });
    document.getElementById("input").addEventListener("click",function () {
        console.log("click");
    });
</script>
</html>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue.js学习之递归组件

    vue.js学习之递归组件

    最近学习vue.js有一段时间了,使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,所以今天写出来和大家一起分享。有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Vue中this.$refs的使用及说明

    Vue中this.$refs的使用及说明

    Vue中this.$refs用于访问通过ref注册的元素或组件,需在mounted后使用,可在JS操作DOM或调用子组件方法,注意避免模板中直接使用
    2025-08-08
  • 详解Vue.js基于$.ajax获取数据并与组件的data绑定

    详解Vue.js基于$.ajax获取数据并与组件的data绑定

    这篇文章主要介绍了详解Vue.js基于$.ajax获取数据并与组件的data绑定,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • vue使用高德地图实现添加点标记和获取点击位置信息的示例代码

    vue使用高德地图实现添加点标记和获取点击位置信息的示例代码

    这篇文章主要介绍了vue使用高德地图实现添加点标记和获取点击位置信息的示例代码,文中补充介绍了高德vue-amap使用(一)标记点位获取地址及经纬度,本文结合示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-01-01
  • 深入浅析Vue中的 computed 和 watch

    深入浅析Vue中的 computed 和 watch

    computed 计算属性是通过属性计算得来的属性,watch属性变化,就会触发监听的函数。下面通过本文给大家介绍Vue中的 computed 和 watch,感兴趣的朋友一起看看吧
    2018-06-06
  • Vue3中多个弹窗同时出现的解决思路

    Vue3中多个弹窗同时出现的解决思路

    这篇文章主要介绍了Vue3中多个弹窗同时出现的解决思路,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • vue3前端导出excel表格的两种实现方法

    vue3前端导出excel表格的两种实现方法

    这篇文章主要给大家介绍了关于vue3前端导出excel表格的两种实现方法,文中通过代码以及图文介绍的非常详细,对大家学习或者使用vue3具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-11-11
  • Vue实现按钮级权限方案

    Vue实现按钮级权限方案

    这篇文章主要介绍了Vue按钮级权限方案,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Vue+Element实现动态生成新表单并添加验证功能

    Vue+Element实现动态生成新表单并添加验证功能

    这篇文章主要介绍了Vue+Element实现动态生成新表单并添加验证功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Vue后台管理系统之实现分页功能示例

    Vue后台管理系统之实现分页功能示例

    本文主要介绍了Vue后台管理系统之实现分页功能,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论