iOS 上無法觸發 createElement 的檔案上傳
寫檔案上傳時,有自己的按鈕樣式
很常會使用 createElement('input')
並設定 type=file
,搭配 onchange
就可以做一個自定義的檔案上傳按鈕
如下一個簡單的範例
function uploadFiles() {
fileInput = document.createElement('input');
fileInput.setAttribute('type', 'file');
fileInput.setAttribute('multiple', 'multiple');
fileInput.setAttribute('accept', 'image/jpg, image/jpeg, image/png, image/gif');
fileInput.onchange = async () => {
if (fileInput.files === null || fileInput.files[0] === null) return;
const res = await UPLOAD_TO_SERVER(fileInput.files);
}
fileInput.click();
}
在 Chrome 或各種常見的瀏覽器上都沒問題,但在 iOS 上卻會發現功能似乎時好時壞的
原因是因為 Safari 不會觸發 onchange
事件
照著參考資料的解法
直覺想法就是調整成 append 到 body 上,再移除掉
看其留言討論都有解決了,但我就跟那唯一留言不能運作的一樣= =
在iOS上,用起來仍是時好時壞…
解法
最後我不透過 append 加 dom。而是真的在畫面上放一個 input,邏輯寫在 onchange
事件
並用 css 隱藏掉
然後在自己的按鈕上,透過 onClick
觸發這個 input 的 click
事件,才總算在 iOS 上穩定運作
Safari 已然成為新一代的 IE…
參考資料
javascript file input onchange not working [ios safari only]