2 回答
TA贡献1797条经验 获得超6个赞
原因是您使用 fetch 而不等待承诺履行。
当您在结束时拨打电话时rePopulateSelect:
$('#state').val(state).change();
$('#district').val(district).change();
$('#township').val(township).change();
$('#desc').val(desc);
}
您正在更改处理程序中进行一些异步调用。要解决这个问题,请尝试在更改处理程序中等待,例如在您的状态更改处理程序中:
// create function for initing districts
async function InitDistricts(selectedState) {
await fetch('https://hoesein.github.io/select_error/data/lp_district.json')
.then( res => {
return res.json();
})
.then( json => {
$('#district').html('');
$('#district').html(`<option value=''>District</option>`);
$('#district').append(json.map(d => {
if(selectedState == d.sr_code){
return `<option value=${d.d_code}>${d.d_name}</option>` ;
}
}));
});
}
// attach as eventhandler
$('#state').change((e) => InitDistricts(e.target.value));
async function InitTownships(selectedDistrict) {
...
}
同样在您的 rePopulateSelect 中使用您创建的函数,并且仅在有意义时才使用 await ...
async function rePopulateSelect(btn) {
....
$('#state').val(state);
await InitDistricts(state);
$('#district').val(district);
await InitTownships(district);
$('#township').val(township);
$('#desc').val(desc);
}
TA贡献1820条经验 获得超2个赞
好吧,看来问题很明显了。例如,您正在更改 的值#district
,这会使您的#district
选择选项设置为selected
。但是由于 ajax 是一个异步调用,之后您将重写选项的代码,因此它不包含任何selected
选项。
您应该在 ajax 代码中附加您的选择:
if(value = this_select_value) <option selected value="..."/> else <option value="..."/>
并且this_select_value
您应该使用除value
( val()
) 之外的其他一些选择属性,因为当您使用 清除选项时,它正在被重写html()
。一些虚拟的,比如attr('last_val',val)
;
(不是一个有效的代码,只是为了展示这个想法,可以修复你的代码,但我不能在 github 上编辑它)
添加回答
举报