函数结束后,selectedindex重置为0

时间:2014-06-18 12:18:42

标签: javascript dojo selectedindex

我正在努力寻找一个看似简单的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),出于此目的,我们无法升级以防万一有效。

1 个答案:

答案 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;
    }
}