2014-06-18 87 views
0

我正在用一個看似簡單的javascript執行查找來填充select元素。我將當前值存儲在一個變量中,一旦腳本執行了查找並使用新列表填充選擇,然後查找先前選定值的索引並選擇它。這一切都可以正常工作,但是一旦函數完成,選定的索引就會被重新設置爲0。函數結束後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

不能看到您的具體網站,很難確切知道問題是什麼。

但是,我們可以很公平地猜測您看到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; 
    } 
} 
+0

好東西尼克!感謝您的幫助,將循環移入回調工作非常完美。 – user3589090