English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Проблемы с диалоговым окном ![window.dialogArguments] в模式的 окне

Недавно, когда я работал над проектом, я встретил проблему совместимости браузеров, после решения проблемы я записал это и также разместил информацию о modalных окнах!

Подробное описание проблемы:

В браузере Firefox при вызове подокна, на подстранице есть разделы, после перехода на следующую страницу подстраница обновляется, и затем объект window.dialogArguments теряется, alert выводит undefined [решение см. в третьем пункте]

В последнее время, когда я делал веб-сайты, мне потребовалась функция modalного окна, и я встретил некоторые проблемы, поэтому я изучил информацию, чтобы решить их

1. Различные методы для создания弹出窗口:

a.window.open(pageURL, name, parameters);
Метод b.window.showModalDialog() используется для создания modalного диалогового окна, отображающего HTML-контент (поддерживается IE 4+)
Метод c.window.showModelessDialog() используется для создания не-modalного диалогового окна, отображающего HTML-контент (поддерживается IE 5+)

2. Проблемы с стилем отображения: используемый метод window.showModalDialog(), окно, вызванное этим методом, в IE6 отображается на высоту немного меньше, чем в IE7 и IE8, поэтому вы можете написать js, чтобы решить эту проблему (в IE6 высота должна быть увеличена на около 35px, атрибут dialogLeft можно настроить в зависимости от ширины экрана)
代码片段如下:

 var swidth=window.screen.width;
 if(parseInt(width)>swidth)
 swidth=100;
 else
 swidth=(swidth-parseInt(width))/2;
var windowStatus="dialogWidth:"+width+"px;dialogHeight:"+height+"px;dialogTop:80px;dialogLeft:"+swidth+"px;center:1;status:no;scroll:no;resizable:no;help:no;";
//弹出方法
 if(url.indexOf("?")<0){window.showModalDialog(url+'?setTime='+newDate().getTime(),obj,windowStatus);}
 else{window.showModalDialog(url+'&setTime='+newDate().getTime(),obj,windowStatus);}

3.dialogArguments对象FF浏览器中丢失问题: 弹出showModalDialog窗口中需要分页显示数据,点击页面中的信息,获取分页数据的ID,传给弹出的父窗口。在IE下运行很正常,但在FireFox 3.0中运行时,如果页面不跳转则可以正常的调用window.dialogArguments,若页面一跳转则会丢失window.dialogArguments的引用

现给出2种解决方法:

a.将showModalDialog窗口的页面放在frameset或者iframe里面,进行一次包装。
例:
window.showModalDialog("test.aspx");

test.aspx 页面内容

<frameset cols="0,*">
<frame src=""/>
<frame src="分页显示数据的页面"/>
</frameset> 

页面返回方法变成

function returnValue(flag)
{
 var myObj = window.parent.dialogArguments;
 myObj.value = flag;
 window.parent.close();
{}

Таким образом, можно получить возвращаемое значение

b. Если не хотите создавать дополнительную страницу, можно использовать следующий метод, который использует объект window.opener.document. Этот объект не поддерживается IE7 и IE8 (проверял, не знаю, как на вашем компьютере), определите, какой браузер используется, затем установите значение скрытого поля родительской страницы и родительская страница обработает это;

Код следующий:

function returnValue(flag)
 {
 document.getElementById("rValue").value=flag;
 if (window.ActiveXObject) //IE браузер 
 {
 var myObj = window.dialogArguments;
 //alert(myObj);
 myObj.value = flag;
 window.close();
 {}
 else{
 window.opener.document.getElementById("hid_oilid").value=flag;
 window.opener.document.getElementById("txt_oil").value=flag+"号";
 //self.close();
 window.close();
 {} 
 {}

Все основные проблемы уже решены, для передачи значений между родительской и дочерней страницами можно много参阅 других материалов

Давай посмотрим!