1. 程式人生 > >高版本Chrome相容window.showModalDialog辦法

高版本Chrome相容window.showModalDialog辦法

高版本Chrome相容window.showModalDialog辦法

由於showmodaldialog 不屬於W3C標準,在新版本瀏覽器中不再受支援,我們需要使用window.open來自定義一個showmodaldialog 來代替。

將要開啟模態框的主頁面papa.html程式碼:

<!DOCTYPE html>
<html lang="zh">
<head>
<title>主頁面</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
</head>
<body>
<input id="a"/>
<button onclick="callSon()">開啟模態框</button/>
<fieldset>
<legend>子頁面返回</legend>
<span id="content"></span>
</fieldset>
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.js"></script>
<Script type="text/javascript">
//定義一個全域性變數判定是否原生支援showModalDialog方法
var has_showModalDialog = !!window.showModalDialog;
//當其不受支援時自定義window.showModalDialog
if(!has_showModalDialog){
	window.showModalDialog = function(url,dialogArguments,features){
		if(window.hasOpenWindow){
			//避免彈出多個視窗
			alert("您已經打開了一個視窗!請先處理它");
			window.myNewWindow.focus();
			return;
		}
		//因window.showmodaldialog 與 window.open 引數不一樣,所以封裝的時候用正則去格式化一下引數
		if(features)
			var features = "modal=yes,"+features.replace(/(dialog)|(px)/ig,"").replace(/;/g,',').replace(/\:/g,"=");
		var left = (window.screen.width - parseInt(features.match(/width[\s]*=[\s]*([\d]+)/i)[1]))>>1;
		var top = (window.screen.height - parseInt(features.match(/height[\s]*=[\s]*([\d]+)/i)[1]))>>1;
		features+=',left='+left+',top='+top;//視窗居中
		window.myNewWindow = window.open(url,"_blank",features);
		window.hasOpenWindow = true;
		//open()不支援傳遞引數,通過這種方式向子頁面傳遞引數,因為開啟頁面速度遠遠慢於本方法執行速度,因而子頁面總能獲得傳遞的引數
		if(dialogArguments)
			window.myNewWindow.dialogArguments=dialogArguments;
		//window.myNewWindow.moveTo(left,top);
	}
}
//開啟模態框
function callSon(){
	url = 'son.html';
	var sonStyle="dialogWidth:500px;dialogHeight:450px;help:no;resizable:no;center:yes;scroll:yes;status:no";
	var param={val:document.getElementById("a").value?document.getElementById("a").value:"son"}
	var val = window.showModalDialog(url,param,sonStyle);
	//chrome 返回 因為IE下showModalDialog是阻塞的 open不一樣;
	if(!has_showModalDialog) return;	
	afterCall(val);
}
//為開啟的子視窗定義方法,讓開啟的視窗關閉時通過window.opener賦值回來並執行
function callSonChrome(val){
	afterCall(val);
}
//獲得模態框返回值後執行的業務方法
function afterCall(val){
	$("#content").html(val);
}
</script >
</body>
</html>

被開啟的模態框子頁面son.html程式碼:

<!DOCTYPE html>
<html lang="zh">
<head>
<title>子頁面</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
</head>
<body>
<input id="a"/>
<button onclick="closeToRetuen()">關閉模態框並返回</button>
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.js"></script>
<Script type="text/javascript">
var param  = window.dialogArguments;
document.getElementById("a").value=param.val;
function closeToRetuen() {
	var a = $("#a").val();
	//chrome環境 
	if (window.opener != undefined) { 
		//關閉前呼叫父視窗方法返回需要返回的物件或字串
		window.opener.callSonChrome(a); 
	}  
	//ie環境
	else {  
		window.returnValue = a;
	}
	window.close();
}
//頁面關閉時主動通知呼叫頁面我將關閉
window.onbeforeunload=function(){
	window.opener.hasOpenWindow=false;
}
</script >
</body>
</html>

測試:
測試瀏覽器Google Chrome 版本 69.0.3497.100(正式版本) (64 位)
開啟模態框
開啟模態框
關閉模態框
關閉模態框
參考文章:

https://blog.csdn.net/ts472960087/article/details/45843257