探究客户端浏览器分辨率的自适应问题(如何使网站脚本自动适应客户端分辨率)(1)

类别:.NET开发 点击:0 评论:0 推荐:

今天看到孟子老大的一篇E文,关于服务器端如何得知客户端浏览器分辨率的文章,经简化改为如下:
<%@ Page language="c#" EnableViewState = "false" debug="true" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
  <HEAD>
    <title>检测客户端显示器分辨率</title>
    <META http-equiv="Content-Type" content="text/html; charset=gb2312">
    <meta content="检测客户端分辨率" name="Description">
 <Script language="c#" runat="server">
 void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
   System.Web.UI.WebControls.Button Button1 = new System.Web.UI.WebControls.Button();
   if(!IsPostBack)
   {
    System.Web.UI.HtmlControls.HtmlInputHidden btnW = new System.Web.UI.HtmlControls.HtmlInputHidden();
    System.Web.UI.HtmlControls.HtmlInputHidden btnH = new System.Web.UI.HtmlControls.HtmlInputHidden();
    Button1.ID = "Button1";
    btnW.Name = "WidthPixel";
    btnW.ID = "WidthPixel";
    btnH.Name = "HeightPixel";
    btnH.ID = "HeightPixel";
    this.FindControl("browserpeek").Controls.Add(btnW);
    this.FindControl("browserpeek").Controls.Add(btnH);
    this.FindControl("browserpeek").Controls.Add(Button1);
    string scriptString = "";
    scriptString += "document.all.browserpeek.WidthPixel.value=window.screen.width;\r\n";
    scriptString += "document.all.browserpeek.HeightPixel.value=window.screen.height;\r\n";
    this.RegisterOnSubmitStatement("Meng", scriptString);
    this.MyBody.Attributes.Add("onload", "document.all."+Button1.ClientID+".click();");
   }
   else
   {
    this.MyBody.Attributes.Remove("onload");
    if(this.FindControl("browserpeek").Controls.Contains(Button1))
    {
     this.FindControl("browserpeek").Controls.Remove(Button1);
     Button1.Dispose();
    }
    System.Text.StringBuilder strLabel = new System.Text.StringBuilder();
    HttpBrowserCapabilities bc = Request.Browser;
    strLabel.Append("您的浏览器的分辨率为:");
    strLabel.Append(Request.Form["WidthPixel"]);
    strLabel.Append("×");
    strLabel.Append(Request.Form["HeightPixel"]);
    Label1.Text = strLabel.ToString();
   }
  }
 </Script>
  </HEAD>
  <body id="MyBody" runat="server">
    <form id="browserpeek" runat="server" name="browserpeek">
      <asp:label id="Label1" runat="server"></asp:label>
   </form>
  </body>
</HTML>

其原理是:当客户端打开网页时,自动点击“模拟按钮”,根据客户端浏览器的分辨率反馈给服务器后再由服务器返回。

现在我的目的是想将此脚本放在Global.asax的:
  protected void Session_Start(Object sender, EventArgs e)
  {
       //就是这里了
    }
让每个访问者一旦进入网站,首先检测一个Session["ScreenWidthPixel"]和Session["ScreenHeightPixel"]如果有此值,则不再做检测浏览器的步骤而直接进入自动适应的网页。否则进入浏览器的分辨率检测,然后将结果赋值给Session["ScreenWidthPixel"]和Session["ScreenHeightPixel"]。

问题来了:
1、如果有网页已经含<form runat="server" id="....">时,上述办法不可行。因为asp.net中只允许一个<form runat="server" ...>,按上述原理进行提交服务器的话,如果网页还有其他提交也必定造成负面影响。
2、还有一个办法,就是采用Server.Transfer或Response.Redirect("GetScreen.aspx"),但也会造成一定的负页影响,比如:需要返回原来页面的问题。
3、考虑使用IHttpHandler?

欢迎大家都来讨论讨论,一定都用得上。因为现在的浏览器类别实在太多了,需要找到一个较好的解决方案。

本文地址:http://com.8s8s.com/it/it42485.htm