2008年7月31日 星期四

Window.ShowModalDialog 的傳值問題

整理網頁技術操典時, 順便把這一部份補全.

  >> 參考網站

對話盒



一般對話盒

alert
("請輸入序號!"); //提示對話盒

if (confirm("
確定要刪除?")) {formObj.submit();} //確認對話盒

if (!confirm("
確定離線?")) {return;} //確認對話盒

var str=prompt("
請輸入年齡","20");  //輸入對話盒: 第二個參數為預設值, 傳回值為一字串
強制回應對話盒 Modal的用法 (必須關閉該視窗,才能返回原瀏覽器)

function call_modal() {

  var option=“dialogWidth:440px;dialogHeight:390px;status:off;help:off”; //
選項字串(對話窗參數)

  var arg=new Array(); //
儲存傳入/傳回參數之陣列(作為原呼叫瀏覽器與對話框之介面)

  arg[0]=“select_element”; //arg[0]
設定為傳入參數 caller (用來辨別呼叫者, modal.htm可多用途)

  arg[1]=“”; //arg[1]
設定為傳回參數 code

  arg[2]=“”; //arg[2]
設定為傳回參數 action

  var modalwin=window.showModalDialog("modal.htm",arg,option); //
開啟強制回應對話盒

  if (arg[1]==“”) {return;} //
設計為無傳回值就返回

  } 

***
注意:陣列是用來傳遞多個參數用, 如果只有一個參數要傳過去, 用單一變數傳遞即可
強制回應對話盒modal.htm之傳回函數

<SCRIPT LANGUAGE="JavaScript">

var arg=window.dialogArguments;  //
取得父視窗傳來之引數陣列

  switch (arg[0]) { //
依據caller參數來處理

    case 'select_element': {… modal_finished(code,action)}

    case 'add_element': {…modal_finished(code,action)}

    }

function modal_finished(code,action) {

  arg[1]=code; //
設定傳回參數1的值

  arg[2]=action; //
設定傳回參數2的值

  window.close(); //
關閉Modal對話盒

  }

</SCRIPT>
Modal 對話盒的選項參數 (不必全部設定, 需要才設)

dialogWidth :
對話盒寬度  dialogHeight : 對話盒高度(至少100px)  dialogLeft : 離螢幕左邊距離

dialogRight :
離螢幕右邊距離   dialogTop : 離螢幕上面距離  dialogBottom : 離螢幕下面距離

center :
是否置中 (yes/no/0/1/on/off)  scroll :是否顯示捲軸 (yes/no/0/1/on/off)  status :是否顯示狀態欄 (yes/no/0/1/on/off)   resizable : 是否可改變大小 (yes/no/0/1/on/off)  help : 是否顯示說明按鈕 (yes/no/0/1/on/off)   預設值除status(強制), resizableno,其他均為yes

*
另有HTA專用參數三個 : (yes/no/0/1/on/off)

dialogHide:
列印/預覽列印時是否隱藏對話盒(no)   edge:對話盒邊框樣式 (sunken/raised)

unadonorned : (no)
非強制回應對話盒的用法 (不須關閉該視窗,就能返回原瀏覽器)

var modalwin=window.showModalessDialog("modal.htm",arg,option); //
開啟非強制回應對話盒
用法與強制回應對話盒一樣
傳遞參數的第二種方法 : 利用 Object 物件

function call_modal() {

  var option=“dialogWidth:440px;dialogHeight:390px;status:off;help:off”; //
選項字串(對話窗參數)

  var obj=new Object(); //
產生一物件(作為原呼叫瀏覽器與對話框之介面)

  obj.caller=“select_element”;  //
設定屬性caller為傳入參數(用來辨別呼叫者-modal.htm多用途)

  obj.code=“”; //
設定屬性code為傳回參數 code

  obj.action=“”; //
設定屬性action為為傳回參數

  var modalwin=window.showModalDialog("modal.htm",obj,option); //
開啟強制回應對話盒

  if (obj.code==“”) {return;} //
設計為無傳回值就返回

  }

* modal.htm
內參考以陣列傳遞法相對應做如下改變 :

var obj=window.dialogArguments;

obj.code=code; obj.action=action;

*** 注意 : 如果傳遞的參數含有特殊碼, 例如是HTML碼或含有CRLF之文本, 則傳遞前先用 escape() 函數轉換為Latin-1編碼, 到了modal.htm 內再用 \unescape() 轉回來, 以免傳遞不全.

var modalwin=window.showModalessDialog("modal.htm",escape(arg),option); //
呼叫端

var arg=unescape(window.dialogArguments); //

沒有留言 :