我正在努力寻找一个看似简单的javascript来执行查找以填充select元素。我将当前值存储在变量中,一旦脚本执行了查找并使用新列表填充了select,我就会查找先前选择的值的索引并选择它。这一切都很好,但是一旦函数完成,selectedindex将再次重置为0。
function findCleaningFrequency(){
var url = "${cleaningFrequencyLookup}".replace('SUBME', dojo.byId('ams.member').value);
var listbox = dojo.byId('ams.cleaningFrequency');
var selectedoption = listbox.selectedIndex;
var selectedtext = listbox[selectedoption].text;
dojo.xhrGet({
url : decode(url),
handleAs : 'json',
node: dojo.byId('ams.cleaningFrequency'),
load :
function(responseObject, ioArgs){
fillSelect(responseObject, ioArgs.args.node.id);
}
});
for (var i = 0; i < listbox.options.length; ++i) {
if (listbox.options[i].text === selectedtext ) listbox.options[i].selected = true;
}
}
我无法看到任何原因,我可以在调试器中单步执行它并观察它是否正常工作(并在新列表中选择正确的选项并正确返回),直到它完成为止通过最后的for循环,按预期正确选择项目),然后下拉菜单再次重置为0!出于兴趣,我们使用的是旧版本的dojo(1.0.2),出于此目的,我们无法升级以防万一有效。
答案 0 :(得分:0)
如果无法查看您的特定网站,很难确定问题所在。
但是,我们可以公平地猜测您是否看到了xhr的异步特性。你的fillSelect()调用可能正在运行/之后/你的最终循环。这是因为xhr回调在XHR返回时执行,而不是立即执行。
可能,简单的解决方法是将selectedtext循环移动到回调中,如下所示:
load: function(responseObject, ioArgs){
fillSelect(responseObject, ioArgs.args.node.id);
for (var i = 0; i < ioArgs.args.node.options.length; ++i) {
if (ioArgs.args.node.options[i].text === selectedtext ) ioArgs.args.node.options[i].selected = true;
}
}
另外,考虑使用Javascript闭包直接在此回调中访问列表框,并提高可读性:
load: function(responseObject){
fillSelect(responseObject, listbox.id);
for (var i = 0; i < listbox.options.length; ++i) {
if (listbox.options[i].text === selectedtext ) listbox.options[i].selected = true;
}
}