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


/**//*
彈出窗口
endtarget: string 目標(biāo)窗口
無(wú)返回
*/

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ù)
無(wú)返回
*/

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 對(duì)
*/
function GetUrlParms()


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

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


/**//*
行雙擊方法,用戶(hù)選擇行數(shù)據(jù)。
通過(guò)回調(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();
}
主頁(yè)面 域id通過(guò)json字符串跟url傳遞后彈出頁(yè)面
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);

}
彈出頁(yè)面解析獲得域id,并通過(guò)循環(huán)域id從返回值中獲取數(shù)據(jù),并進(jìn)行賦值。
這里唯一需要變的就是,彈出頁(yè)面的返回值,可能因?yàn)樾枨蟮脑黾樱枰祷馗嗟臄?shù)據(jù),或者就一次性將所有數(shù)據(jù)都作為json數(shù)據(jù)返回。
這樣客戶(hù)在調(diào)用的時(shí)候,只要域id不超出返回字段的范圍,就可以正確使用了。