jQuery动态修改input file的accept属性不生效如何解决
问题根因
你写的逻辑不生效是类型匹配失败导致的:jQuery的.val()方法读取表单控件值时,返回的结果永远是字符串类型,但你switch语句里的所有case判断条件都是数字类型。JS的switch判断是全等匹配,字符串"1"和数字1不属于相同类型,不会进入对应分支,所以accept属性从来没有被修改过,一直保持初始的*.*。
修复方法
两种改法二选一即可:
方法1:把获取到的值转为数字类型
在读取select值时做整数转换,和现有case的数字类型对齐,完整代码如下:
// 等DOM加载完成再绑定事件,避免绑定失败 $(function() { $('#FileTypeIndex').on('change',function() { // 把字符串值转成整数,修正原代码里的变量拼写错误 const fileTypeIndex = parseInt($(this).val()); switch(fileTypeIndex) { case 1: $('#productfile').attr("accept", ".pdf"); break; case 2: case 5: $('#productfile').attr("accept", ".mp4,.avi"); break; case 3: $('#productfile').attr("accept", ".mp3"); break; case 4: $('#productfile').attr("accept", ".jpg,.jpeg,.png"); break; default: // 默认重置为支持所有文件,逻辑更闭环 $('#productfile').attr("accept", "*.*"); } }); });
注:事件里获取选中值可以直接用
$(this).val()代替重复写选择器查元素,性能更好也更符合jQuery事件的写法习惯。
方法2:把case条件改为字符串类型
如果不想做类型转换,直接把所有case后的数字改成字符串形式,和.val()返回的类型匹配即可:
$(function() { $('#FileTypeIndex').on('change',function() { const fileTypeIndex = $(this).val(); switch(fileTypeIndex) { case "1": $('#productfile').attr("accept", ".pdf"); break; case "2": case "5": $('#productfile').attr("accept", ".mp4,.avi"); break; case "3": $('#productfile').attr("accept", ".mp3"); break; case "4": $('#productfile').attr("accept", ".jpg"); break; default: $('#productfile').attr("accept", "*.*"); } }); });
额外排查点
如果改完类型还是不生效,优先检查两个问题:
- 打开浏览器开发者工具的Console面板,确认没有jQuery未加载、元素id拼写错误的JS报错
- 确认事件绑定代码没有写在DOM渲染完成之前,否则会因为找不到select元素导致事件绑定失效
内容的提问来源于stack exchange,提问作者nnmmss
相关产品推荐
相关产品推荐

