模拟点击type为file时的onchange事件

我这边要实现一个一进页面就触发type为file的点击事件,然后获得选中的图片信息,我的代码是

var _file = document.createElement("input");
_file.setAttribute("type", "file");
_file.setAttribute("style", "display:none;");
_file.setAttribute("height", "0px");
_file.setAttribute("width", "0px");
_file.setAttribute("id", "_file-id");
document.body.appendChild(_file);
document.getElementById('_file-id').click();
document.getElementById('_file-id').onchange = function(e) {
    alert(1)
}

这么写,怎么看都没错,可是在谷歌浏览器上直接不触发file的点击事件,在ie浏览器上,触发了点击事件,但是当我选中图片的时候,并没有执行onchange事件,求大神告知正确写法,可以兼容这两种浏览器,万分感谢!

阅读 4.3k
3 个回答

测试结果:

  1. Google Chrome版本 71.0.3578.98(正式版本) (64 位)
  2. Firefox Quantum 64.0 (64 位)
  3. IE 11.194.17763.0 测试不通过

个人观点:
关于兼容性,建议去找开源框架去做比较好,个人实现总是会有很多意想不到的问题。

处于安全考虑,这种功能一般都是不会被允许的,需要用户有交互产生后才行 这里的交互一般是指点击 或者 触摸屏幕。
建议更换方案。比如新建一个file框 设置定位到偏离画布或者设置opacity为透明 在页面使用覆盖层遮住页面 用户发生点击或者其他事件时来触发这个file框的点击事件。

<!DOCTYPE HTML>
<html lang="zh-hans" class="han-init">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>首页</title>
    <style>
        #file {
            position: absolute;
            top: -999px;
            opacity: 0;
        }

        .layout {
            background: rgba(0, 0, 0, 0);
            position: fixed;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
        }
    </style>
</head>
<body>
<div class="layout"></div>
<input type="file" id="file">
</body>
<script>
    !(function ($) {
        $('.layout').addEventListener('click', function (e) {
            $('#file').click();
            $('.layout').style.display = 'none';
        });
    })(function (selector) {
        return document.querySelector(selector);
    });
</script>
</html>

试下trigger

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题