mimmi20 / modernizr-server
为您的应用提供浏览器和功能检测
Requires
- php: >=5.6.0
Requires (Dev)
- fabpot/php-cs-fixer: ^1.11
- phpunit/phpunit: ^5.2
- squizlabs/php_codesniffer: ^2.5
This package is not auto-updated.
Last update: 2022-02-01 12:50:38 UTC
README
Modernizr是了解用户浏览器能力的好方法。然而,您只能在浏览器本身上访问其API,这意味着您无法轻松地从服务器逻辑中受益于了解浏览器能力。
渐进增强、媒体查询和body类可以很好地用于调整网站及其外观。但对于网站和页面的结构更改,有时最初从服务器发出正确的标记会更加简单。
modernizr-server库是将Modernizr浏览器数据带到您的服务器脚本环境的一种方式。例如,在PHP中
<?php use ModernizrServer\Modernizr; Modernizr::init(); if (null === Modernizr::getData()) { print "<html><head><script type='text/javascript'>"; print Modernizr::buildJsCode() . "</script></head><body></body></html>"; exit; } print 'The server knows:'; foreach (Modernizr::getData() as $feature => $value) { print "<br/> $feature: "; print_r($value); } ?>
服务器知道:canvas: 1 canvastext: 1 geolocation: 1 crosswindowmessaging: 1 websqldatabase: 1 indexeddb: 0 hashchange: 1 ...
通过这个(PHP)API在服务器上提供的功能检测与通过客户端(JavaScript)API提供的完全相同。
目前,只有PHP实现了服务器端API,但其他语言将轻松得多。请继续关注项目以获取更多信息。
此外:这是一个年轻的项目,所以请在高流量生产环境中谨慎使用 :-)
如何使用它(与PHP一起使用)
从http://modernizr.com下载最新的Modernizr脚本并将其放置在modernizr.js
目录中。在该目录内,文件应也命名为modernizr.js
,但可以是文件的压缩或未压缩版本。(如果要将它放在其他地方,请参阅本节底部的说明。)
理想情况下,应在您的PHP脚本的最开始包含modernizr-server.php
库 - 或者至少在发出任何HTML之前
<?php
include('modernizr-server.php');
...
在脚本中的任何后续位置,您都可以使用$modernizr
对象,就像您在客户端使用Modernizr
对象一样
if ($modernizr->svg) {
...
} elseif ($modernizr->canvas) {
...
}
有关通过API测试和可用的所有功能的详细信息,请参阅Modernizr 文档。
一些功能(特别是video
、audio
、input
和inputtypes
)有子功能,因此它们作为嵌套PHP对象提供
if ($modernizr->inputtypes->search) {
print "<input type='search' ...";
} else {
print "<input type='text' ...";
}
所有功能和子功能都以整数1
或0
返回,表示true
或false
,因此可以在PHP中的逻辑评估中使用它们。
重新定位modernizr.js
如果您想在您的服务器上特定位置放置Modernizr脚本,您可以在modernizr-server.php
库的顶部更改其(相对)路径。默认情况下,它在库文件的同级文件夹中
static $modernizr_js = '../modernizr.js/modernizr.js';
JavaScript文件不需要在直接对浏览器可见的文件夹中 - 只需一个库可以读取的文件夹。尽管如此,如果您也在客户端使用Modernizr,您可能已经在您的Web服务器上有一个脚本副本,您可以使用它。
工作原理
用户首次访问包含modernizr-server.php库的页面时,该库会将Modernizr脚本发送到客户端,并在末尾添加一小段脚本。Modernizr按常规运行并填充功能测试结果。
然后,这个小后缀脚本将结果序列化成一个简短的cookie,并通过JavaScript在客户端设置。之后立即刷新页面。
第二次执行PHP脚本时,库会从cookie中获取内容,并使用这些内容在服务器端实例化$modernizr
对象。如果可能,它将被放置在PHP的$_SESSION
中,以便在后续请求中快速访问。
只要cookie或会话之一保持活跃,就不会进一步执行Modernizr脚本。如果它们都过期,下一次请求包含modernizr-server.php
的页面将导致浏览器重新运行Modernizr测试。
注意事项
此库依赖于浏览器重新加载用户刚刚访问的页面 - 以使用cookie中的Modernizr数据重新请求它。理论上,如果cookie没有在客户端正确设置,刷新可能会无限循环。我会考虑一些缓解方法。
建议您首先在一个通过用户使用GET
方法访问的页面上使用modernizr-server.php
。如果第一次请求是POST
(例如,来自表单),页面刷新将导致浏览器询问用户是否希望立即重新提交表单,这可能会使他们感到困惑。