English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Vor einigen Tagen habe ich bei einem Projekt eine Browser-Kompatibilitätsproblematik begegnet. Nach der Lösung habe ich dies notiert und auch die Modalisierungsdokumentation bereitgestellt!
Detaillierte Beschreibung des Problems:
Ein Pop-up-Fenster im Firefox-Browser öffnen, auf der Unterseite ist eine Paginierung, wenn Sie auf die nächste Seite klicken, wird die Unterseite neu geladen, und dann wird das Objekt window.dialogArguments verloren gehen, alert gibt undefined aus [Lösung siehe Punkt 3]
Bei der Erstellung einer Website vor kurzem war es notwendig, die Funktion modalisierter Fenster zu verwenden, und ich habe auch einige Probleme dabei begegnet. Daher habe ich nach Informationen gesucht, um diese zu lösen
1Verschiedene Methoden zum Öffnen eines Pop-up-Fensters:
a.window.open(pageURL,name,parameters);
Die Methode b.window.showModalDialog() wird verwendet, um einen modalen Dialog mit HTML-Inhalten anzuzeigen (IE 4+支持)
Die Methode c.window.showModelessDialog() wird verwendet, um einen nicht modalen Dialog mit HTML-Inhalten anzuzeigen (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(); } }
基本所遇到问题均已经解决,关于父页面与子页面传值可以多参阅其他资料