承襲前篇,欲將Popup Dialog裡的一個Select Box所有的值,以JSON方式回call父視窗的JavaScript function。但很奇怪的是,若JSON長得像這樣:
[{"username":"Foo","userid":2},{"username":"Bar","userid":1}]
回到父視窗用SelectBoxes.js的addOption加到SelectBox,userid是value,username是顯示。卻只能加到第二筆,Debug過程看到它是有加第一筆,但加第二筆時,第一筆被remove。反之,把JSON內容順序弄相反,卻能正常兩筆顯示。而Popup視窗裡用的是另一套plugin-multiselect達成>>、>、<、<<功能,但奇怪的是在move時,都會被排序過,最後判斷是Sort問題所造成,所以在Popup Windows的Java Script如下:
function restore() { var a2r = $('select[name="account2role"]'); a2r.sortOptions(false); // SelectBoxes.js的function,設成不排序。 var data = '['; // 組成JSON a2r.find('option').each(function() { if (data.length > 1) data += ','; data += '{"username":"' + $(this).text() + '", "userid":' + $(this).val() + '}'; }); data += ']'; // 組成JSON完畢 if (window.dialogArguments != null) { window.dialogArguments.callback(data); // 回撥父視窗的Java Script function } window.opener = null; window.close(); }; |
而父視窗的callback作法如下:
function reselectAccount(data) { var obj = JSON.parse(data); // 將字串轉成JSON物件 var selObj = $('select[name="accounts"]'); selObj.empty(); $.each(obj, function(i) { selObj.addOption( obj[i].userid, obj[i].username); }); }; |