Laravel9中条件成立时为下拉option添加selected属性问题
问题原因
你设置下拉默认选中失败、返回S.fn.init [prevObject: S.fn.init(1)]的核心原因是异步请求时序错误:
axios.get是异步非阻塞方法,你写在then回调外的选中逻辑,会在接口还没返回、下拉选项还没渲染完成时就提前执行- 执行选中逻辑时,
#categoryid_efield下根本不存在对应selectedCategoryID的option元素,jQuery找不到匹配元素就会返回你看到的这个空选择器对象 - 手动给option加
selected属性的写法在动态渲染场景下容易出现状态残留,可靠性差。
修复方案
把选中逻辑、模态框弹出逻辑全部移到axios的then回调内部,等所有分类选项全部渲染到DOM后再执行选中操作,同时用jQuery原生的.val()方法直接设置下拉选中值,不需要手动查找option加属性。
修正后的完整JS代码如下:
function editSubCategory(e) { let subCategoryId = e.id; let subCategoryName = e.sub_category_name; let selectedCategoryID = e.category_id; $("#subcategoryid_efield").val(subCategoryId); $("#subcategoryname_efield").val(subCategoryName); let url = window.location.origin; let path = url + "/getcategories"; axios .get(path) .then((res) => { // 初始化下拉框默认提示选项 $("#categoryid_efield").html( '<option value="" disabled>--Select Category--</option>' ); // 循环渲染接口返回的所有分类选项 $.each(res.data, function (key, value) { $("#categoryid_efield").append( `<option value="${value.id}">${value.category_name}</option>` ); }); // 选项全部渲染完成后,直接设置下拉框值完成默认选中 // 若存在类型不匹配问题,可改为 $("#categoryid_efield").val(parseInt(selectedCategoryID)) $("#categoryid_efield").val(selectedCategoryID); // 所有数据准备完成后再弹出模态框,避免出现下拉框闪烁、内容加载不全的问题 $("#editSubCategoryModal").modal("show"); }) .catch((err) => console.log(err)); }
对应的HTML模态框代码不需要做任何修改,保持原有写法即可。
注意事项
- 不要在异步请求还没完成时就操作动态渲染的DOM元素,所有依赖接口返回数据的DOM操作,都要放在请求完成的回调里执行
- 用
.val()设置select选中值的方式,比手动给option加selected属性更可靠,不会出现多次打开模态框时选中状态残留的bug - 如果设置后还是无法选中,优先检查接口返回的分类id和传入的
selectedCategoryID类型是否一致(数字/字符串类型不匹配会导致val匹配失败),统一转成数字或者字符串即可。
内容的提问来源于stack exchange,提问作者Q8Xbox
相关产品推荐
相关产品推荐

