CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

探究客户端浏览器分辨率的自适应问题(如何使网站脚本自动适应客户端分辨率,我们经常遇到的问题的解决方案)

楼主johnsuna(缘来是e)2004-12-03 22:23:58 在 .NET技术 / ASP.NET 提问

今天看到孟子老大的一篇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?  
   
  欢迎大家都来讨论讨论,一定都用得上。因为现在的浏览器类别实在太多了,需要找到一个较好的解决方案。 问题点数:20、回复次数:25Top

1 楼jack4811(5年以后...)回复于 2004-12-04 01:07:50 得分 5

用JS!代码如下  
  onclick=alert("你的显示分辩率为:"+screen.width+"×"+screen.height)  
  先做好几个页面,比如一个htm1.htm是800*600,一个是htm2.htm是1024*768的  
  然后在你的入口页面   index.htm   中判断:  
  <html>  
  <head>  
  <script   language=javascript>  
  <!--  
  function   mHref()   {  
  if   (screen.width   ==   1024)   location.href   =   "htm2.htm";  
  else   if   (screen.width   ==   800)   location.href   =   "htm1.htm";  
  else   return(false);  
  }  
  //-->  
  </script>  
  </head>  
  <body   onload="mHref();">  
  </body>  
  </html>Top

2 楼qixiao(七小)(Gadgets中文网http://www.gadgets.net.cn)回复于 2004-12-04 02:51:53 得分 0

学习Top

3 楼Miracle(新一代的开山怪)回复于 2004-12-04 04:39:24 得分 3

其实没那么麻烦的  
  1、制作一组css文件,分被用于在不同分辨率下的屏幕布局设置  
  2、根据css文件,设计页面布局  
  2、在页面加载过程中取得屏幕分辨率(上面已经贴了代码了),然后根据分辨率,重新设定页面严肃应该应用的css   class。  
  这个过程中完全不需要服务器代码参与,没有post-back。Top

4 楼Miracle(新一代的开山怪)回复于 2004-12-04 04:40:53 得分 0

如果不会用css,本办法就是用jack4811的例子,有几种分辨率就搞几套页面,在引导页面里面检测分辨率,然后载入不同的页面版本。强烈不推荐,呵呵Top

5 楼Miracle(新一代的开山怪)回复于 2004-12-04 04:42:57 得分 2

更正一下,“重新设定页面严肃应该应用的css   class”为“重新设定页面元素应该应用的css   class”之误。  
   
  另外,要将最佳分辨率下的css模板设置为默认,这样的话可以大大减少重新应用style的可能性。Top

6 楼leo2003(【健者天行】谁伴我闯荡)回复于 2004-12-04 08:58:29 得分 0

markTop

7 楼johnsuna(缘来是e)回复于 2004-12-04 10:07:53 得分 0

楼上几位:  
  使用CSS不失为一个办法,就类似asp.net的Theme功能,这样做也会有困难:  
  如何根据分辨率加载不能的css文件呢?如果一个网站有非常多的页面时,每个文件都需要加入相应的分辨率判定和CSS引导的JavaScript  
   
  如果在服务器端采用IHttpHandler或者使用自定义控件,在客户端浏览文件前做出处理,然后由IIS自动处理岂不更好?  
   
  以下是我昨晚探索出来的结果,仍需要大力完善,欢迎大家继续探讨。  
   
  1、首先按照本贴开头的方法,建立一个GetScreen.aspx取得客户端分辨率并将之赋予Session["ScreenResolution"],同时为了自动转向  
  在本贴开头所示代码中加入以下关键代码:  
  string   w=Request.Form["WidthPixel"];//得到屏幕分辨率X  
  string   h=Request.Form["HeightPixel"];//得到屏幕分辨率Y  
  Session["ScreenResolution"]=w+"*"+h;//赋值给Session  
  //转向(更多相关代码见下)  
  if(Session["UrlReferrer"]!=null)  
  {  
  Response.Redirect(Session["UrlReferrer"].ToString());  
  }  
   
  2、在Global.asax中:  
  <Script   Runat="Server"   Language="C#">  
  public   static   string   strUrl;//用于取得用户刚进入时的页面链接  
   
  protected   void   Application_BeginRequest(Object   sender,EventArgs   e)  
  {  
      strUrl=Request.RawUrl.ToString();  
  }  
  protected   void   Application_EndRequest(Object   sender,   EventArgs   e)  
  {  
  }  
   
  protected   void   Application_Start(Object   sender,   EventArgs   e)    
  {    
  }    
  protected   void   Session_Start(Object   sender,   EventArgs   e)    
  {    
    if   (Session["ScreenResolution"]   ==   null)  
    {    
     Response.Redirect("/GetScreen.aspx");   //如果未取得客户端浏览器分辨率,则定向到GetScreen.aspx,获取之。  
    }  
    Session["UrlReferrer"]   =   strUrl;//将最初请求页面放在Session中,以便在第1条所示代码中重定向  
  }  
  protected   void   Session_End(Object   sender,   EventArgs   e)    
  {    
  }    
  </Script>  
   
  3、在需要做分辨率处理的页面中:  
  <Script   language="c#"   runat="server">  
  private   string   screenWidth;  
  void   Page_Load(Object   sender,EventArgs   e)  
  {  
  if(Session["ScreenResolution"]!=null)  
  {  
  screenWidth=Session["ScreenResolution"].ToString().Split('*')[0].ToString();  
  }  
  }  
  </Script>  
  这里在<Body>区内作示例:  
  <body   bgcolor="#0000FF"   background="MyPicture<%=screenWidth%>.gif"   leftmargin="0"   topmargin="0"   marginwidth="0"   marginheight="0">Top

8 楼johnsuna(缘来是e)回复于 2004-12-04 10:23:33 得分 0

优点:一次检测,多次使用。  
  缺点:需要客户端COOKIE的支持,因为使用了Session.  
  ------------------------------------------  
  备注:  
  ------------------------------------------  
  在上述示例中可以更简化一下,那就是:  
  在第1条中:  
  设置Session["ScreenResolutionX"]和Session["ScreenResolutionY"]:  
  Session["ScreenResolutionX"]=Request.Form["WidthPixel"];//得到屏幕分辨率X并赋值给Session  
  Session["ScreenResolutionY"]=Request.Form["HeightPixel"];//得到屏幕分辨率Y并赋值给Session  
   
  在第3条中直接在<Body>区内使用:  
  <body   bgcolor="#0000FF"   background="MyPicture<%=Session["ScreenResolutionX"].ToString()%>.gif"   leftmargin="0"   topmargin="0"   marginwidth="0"   marginheight="0">  
   
  另外:检测分辨率的代码可以更简化一些:  
  //GetScreen.aspx(注:未做仔细调试)  
  <script   runat="server"   language="C#">    
          public   void   Page_Load(Object   sender,   EventArgs   e)  
                  {    
                                  if   (Request.QueryString["action"]   !=   null)  
                                  {    
                                          Session["ScreenResolutionX"]   =   Request.QueryString["resX"].ToString();    
                                          Session["ScreenResolutionY"]   =   Request.QueryString["resY"].ToString();    
                                          Session["ScreenResolutionD"]   =   Request.QueryString["resD"].ToString();    
                                          if(Session["UrlReferrer"]!=null)  
                                          {  
                                                  Response.Redirect(Session["UrlReferrer"].ToString());  
                                          }  
                                  }    
                  }    
  </script>    
  <HTML><BODY>    
  <script   language="javascript">    
  res   =   "&resX="+screen.width+"&resY="+screen.height+"&resD="+screen.colorDepth;  
  top.location.href="GetScreen.aspx?action=set"+res;  
  </script>    
  </BODY></HTML>Top

9 楼yichuan1982(亦川——四川新津)回复于 2004-12-04 10:37:28 得分 1

一般就是按800*600,Top

10 楼thinhunan(THIN[MVP_asp.net])回复于 2004-12-04 11:30:20 得分 2

用CSS的方式也行啊,  
  在页面Load时,Response.Write("<link...."+Css文件名+"...>")就行了Top

11 楼forideal(我心飞翔)回复于 2004-12-04 11:57:57 得分 2

这样你要做两种页面,工作量太大了。可以使用百分比定义网页中元素的宽度,这样就可以自适应分辩率了,不过很不好定位,不适用于大型或内容复杂的网页。所以还是建议你做一个页面,宽度不超过778像素就可以了,现在几乎所有的网站都是这样做的。Top

12 楼johnsuna(缘来是e)回复于 2004-12-04 18:04:50 得分 0

<Script   language="c#"   runat="server">  
  void   Page_Load(Object   sender,EventArgs   e)  
  {  
    if(Session["ScreenResolutionX"]   !=   null)  
    {  
      ScreenResolutionX.Text   =   Session["ScreenResolutionX"].ToString();  
    }  
  }  
  </Script>  
  </head>  
   
  <body   bgcolor="#0000FF"   background='BgPicture<asp:Literal   runat="server"   id="ScreenResolutionX"   />.gif'>  
  其中<asp:Literal   runat="server"   id="ScreenResolutionX"   />为客户端分辨率,现在服务器端已可以取得Session["ScreenResolutionX"]的值了,由于网站有很多页,所以有没有一种办法可以实现自动在Global.asax或web.config中采用IHttpHandler进行全站控制,而不用每个网页都使用上述代码。就好象UrlRewritter一样?  
   
  不知道Page_Load如何重载或者追加一个EventHandler?Top

13 楼ydsunny(在路上)回复于 2004-12-04 18:28:10 得分 3

都太麻烦,只要把所有的width属性都设成%模式的话无论什么分辩率都可以显示的很好Top

14 楼jack4811(5年以后...)回复于 2004-12-04 18:49:39 得分 0

继续学习。。。。Top

15 楼jack4811(5年以后...)回复于 2004-12-04 18:50:05 得分 0

小强很弓虽Top

16 楼johnsuna(缘来是e)回复于 2004-12-04 21:30:41 得分 0

小强:没有那么简单,有些图片方面的东西是不能与%号解决问题的。Top

17 楼gwallan()回复于 2004-12-04 23:20:57 得分 1

好问题,大家继续探讨Top

18 楼johnsuna(缘来是e)回复于 2004-12-05 23:16:27 得分 0

http://blog.csdn.net/johnsuna/中会有进一步的结果,欢迎关注。Top

19 楼Erase(我不是共产党员)回复于 2004-12-05 23:26:39 得分 0

学习中Top

20 楼johnsuna(缘来是e)回复于 2004-12-07 10:32:49 得分 0

顶.........Top

21 楼lufree(荆州城公子三求计,博望坡军师初用兵)回复于 2004-12-16 11:33:53 得分 0

upTop

22 楼zjjszw(【湘:張家界】穿裤叉的蚊子【抵制日貨】)回复于 2005-02-15 14:47:42 得分 0

upTop

23 楼ld_thinking(懒得想)回复于 2005-02-15 14:56:13 得分 1

学习       但是觉得好的页面设计可以解决这一问题Top

24 楼fengyecsdn(幸福的屁颠颠~HOHO 最近事业爱情都顺利!加油)回复于 2005-02-15 16:21:24 得分 0

UUUUPPPPPTop

25 楼RedDuke(RedDuke)回复于 2005-02-18 11:29:56 得分 0

upTop

相关问题

  • 请教:如何知道浏览器的分辨率。
  • ASP中如何获得用户浏览器的分辨率??????
  • 怎样得到浏览器的分辨率?
  • 怎样让ASP页自适应浏览器的分辨率???谢谢!
  • 用asp怎么取得客户端的浏览器的分辨率
  • 请教PHP+JS如何获取客户端浏览器的分辨率?
  • 如何download写在注释里的浏览器端脚本?
  • 如何避开浏览器的脚本错误?
  • 如何在浏览器中禁止脚本的执行
  • 浏览器对象能否用于服务器端脚本?

关键词

  • asp.net
  • 客户
  • 解决
  • 网站
  • 分辨率
  • 客户端
  • 适应
  • 问题
  • 没有

得分解答快速导航

  • 帖主:johnsuna
  • jack4811
  • Miracle
  • Miracle
  • yichuan1982
  • thinhunan
  • forideal
  • ydsunny
  • gwallan
  • ld_thinking

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo