私はEricHyndの素晴らしいマルチセレクトプラグインを使用して、いくつかのドロップダウンを設定しています。
1つはビジネスユニットです:..。
$('#lbBusinessUnits').multiselect({
height: "auto",
selectedList: 20
});
... 2つ目は、ビジネスエリア(#lbBusinessAreas)です。..。
$('#lbBusinessAreas').multiselect({
selectedList: 20
});
...ユニットが次のようにチェックされると、エリアのリストが更新されます。
// Business Units List Box Change
$('#lbBusinessUnits').bind("multiselectclick", function (event, ui) {
var selectedPeriod = $('#ddlSalesPeriods').val();
var selectedUnit = ui.value;
var selectedUnitText = ui.text;
var checkedUnit = ui.checked;
var areChecked = $(this).multiselect("getChecked").map(function () { return this.value; }).get();
if (areChecked.length > 0) {
url = '/InvoiceException/LoadBusinessareasBySalesPeriodBusinessUnit';
$.getJSON(url, { selectedSalesPeriod: selectedPeriod, selectedBusinessUnits: areChecked }, function (areas) {
var areaSelect = $('#lbBusinessAreas');
areaSelect.empty();
$.each(areas, function (index, optionData) {
areaSelect.append($('<option/>', { value: optionData.Id, text: optionData.Name }));
});
});
}
else {
var url = '/InvoiceException/LoadBusinessAreasBySalesPeriod';
$.getJSON(url, { selectedSalesPeriod: selectedPeriod }, function (areas) {
var areaSelect = $('#lbBusinessAreas');
areaSelect.empty();
$.each(areas, function (index, optionData) {
areaSelect.append($('<option/>', { value: optionData.Id, text: optionData.Name }));
});
});
}
$('#lbBusinessAreas').multiselect("refresh");
});
JSONの結果はMVC3コントローラーによって処理され、URL呼び出しから正しく返されます。IEで返されるデータは正しく見えます。
ただし、エリアボックス(#lbBusinessAreas)は、クリックしても正しく更新されません。ワンクリック遅れのようです。ボックスの更新で競合状態が発生しているようです。
これをFirebugに配置し、multiselect( "refresh")を呼び出すポイントにブレークポイントを設定すると、デバッガーをステップスルーするとすべてが正しく機能し、正常に動作します。
これは、オプションが更新される前に更新が終了する競合状態ですか?それはajax/getJson呼び出しだからですか?
操作の順序を確認するために、呼び出しを移動して更新したり、何らかの方法で把握したりする必要がありますか?IEでは、オプションの更新を完了してから、更新を実行する必要があります。