在應(yīng)用中,彈出式窗口選擇數(shù)據(jù),這種解決方案是很普遍的。
彈出窗口,有兩種方式,一種是:showModalDialog,使用模式窗口,這種方式的好處有兩個地方,一、可以直接返回數(shù)據(jù),二、在最前面顯示,避免用戶誤操作,窗口被遮蔽。
但是這種方式個人感覺比較致命的地方就是因為這個是一個對話框,在form提交的時候只能新開一個頁面(可能我沒有發(fā)現(xiàn)其他的方式)。但是也有其他的方式,如加iframe,但是這樣感覺頁面太煩了,需要兩個頁面才能實現(xiàn),比較麻煩。
第二種:window.open,這種方式也有一個問題,就是會被當做廣告攔截掉,還算不是很致命。
我的方案就是這個,下面上代碼。
傳遞格式通過json,這樣我可以自己定義需要回填那些域,返回值這邊就是竟可能的完整。


/**//*
彈出窗口
endtarget: string 目標窗口
無返回
*/

function fopenWindow(endtarget)
{
window.open( endtarget, "", "left=0, top=0, width=800px, height=600px, scrollbars=1, resizable=1, menubar=0, location=0, status=0, toolbar=0, " );
}


/**//*
window.open的回調(diào)函數(shù)
根據(jù)傳入的json格式,賦值相應(yīng)的域值

cmp:string 域id
retval :json 所選行的數(shù)據(jù)
無返回
*/

function fopenCallback(cmp, retval)
{
//alert("call back start." + cmp);
var obj = eval('(' + cmp + ')');

for(var e in obj )
{
//alert(obj[e]);
document.getElementById(obj[e]).value = retval[obj[e]]
}
}

window.openCallback = fopenCallback;


/**//*
獲取url上的參數(shù)
返回:key value 對
*/
function GetUrlParms()


{
var args=new Object();
var query=location.search.substring(1);//獲取查詢串
var pairs=query.split("&");//在逗號處斷開
for(var i=0;i<pairs.length;i++)

{
var pos=pairs[i].indexOf('=');//查找name=value
if(pos==-1) continue;//如果沒有找到就跳過
var argname=pairs[i].substring(0,pos);//提取name
var value=pairs[i].substring(pos+1);//提取value
args[argname]=unescape(value);//存為屬性
}
return args;
}


/**//*
行雙擊方法,用戶選擇行數(shù)據(jù)。
通過回調(diào)函數(shù),完成賦值,最后關(guān)閉窗口
rtnval: string 行數(shù)據(jù)
*/
function Dialog_onDblClick(rtnval)


{
//var rtnval = {prodId: prodId, prodName: prodName};
var args = new Object();
args = GetUrlParms();
var cmp = args['cmp']
window.opener.openCallback(cmp, rtnval);
window.close();
}
主頁面 域id通過json字符串跟url傳遞后彈出頁面
function popProductDialog(){
var endtarget = "<%=path%>/bas/product.do?method=dialog";
var cmp = "{a: 'prodId', b: 'prodName'}";
//fshowModalDialog(endtarget, cmp);
fopenWindow(endtarget+ "&cmp=" + cmp);
}
彈出框
function Document_onDblClick(value1,value2)

{

var rtnval = {clientId:value1, clientName:value2};
Dialog_onDblClick(rtnval);

}
彈出頁面解析獲得域id,并通過循環(huán)域id從返回值中獲取數(shù)據(jù),并進行賦值。
這里唯一需要變的就是,彈出頁面的返回值,可能因為需求的增加,需要返回更多的數(shù)據(jù),或者就一次性將所有數(shù)據(jù)都作為json數(shù)據(jù)返回。
這樣客戶在調(diào)用的時候,只要域id不超出返回字段的范圍,就可以正確使用了。