如何主动唤起文件选择框

如题,搞过文件上传的,肯定会有这种想法,也是初学者经常犯的“误区”

let input = document.createElement('input');
input.type = 'file';
input.click();

像我这样经验老道的,一看,“不可能,这会受到浏览器安全策略限制”,牛逼哄哄的祭出正解

solution

input[type=file] 飘在点击区上方,老手的惯用伎俩,这就叫“经验”,但最近一些事,让我啪啪打脸,颠覆了我的认知,不信你试试在 Chrome 的 Console 中试一下上面的三行代码。

。。。。。。

是不是很意外,让你在 Chrome 中试,是因为目前好像只有 Chrome 能这么大胆的放开,让你这么放肆,我们再尝试在 Safari 下试一下

。。。。。。

好像没效果,我们可联想到,浏览器限制这些东西,无非是想确定是人为操作,而非自动运行,在很多类似的情形,都有类似要求“人机交互事件发生时”,比如用户点击、键盘敲击。我们可以这么尝试一下

<input id="file" type="file" style="display:none" />
<button id="trigger">选择</button>

<script>
let input = document.getElementById('file');

document.getElementById('trigger').onclick = function () {
  input.click();
};
</script>

这种情况很适合那种,“原生的input的太丑,我想弄个漂亮的按钮触发上传”、“我想更优雅的控制上传”

还有一种情况我想在输入域中输入某个命令,回车触发上传

<input id="file" type="file" style="display:none" />
<div id="trigget" contenteditable>敲击回车触发上传</div>
<script>
let input = document.getElementById('file');

document.getElementById('trigger').onkeypress = function (e) {
  e.preventDefault();
  input.click();
};
</script>

浏览器兼容性如下

AbilityIEFirefox(41)Safari(11)Chrome(65)
直接唤起nononoyes
事件沙盒(click/keyup)唤起8,9,10,11yesyesyes

可以说是全兼容

有些版本我懒得测了,但我想连IE8都行,其它的不用测了吧
IE 下, input[type=file] 需要存在文档流中

至此,我想你之前经历过的,input 飘在某个按钮上方这种别扭设计可以扔掉了。

但是还没完,不知道大家有没有想到 labelFor 的应用场景,如果只是想点击事件转移,我们可以尝试以下方案

<input id="file" type="file" style="display:none" />
<label for="file">
  <span>点击上传</span>
</label>

或者

<label>
  <span>点击上传</span>
  <input type="file" style="display:none" />
</label>

这种方式,属于html原生支持的、设计如此的,不需要一句js脚本,适用于简单朴素的原生表单。

到目前为止,所谓"强壮的"的众多上传控件,仍然在使用惯用伎俩,这种不优雅的方式,早该被淘汰了,该是重构的时候了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
uni-app可以通过尝试唤起app来实现与原生app的交互。具体的实现方式取决于不同的平台和环境。 在iOS平台上,需要在Xcode中进行配置,添加一个白名单,以允许其他应用程序通过URL Scheme来唤起你的uni-app。这样,当其他应用程序尝试通过URL Scheme打开你的uni-app时,系统会自动将控制权转移到你的应用程序。 在Android平台上,可以使用intent来唤起其他应用程序。你可以使用uni-app提供的API uni.navigateToMiniProgram() 或 uni.navigateTo() 来实现跳转到其他应用程序。 需要注意的是,由于微信屏蔽了schema协议,所以在微信内部无法直接通过URL Scheme来唤起其他应用程序。在这种情况下,可以通过引导用户点击按钮或链接,然后跳转到应用商店下载你的app。 以下是一个示例代码,演示如何在uni-app中尝试唤起app: ```javascript // 尝试唤起app function openApp() { // 判断是否在微信内部 if (isWechat()) { // 在微信内部,引导用户下载app window.location.href = 'https://your-app-download-url'; } else { // 不在微信内部,尝试唤起app // 在这里根据不同的平台和环境使用不同的方法来唤起app // 例如,在iOS上可以使用window.location.href = 'your-app-url-scheme'; // 在Android上可以使用window.location.href = 'intent://your-app-url#Intent;scheme=your-app-scheme;package=your-app-package;end'; } } // 判断是否在微信内部 function isWechat() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { return true; } else { return false; } } // 调用唤起app的函数 openApp(); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值