近来写的web应用要发布在Mozilla浏览器下使用,遇到一些比较奇怪的问题,现写出来与大家一起
分享.
1.根据浏览器的不同自动来切换到不同的页面
因为在IE下和Mozilla浏览器下显示的页面还是有很大的不同,所以为方便代码的维护,还是决定将两
种不同浏览器下的web程序分开了,这样显得条理更清晰.
此功能可以很简单的通过javascript脚本来控制页面的不同展现,代码如下:
<%
String toUrl = request.getContextPath()+"/pcitc/main/web0.jsp";
String toMzUrl = request.getContextPath()+"/pcitc/main/web0_mz.jsp";
%>
<script language=javascript>
if((navigator.appName == "Microsoft Internet Explorer") && (parseInt(navigator.appVersion)>= 4))
{
document.location="<%=toUrl%>";
}
else {
document.location="<%=toMzUrl%>";
}
</script>
2.要注意发布端口的选择对javascript的影响(mozilla浏览器)
同样的javascript脚本在不同的端口发布会产生不同的结果,主要说的是80端口和非80端口,如
果web应用程序是发布在非80端口的话,mozill浏览器会认为该web应用程序还处在开发阶段,故
安全级别会比较低,在这种情况下,一般的javascript脚本和在IE下显示的效果是没什么区别的,
但如果一旦将web应用程序发布到80端口,此时mozilla浏览器会将对javscript的安全级别提高,某
些原本在其他端口能正常显示的功能会突然变的不正常,那么这个时候就应该调整javscript的代
码,尽量使其更安全.
举例:在IE中我们经常要操作在子窗体中获得父窗体的某个frame的某种特性或操作其他窗体的
显示
父窗体代码:
<script language=javascript>
function setCategoryValue(appId,cateCode,cateOid,userId,canEditIds) {
appFrame.location='http://<%=request.getServerName()%>:<%=request.getServerPort()%>/pmi/ltmetainfo/pcitcinfolist.jsp?app_id='+appId+'&category='+cateCode+'&cateOID='+cateOid+'&user_id='+userId+"&isfirst=1
&can_edit_ids="+canEditIds;
}
</script>
<FRAMESET ID="app" FRAMESPACING="0" COLS="20%,8,*">
<FRAME SRC="http://<%=request.getServerName()%>:<%=request.getServerPort()%>/pmi/ltmetainfo/subjecttree.jsp?user_id=<%=userId%>" NAME="subjectTreeFrame"
SCROLLING="AUTO" border="0" frameborder="no">
<FRAME NAME=middle SRC="app_middle.jsp" noResize SCROLLING="NO" frameborder="no">
<FRAME SRC="" NAME="appFrame" SCROLLING="AUTO" ID="appFrameId" frameborder="no">
</FRAMESET>
子窗体subjecttree.jsp:
url="javascript:parent.setCategoryValue(\\'"+appId+"\\',\\'"+sub.getCode()+"\\',\\'"+sub.getCateOID()+"\\',\\'"+userId+"\\',\\'"+canEditIds+\\');
此代码去调用父窗体的setCategoryValue函数来展现appFrame的内容.
原本这样的代码在其他端口就能正常显示,但一部署到80端口,该js脚本就出错.错误的原来是
在mozilla浏览器下80端口中parent方法不能使用.在反复思考和调试下,决定将parent方法摈弃掉,
而改用表单提交的方法,所以对subjecttree.jsp做如下的修改:
url="javascript:setCategoryValue(\\'"+appId+"\\',\\'"+sub.getCode()+"\\',\\'"+sub.getCateOID()+"\\',\\'"+userId+"\\',\\'"+canEditIds+\\');
将其中的parent删除,同时将setCategoryValue方法移到该页面.
function setCategoryValue(appId,cateCode,cateOid,userId,canEditIds) {
document.menu_right.action="http://<%=request.getServerName()%>:<%=request.getServerPort()%>/pmi/ltmetainfo/pcitcinfolist.jsp?app_id="+appId+"&category="+cateCode+"&cateOID="+cateOid+"&user_id="+userId+"&isfirst=1
&can_edit_ids="+canEditIds;
document.menu_right.submit();
}
然后添加一个表单,表单中指定要操作的对象是appFrame,代码如下:
<form name="menu_right" action="" method="post" target="appFrame">
</form>
做上述修改后,页面方正常显示.