星期三, 10月 21, 2009

VBScript showModalDialog的window.returnValue無法回傳Array

簡單地說,因為MS09-054,發布KB974455,在此更新中微軟讓VBScript以前常用的一個DHTML技巧showModalDialog不再具有Array的returnValue,只能有單值的returnValue。請參考MSDN上的討論

Update : KB976749有描述這個問題,在KB976749應該解決了,所以下列解法僅供參考。

其實我完全沒在用VBScript,也不會寫VBScript,但是因為身為
倒楣
網管每次有一些不相容的東西都被主管塞給我做
自告奮勇解決,所以這次某舊系統的相容性又交由小弟處理。
解決方法:
  1. 反安裝patch,再利用WSUS/SMS設定不要下載,這防不到user自行update
  2. 把return value改成單值,如MSDN上的方法,我個人覺得很麻煩
  3. 偷偷地把值塞到window.opener裏,同樣要改不少code
  4. 改成JavaScript,經過在下測試,IE的JavaScript仍然能夠傳回Array,並且在Firefox 3.5與Chrome都能正常執行(傑克,這真是太神奇了)。雖然也是麻煩,但似乎一勞永逸。

測試頁面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>測試Modal Dialog傳回Array</title>
        <script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js">
        </script>
    </head>
    <body>
        <script language="javascript" type="text/javascript">
            function b(){
                var y = window.showModalDialog("x.htm", "Arguments", "dialogHeight: 200px; dialogWidth: 200px; dialogTop: 10px; dialogLeft: 10px; edge: Raised; center: Yes; help: Yes; resizable: Yes; status: Yes;");
                if (y == null) {
                 $('#theReturnValue').val('無傳回值');
                }
                else if (jQuery.isArray(y)) {
                    var str=y[0];
                    for(var i=1; i<y.length; i++)
                    {
                       str += ', '+y[i];
                    }
                    $("#theReturnValue").val('傳回長度為'+ y.length+'的陣列:'+str);
                }
                else {
                    $('#theReturnValue').val('傳回值非陣列:'+y);
                }
            }
        </script>
        <form id='form1' method='post' action=''>
            <div>
                測試Modal Dialog傳回Array
            </div>
            傳回值:<input type='text' value='' id='theReturnValue'/ readonly><input type='button' onclick='b();' value='test' />
        </form>
    </body>
</html>

測試Dialog頁面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Modal Dialog</title>
    </head>
    <body>
        <script language="JavaScript" type="text/javascript">
            function testWinReturn() {
                var sArr = [];
                sArr[sArr.length] = '1';
                sArr[sArr.length] = '2';
                sArr[sArr.length] = '3';
            window.returnValue=sArr;
            this.close();
            }
            
            function retOneValue(){
             window.returnValue=6;
             this.close();
            }
        </script>
        <form name="form1" method="post" action="" id="form1">
            <div>我是Modal Dialog</div>
            <div><input type='button' value='回傳陣列' onclick='testWinReturn();' /></div>
            <div><input type='button' value='回傳單值' onclick='retOneValue();' /></div>
            
        </form>
    </body>
</html>

1 則留言:

匿名 提到...

感謝您的分享,為我解決了一個難題,謝謝