在原使用 ASP.NET 開發的網頁中,使用 window.showModalDialog 開啟查詢子視窗,再傳回查詢結果。但是 window.showModalDialog 在新版的瀏覽器,如 Firefox 或 Chrome,已被移除。只好繞彎,改用 jQuery UI 來達成。
參考:showModalDialog jquery plugin,其原始文章為 window.showModalDialog() - Cross Browser, new version。
showModalDialog.js 如下:
// Based on this article: http://extremedev.blogspot.com/2011/03/windowshowmodaldialog-cross-browser-new.html/*Usage example:var url = 'test.html';$.showModalDialog({ url: url, height: 500, width: 900, scrollable: false, onClose: function(){ var returnedValue = this.returnValue; }});UPDATE August 2012: Looks like there is a problem when setting DocType: HTML 4.01 Doctype on top of extremedevStart.html. --> The popup does not close.To fix this use:$dlg.dialogWindow.dialog('close');instead of:window.close();*/var $dialog = null;jQuery.showModalDialog = function (options) { var defaultOptns = { url: null, dialogArguments: null, height: 'auto', width: 'auto', position: 'center', resizable: true, scrollable: true, onClose: function () { }, returnValue: null, doPostBackAfterCloseCallback: false, postBackElementId: null }; var fns = { close: function () { opts.returnValue = $dialog.returnValue; $dialog = null; opts.onClose(); if (opts.doPostBackAfterCloseCallback) { postBackForm(opts.postBackElementId); } }, adjustWidth: function () { $frame.css("width", "100%"); } }; // build main options before element iteration var opts = $.extend({}, defaultOptns, options); var $frame = $('<iframe id="iframeDialog" />'); if (opts.scrollable) $frame.css('overflow', 'auto'); $frame.css({ 'padding': 0, 'margin': 0, 'padding-bottom': 10 }); var $dialogWindow = $frame.dialog({ autoOpen: true, modal: true, width: opts.width, height: opts.height, resizable: opts.resizable, position: opts.position, overlay: { opacity: 0.5, background: "black" }, close: fns.close, resizeStop: fns.adjustWidth }); $frame.attr('src', opts.url); fns.adjustWidth(); $frame.load(function () { if ($dialogWindow) { var maxTitleLength = 50; var title = $(this).contents().find("title").html(); if (title.length > maxTitleLength) { title = title.substring(0, maxTitleLength) + '...'; } $dialogWindow.dialog('option', 'title', title); } }); $dialog = new Object(); $dialog.dialogArguments = opts.dialogArguments; $dialog.dialogWindow = $dialogWindow; $dialog.returnValue = null;}//function postBackForm(targetElementId) {// var theform;// theform = document.forms[0];// theform.__EVENTTARGET.value = targetElementId;// theform.__EVENTARGUMENT.value = "";// theform.submit();//}var prntWindow = getParentWindowWithDialog(); //$(top)[0];var $dlg = prntWindow && prntWindow.$dialog;function getParentWindowWithDialog() { var p = window.parent; var previousParent = p; while (p != null) { if ($(p.document).find('#iframeDialog').length) return p; p = p.parent; if (previousParent == p) return null; // save previous parent previousParent = p; } return null;}function setWindowReturnValue(value) { if ($dlg) $dlg.returnValue = value; window.returnValue = value; // in case popup is called using showModalDialog}function getWindowReturnValue() { // in case popup is called using showModalDialog if (!$dlg && window.returnValue != null) return window.returnValue; return $dlg && $dlg.returnValue;}if ($dlg) window.dialogArguments = $dlg.dialogArguments;if ($dlg) window.close = function () { if ($dlg) $dlg.dialogWindow.dialog('close'); };function CloseWindow() { if ($dlg) { $dlg.dialogWindow.dialog('close'); } else { ForceCloseWindow(); }}function ForceCloseWindow() { var browserName = navigator.appName; var browserVer = parseInt(navigator.appVersion); //alert(browserName + " : "+browserVer); //document.getElementById("flashContent").innerHTML = "<br> <font face='Arial' color='blue' size='2'><b> You have been logged out of the Game. Please Close Your Browser Window.</b></font>"; if (browserName == "Microsoft Internet Explorer") { var ie7 = (document.all && !window.opera && window.XMLHttpRequest) ? true : false; if (ie7) { //This method is required to close a window without any prompt for IE7 & greater versions. window.open('', '_parent', ''); window.close(); } else { //This method is required to close a window without any prompt for IE6 this.focus(); self.opener = this; self.close(); } } else { //For NON-IE Browsers except Firefox which doesnt support Auto Close try { this.focus(); self.opener = this; self.close(); } catch (e) { } try { window.open('', '_self', ''); window.close(); } catch (e) { } }}要使用此功能,必須先載入 jQuery 及 jQuery UI。主程式範例如下
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Show Modal Dialog Test</title> <link rel="stylesheet" type="text/css" href="css/ui-lightness/jquery-ui-1.10.4.custom.min.css"></head><body><h1>Show Modal Dialog Test</h1>課號: <span id='txt-cono'></span><br><br><button id="btn-query">查詢</button><script type="text/javascript" src="js/jquery-1.10.2.js"></script><script type="text/javascript" src="js/jquery-ui-1.10.4.custom.min.js"></script><script type="text/javascript" src="js/showModalDialog.js"></script><script type="text/javascript">$('#btn-query').click(function(){ var url = 'popup-test.html'; $.showModalDialog({ url: url, dialogArguments: '課程資料查詢', height: 500, width: 900, scrollable: false, onClose: function() { var returnedValue = this.returnValue; $('#txt-cono').text(returnedValue.cono); } });});</script></body></html>popup-test.html 原始程式如下。
<!DOCTYPE html><html><head> <title>Popup Target</title></head><body><h1 id='h1-title'></h1><table> <tr> <td><button data-cono="004 40110">傳回</button></td><td>004 40110</td> </tr><tr> <td><button data-cono="004 M0130">傳回</button></td><td>004 M0130</td> </tr><tr> <td><button data-cono="222ED5010">傳回</button></td><td>222ED5010</td> </tr><tr> <td><button data-cono="323EU2260">傳回</button></td><td>323EU2260</td> </tr></table><script type="text/javascript" src="js/jquery-1.10.2.js"></script><script type="text/javascript" src="js/jquery-ui-1.10.4.custom.min.js"></script><script type="text/javascript" src="js/showModalDialog.js"></script><script type="text/javascript">$(document).ready(function(){ $('#h1-title').text(window.dialogArguments);});$('table button').click(function(){ var cono = $(this).attr('data-cono'); setWindowReturnValue({cono: cono}); /* window.close() 在 IE 或其他情況下,可能沒有作用 要改成下列指令 */ $dlg.dialogWindow.dialog('close');});</script></body></html>