js之input[type=file]選擇重復(fù)的文件,無(wú)法觸發(fā)change事件問(wèn)題
input[type=file]選擇重復(fù)的文件,無(wú)法觸發(fā)change事件
選擇文件的時(shí)候,瀏覽器會(huì)判斷是否跟之前一致,如果一致他就不會(huì)重新加載這個(gè)文件,避免無(wú)謂的加載消耗。
所以我們?cè)诓灰粯拥男枨蟮臅r(shí)候,比如裁剪圖片,無(wú)論他是不是相同圖片,都必須讓他觸發(fā)change事件,這樣才能進(jìn)行下一步處理。
解決方法
給input添加原生事件onblur進(jìn)行清空,οnblur="this.value=''" ,blur比change事件的優(yōu)先級(jí)要高一點(diǎn)。
代碼:
<input type="file" accept="image/*" οnblur="this.value=''" @change="uploadPhoto" class="uploadImg"/>
解決input file change監(jiān)聽(tīng)文件(圖片)上傳事件多次觸發(fā)
文件上傳html代碼:
<a name="uploadFile" id="uploadFile" href="javascript:;" rel="external nofollow" >[上傳文件]</a> <input id="myFile" name="myFile" value="上傳圖片" type="file" accept="application/vnd.ms-excel" style="display: none"/>
在上傳文件時(shí)候,通常想要監(jiān)聽(tīng)文件上傳事件:
/**
* 點(diǎn)擊上傳文件,觸發(fā)input type="file"
*/
$("#uploadFile").click(function () {
const myFile = $("#myFile")
// 觸發(fā)
myFile.click()
// 監(jiān)聽(tīng)change事件
myFile[0].addEventListener('change', function (e) {
var filesList = document.querySelector('#myFile').files;
if(filesList.length==0){ //如果取消上傳,則上傳文件的長(zhǎng)度為0
console.log("沒(méi)有上傳任何文件");
return;
}else{
//如果有文件上傳,這在這里面進(jìn)行
console.log(filesList);
}
});
});但是結(jié)果一次改變,卻觸發(fā)多次監(jiān)聽(tīng):

由于file input出于安全角度,是不允許賦值的,即使是置空,雖然通過(guò)給outerHtml賦值可以清空,但僅在ie下起使用。
因?yàn)槿鄙僦每盏姆椒?,用?hù)異步上傳完畢文件后選擇相同文件時(shí),不會(huì)觸發(fā)change,因?yàn)樵谶@種情況下,我們沒(méi)有辦法使value(也就是文件路徑)發(fā)生變化。
解決方法是
每次選完文件,就重建此元素,這樣值自然是空的,因?yàn)閏lone不帶值,這樣就是一個(gè)全新的file input,每一次選擇,自然各種正常。
/**
* 點(diǎn)擊上傳文件,觸發(fā)input type="file"
*/
$("#uploadFile").click(function () {
const myFile = $("#myFile")
// 觸發(fā)
myFile.click()
// 監(jiān)聽(tīng)change事件
myFile.unbind().change(function (e) {
console.log(e)
})
});這樣每上傳一次不同的文件就可以監(jiān)聽(tīng)到一次改變,符合監(jiān)聽(tīng)的效果:
![]()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- js與jquery實(shí)時(shí)監(jiān)聽(tīng)輸入框值的oninput與onpropertychange方法
- js監(jiān)聽(tīng)輸入框值的即時(shí)變化onpropertychange、oninput
- js change,propertychange,input事件小議
- javascript開(kāi)發(fā)中使用onpropertychange,oninput事件解決onchange事件的不足
- js propertychange和oninput事件
- 解決angularJS中input標(biāo)簽的ng-change事件無(wú)效問(wèn)題
- JS中的oninput和onchange事件的區(qū)別及如何正確使用
- js實(shí)現(xiàn)使用輸入input和改變change事件模擬手動(dòng)輸入
相關(guān)文章
利用iscroll4實(shí)現(xiàn)輪播圖效果實(shí)例代碼
iScroll 4 這個(gè)版本完全重寫(xiě)了iScroll這個(gè)框架的原始代碼。這個(gè)項(xiàng)目的產(chǎn)生完全是因?yàn)橐苿?dòng)版webkit瀏覽器(諸如iPhone,iPad,Android 這些系統(tǒng)上廣泛使用)。下面這篇文章主要介紹了利用iscroll4實(shí)現(xiàn)輪播圖效果的方法教程,需要的朋友可以參考下。2017-01-01
JS實(shí)現(xiàn)自適應(yīng)高度表單文本框的方法
這篇文章主要介紹了JS實(shí)現(xiàn)自適應(yīng)高度表單文本框的方法,實(shí)例分析了針對(duì)IE內(nèi)核與非IE內(nèi)核下的javascript控制文本框樣式的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
javascript實(shí)現(xiàn)點(diǎn)擊按鈕變色
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)點(diǎn)擊按鈕變色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
js異步之a(chǎn)sync和await實(shí)現(xiàn)同步寫(xiě)法
本文主要介紹了js異步之a(chǎn)sync和await實(shí)現(xiàn)同步寫(xiě)法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
PhotoSwipe異步動(dòng)態(tài)加載圖片方法
這篇文章主要為大家詳細(xì)介紹了PhotoSwipe異步動(dòng)態(tài)加載圖片方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
JS獲取select-option-text_value的方法
這篇文章主要介紹了JS獲取select-option-text_value的方法,有需要的朋友可以參考一下2013-12-12
Bootstrap實(shí)現(xiàn)的表格合并單元格示例
這篇文章主要介紹了Bootstrap實(shí)現(xiàn)的表格合并單元格,涉及bootstrap界面布局相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
javascript對(duì)數(shù)組的常用操作代碼 數(shù)組方法總匯
js下數(shù)組也是比較常用的,對(duì)數(shù)組元素的處理也是有非常多的方法,這里整理了下,需要的朋友可以參考下。2011-01-01

