无法提交?FormData()未定义?原因在这里!!

本文记录了一次在使用360安全浏览器提交表单时遇到的FormData未定义错误。问题源于360浏览器内核版本不支持此功能。更换为QQ浏览器后问题解决,因为QQ浏览器内核版本更高,支持更多现代Web API。提醒开发者注意不同浏览器对Web技术的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题起因

用360安全浏览器在学校网站提交失败,打开控制台找了一下原因发现是这句出错了

var formdata=new FormData()
//错误: FormData未定义

解决过程

简单点说就是换个浏览器就行了。
复杂点说就是:
FormData的支持说明
里面有

对于某些浏览器,允许范围内的版本,因为有时要找出哪个早期版本的浏览器提供了功能是不切实际的。范围内的版本应该谨慎使用,并且只有在无法找到特性最初提供的版本号时才可以使用。允许以下范围内的版本值

FormData的浏览器支持版本

简单点说就是以上内核版本不一定都支持你用这个函数。

再看看360安全浏览器的版本
360安全浏览器内核版本查看
在这里插入图片描述

好家伙,果然内核版本的原因。

换上QQ浏览器后成功发送,下面是QQ浏览器的内核版本
在这里插入图片描述

这方面我不太熟悉,就是找了找问题的原因。如有错误,烦请指出。

