解决Internet Explorer中FormData.delete方法无效的问题
解决IE中无法使用FormData.delete删除指定键的问题
确实,IE 11及更早版本完全不支持FormData.delete()方法,所以直接调用这个方法肯定没效果。下面给你两个实用的解决方案,根据你的场景选择:
方案一:重新构建FormData(适合手动构建的情况)
如果你的PostRegistrationFormData是手动通过append方法构建的(比如从localModel来的),那最简单的办法就是重新创建一个FormData对象,只添加你需要保留的键值对,跳过要删除的profile_photo。
替换你原来的delete代码,改成这样:
this.PostRegistrationFormData = new FormData(); let localModel: any = _.clone(this.PostRegistrationModel); // 遍历模型,只添加非profile_photo的键值对 for (const key in localModel) { if (localModel.hasOwnProperty(key) && key !== 'profile_photo') { this.PostRegistrationFormData.append(key, localModel[key]); } } // 注意:如果之前你还手动append了其他不在localModel里的键,记得在这里也加上,同样跳过profile_photo // 比如:this.PostRegistrationFormData.append('other_key', other_value);
方案二:通用遍历过滤法(适合所有场景)
如果你的FormData里有很多额外的键,或者是从DOM表单直接创建的,那可以用这个通用方法:创建一个新的FormData,遍历原FormData的所有键值对,跳过要删除的键后添加到新对象里。
考虑到IE11不支持FormData.entries()这类迭代方法,我们做了兼容处理:
function removeFormDataKey(formData, keyToRemove) { const newFormData = new FormData(); // 现代浏览器用entries()遍历 if (formData.entries) { for (const [key, value] of formData.entries()) { if (key !== keyToRemove) { newFormData.append(key, value); } } } else { // IE11的兼容处理:用临时表单中转 const tempForm = document.createElement('form'); // 添加一个占位元素避免空表单问题 const dummyInput = document.createElement('input'); dummyInput.name = '__temp_dummy__'; tempForm.appendChild(dummyInput); // 把原FormData的内容导入临时表单 if (formData.forEach) { formData.forEach((value, key) => { const input = document.createElement('input'); input.name = key; input.value = value; tempForm.appendChild(input); }); } // 遍历临时表单的元素,跳过要删除的键 Array.from(tempForm.elements).forEach(element => { if (element.name !== keyToRemove && element.name !== '__temp_dummy__') { newFormData.append(element.name, element.value); } }); } return newFormData; } // 使用方法替换你的delete调用 this.PostRegistrationFormData = removeFormDataKey(this.PostRegistrationFormData, 'profile_photo');
这个通用方法既支持现代浏览器,也能在IE11里正常工作。
内容的提问来源于stack exchange,提问作者Apurv Chaudhary
相关产品推荐
相关产品推荐

