9

我一直在做一些研究,我想我已经知道答案了,但我想知道是否有任何方法可以在不使用 javascript 或依赖 CSS3 媒体查询的情况下获得设备的屏幕尺寸和像素密度。

从本质上讲,我正在研究如何获得屏幕分辨率和像素密度,以便服务器可以决定在 URI 请求中要服务器的图像。

到目前为止,我还没有发现任何说这甚至是可能的,但我想,嘿,为什么不问呢?

4

6 回答 6

11

我不完全同意上述正确答案。实际上,这个答案在许多情况下是正确的……但理论上它不是。向 Web 服务器发出的请求通常包含一个 User-Agent 字段,理论上,该字段可用于识别有关设备屏幕分辨率和属性的信息。

Web 请求不会首先通过客户端。它们传递到服务器,然后服务器为客户端提供页面,因此服务器首先获取请求......例如,Ruby on Rails 通过动作控制器接收对资源的请求,然后为响应提供页面。

查看一个示例 UA 解析器,例如:https ://github.com/visionmedia/user-agent

我的计算机发送的示例用户代理是:

  User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like  enter code here`Gecko) Chrome/17.0.963.83 Safari/535.11

我认为非常有可能很好地猜测我的屏幕分辨率(DPI 等)是通过服务器提供的信息。当然,您需要一个设备信息表来参考。

对于移动设备,它变得更加容易。如果 User-Agent 是 iPad 的移动 safari:

  Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML,   like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10

您可以非常确定地知道服务器上的屏幕分辨率。您甚至可以通过该信息了解浏览器的高度和宽度。我怀疑 Android 或 Win Mo 等许多移动设备也是如此。

总而言之,我同意这样做是不切实际的,但我也不同意。

我相信 Facebook 已经承担了一个重大项目,对设备和屏幕分辨率进行编目并将其开源,因为他们在创建 facebook 移动应用程序时遇到了类似的问题,例如,他们必须对所有移动浏览器渲染器之间的所有差异进行分类,以便他们可以定制客户端应用程序以适应每一个个案。也许那个项目可能有必要的信息来做到这一点……理论上。

于 2012-03-30T05:31:56.420 回答
4

Ruby 在服务器端运行——没有从客户端获取信息,它无法知道任何客户端功能。

于 2011-09-29T11:44:43.297 回答
2

对于不可能的事情,看起来 Mobvious 做得不错:

Mobvious 检测您的应用程序/网站是否正在被手机、平板电脑或个人计算机访问。然后,您可以在整个应用程序中使用此信息。(例如,根据设备类型分叉您的前端代码。Ruby on Rails 有一个插件可以帮助您解决这个问题。)

https://github.com/jistr/mobvious

于 2013-05-11T19:32:14.407 回答
1

我遇到了同样的问题,并使用 getter 和 setter 路由作为窗口高度来解决它。如果 $height 变量为 0,则提供 get_heigt.erb,否则为 index.erb 这是一个单用户应用程序,因此我使用全局变量,对于不同的用户,您必须将该信息保存在 cookie 中。这里是重要的代码。

控制器:

get "/" do
  if $height == 0
    erb :get_height
  else
    erb :index
  end
end

get "/get_height" do
  erb :get_height
end

get "/set_height" do
  $height = params[:height]
  redirect "/"
end

get_height.erb

<script type="text/javascript">
  function send_message(message) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      document.location.reload(true);
    }
    xhttp.open("GET", "http://localhost:4567/" + message + "?height=" + window.innerHeight, true);
    xhttp.send();
  }

  send_message('set_height');
</script>
于 2021-11-18T18:52:42.233 回答
0

你可以使用Ahoy。current_visit 方法包含以下信息。

当有人访问您的网站时,Ahoy 会创建包含大量有用信息的访问。

流量来源 - 引荐来源、引荐域、登录页面、搜索
关键字位置 - 国家、地区和城市 技术 - 浏览器、操作系统和设备类型
utm 参数 - 来源、媒介、术语、内容、活动

于 2015-03-31T08:09:36.553 回答
0

不确定构建起来有多现实,但您可以构建一个数据库,它将您可以从服务器端的用户代理获取的特定设备类型映射到已知的屏幕尺寸。它仍然不允许像窗口大小这样的东西。

于 2020-10-27T12:36:21.097 回答