表单页:<template> <div> <el-form :model="formData" :rules="rules" ref="formRef"> <!-- 自定义输入框组件替代 el-input --> <el-form-item label="产品名称:" prop="name"> <CustomInput v-model="formData.name" label="产品名称:" placeholder="请输入产品名称" @myChange="handleCustomChange" /> </el-form-item> <el-form-item label="产品描述:" prop="description"> <CustomInput v-model="formData.ndescriptioname" label="产品描述:" placeholder="请输入产品描述" @myChange="handleCustomChange" /> </el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form> <div>当前值: {{ formData.name }}</div> </div> </template> <script setup> import { ref, reactive } from 'vue' import CustomInput from '@/components/customInput' // 输入框组件路径 // 表单数据 const formData = reactive({ name: '', description: '' }) // 表单验证规则 const rules = reactive({ name: [ { required: true, message: '产品名称不能为空', trigger: 'blur' }, { min: 2, max: 20, message: '长度在2到20个字符', trigger: 'blur' } ], description: [ { max: 100, message: '描述不能超过100个字符', trigger: 'blur' } ] }) // 表单引用 const formRef = ref(null) // 处理自定义事件 function handleCustomChange(label) { console.log(`自定义事件触发: ${label} 字段发生变化`) } // 提交表单 function submitForm() { formRef.value.validate((valid) => { if (valid) { alert('表单验证通过! 提交数据: ' + JSON.stringify(formData)) } else { console.log('表单验证失败') return false } }) } </script> 输入框页:<template> <div> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" @blur="$emit('blur')" :disabled="props.disabled" :placeholder="props.placeholder" class="custom-input" /> <slot name="header"></slot> <slot></slot> <slot name="footer"></slot> </div> </template> <script setup> const props = defineProps({ modelValue: [String, Number], placeholder: { type: String, default: "" // 设置默认值 }, disabled: { type: Boolean, default: false // 设置默认值 } }); // 3. 定义所有可能触发的事件 defineEmits(['update:modelValue', 'blur', 'myChange']); </script> 为什么产品名称和产品描述样式和功能不一致
07-16
业务画面:<template> <div> <CustomForm :form-data="formData" :rules="rules" @submit="handleSubmit"> <template #default> <CustomFormItem label="产品名称" prop="name" :required="true"> <CustomInput v-model="formData.name" placeholder="请输入产品名称"/> </CustomFormItem> <CustomFormItem label="产品描述" prop="description" :required="true"> <CustomInput v-model="formData.description" placeholder="请输入产品描述" type="textarea"/> </CustomFormItem> </template> </CustomForm> <div>产品名称值: {{ formData.name }}</div> <div>产品描述值: {{ formData.description }}</div> </div> </template> <script setup> import { reactive } from 'vue'; import CustomForm from '@/components/customForm'; import CustomFormItem from '@/components/customFormItem'; import CustomInput from '@/components/customInput'; const formData = reactive({ name: '', description: '' }); const rules = reactive({ name: [ { required: true, message: '产品名称不能为空' }, { max: 10, message: '长度超过10个汉字' } ], description: [ { required: true, message: '产品描述不能为空' }, { max: 200, message: '描述不能超过200个汉字' } ] }); function handleSubmit(valid, data) { if (valid) { alert('表单验证通过! 提交数据: ' + JSON.stringify(data)); } else { console.log('表单验证失败'); } } </script> 组件customForm:<template> <form @submit.prevent="submitForm" class="custom-form"> <slot name="default"></slot> <button type="submit" class="submit-btn"> 提交 </button> </form> </template> <script setup> import { ref, defineProps, defineEmits, provide } from 'vue'; // 添加依赖注入 provide('formData', props.formData); provide('formRules', props.rules); const props = defineProps({ formData: { type: Object, required: true }, rules: { type: Object, default: () => ({}) } }); const emit = defineEmits(['submit']); const formItems = ref([]); // 向子组件提供注册方法 provide('registerFormItem', (item) => { formItems.value.push(item); }); async function submitForm() { let isValid = true; // 验证所有表单项 for (const item of formItems.value) { const valid = await item.validate(); if (!valid) isValid = false; } emit('submit', isValid, props.formData); } </script> <style scoped> .custom-form { margin-bottom: 20px; display: flex; flex-direction: column; gap: 18px; } .submit-btn { margin-top: 15px; padding: 10px 20px; background-color: #409eff; color: white; border: none; border-radius: 4px; cursor: pointer; align-self: flex-start; } .submit-btn:hover { background-color: #66b1ff; } </style> 组件customFormItem:<template> <div class="custom-form-item"> <label v-if="label" class="form-label"> {{ label }} <span v-if="required" class="required-mark">*</span> </label> <div class="form-content"> <slot></slot> <div v-if="errorMessage" class="error-message">{{ errorMessage }}</div> </div> </div> </template> <script setup> import { ref, defineProps, inject, onMounted, watch } from 'vue'; const props = defineProps({ label: String, prop: String, required: Boolean }); const formData = inject('formData'); const formRules = inject('formRules'); const registerFormItem = inject('registerFormItem'); const errorMessage = ref(''); const currentValue = ref(''); // 注册到父表单 onMounted(() => { if (registerFormItem && props.prop) { registerFormItem({ prop: props.prop, validate }); } }); // 值变化监听 watch(() => formData[props.prop], (newVal) => { currentValue.value = newVal; validate(); }); function validate() { if (!props.prop || !formRules || !formRules[props.prop]) { errorMessage.value = ''; return true; } const rules = formRules[props.prop]; const value = currentValue.value; for (const rule of rules) { if (rule.required && !value?.trim()) { errorMessage.value = rule.message; return false; } if (rule.max && value?.length > rule.max) { errorMessage.value = rule.message; return false; } } errorMessage.value = ''; return true; } </script> <style scoped> .custom-form-item { display: flex; flex-direction: column; gap: 8px; } .form-label { font-weight: 600; font-size: 14px; } .required-mark { color: #f56c6c; margin-left: 4px; } .form-content { display: flex; flex-direction: column; gap: 4px; } .error-message { color: #f56c6c; font-size: 12px; height: 20px; } </style>组件customInput:<template> <div class="custom-input"> <input v-if="type !== 'textarea'" :value="modelValue" @input="handleInput" @blur="$emit('blur')" :placeholder="placeholder" :type="type" class="input-field"/> <textarea v-else :value="modelValue" @input="handleInput" @blur="$emit('blur')" :placeholder="placeholder" class="textarea-field"></textarea> </div> </template> <script setup> defineProps({ modelValue: [String, Number], placeholder: { type: String, default: "" }, type: { type: String, default: "text" } }); const emit = defineEmits(['update:modelValue', 'blur']); function handleInput(event) { emit('update:modelValue', event.target.value); } </script> <style scoped> .custom-input { width: 100%; } .input-field, .textarea-field { width: 100%; padding: 10px 12px; border: 1px solid #dcdfe6; border-radius: 4px; font-size: 14px; transition: border-color 0.3s; } .textarea-field { min-height: 80px; resize: vertical; } .input-field:focus, .textarea-field:focus { border-color: #409eff; outline: none; box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2); } </style> 哪写错啦,不显示
最新发布
07-17
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AQ_No_Happy

你的满意是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值