检查浏览器HTML5与PHP的兼容性

检查浏览器HTML5与PHP的兼容性,php,html,cross-browser,compatibility,Php,Html,Cross Browser,Compatibility,我想使用HTML5的输入类型或其他功能。但并非所有浏览器都支持这些HTML5功能 如何检查用户的浏览器是否仅与PHP代码兼容 顺便说一下,我不喜欢现代化。我必须用PHP解决这个问题 示例: 兼容Html5的浏览器: <input type="date" value="" /> <input id="datepicker" type="text" value="" /> Html5不兼容浏览器: <input type="date" value="" />

我想使用HTML5的输入类型或其他功能。但并非所有浏览器都支持这些HTML5功能

如何检查用户的浏览器是否仅与PHP代码兼容

顺便说一下,我不喜欢现代化。我必须用PHP解决这个问题

示例:

兼容Html5的浏览器:

<input type="date" value="" />
<input id="datepicker" type="text" value="" />

Html5不兼容浏览器:

<input type="date" value="" />
<input id="datepicker" type="text" value="" />

无法仅使用PHP进行功能检测


我认为你不喜欢现代化,这真是太棒了。

如果真的需要检测,你应该看一看。

更好的(也是公认的)最佳实践是

a) 让非html5浏览器也能正常工作

b、 )只需让你的应用程序只使用HTML5,不要让旧浏览器使用它


c) 使用一个JS工具,在旧浏览器中模拟(某些)HTML5功能:!这甚至在一些高端主要网站上使用,所以也没那么糟糕…

下面的课程可能会对您有所帮助:不是100%的解决方案,但您可以继续。 检测浏览器的最佳方法是使用下面给出的php类。一旦检测到浏览器,您可以根据自己的要求对其条件进行测试

 <?php 
        class Browser { 
            public static function detect() { 
                $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 
                if ((substr($_SERVER['HTTP_USER_AGENT'],0,6)=="Opera/") || (strpos($userAgent,'opera')) != false ){ 
                    $name = 'opera';
                } 
                elseif ((strpos($userAgent,'chrome')) != false) { 
                    $name = 'chrome'; 
                } 
                elseif ((strpos($userAgent,'safari')) != false && (strpos($userAgent,'chrome')) == false && (strpos($userAgent,'chrome')) == false){ 
                    $name = 'safari'; 
                } 
                elseif (preg_match('/msie/', $userAgent)) { 
                    $name = 'msie'; 
                } 
                elseif ((strpos($userAgent,'firefox')) != false) { 
                    $name = 'firefox'; 
                } 
                else { 
                    $name = 'unrecognized'; 
                } 
                if (preg_match('/.+(?:me|ox|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches) && $browser['name']=='safari' ) { 
                    $version = $matches[1]; 
                }
                if (preg_match('/.+(?:me|ox|it|on|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches) && $browser['name']!='safari' ) { 
                    $version = $matches[1]; 
                }
                else { 
                    $version = 'unknown'; 
                } 

                return array( 
                    'name'      => $name, 
                    'version'   => $version,
                ); 
            } 
        } 
        $browser = Browser::detect(); 
        echo 'You browser is '.$browser['name'].' version '.$browser['version']; 
        echo "<br />";
        ?> 

如果你真的想自己动手,至少有两种方法:

$browser_string = $_SERVER['HTTP_USER_AGENT'];

$browser = get_browser(null, true);
这会产生类似于

// contents of $browser_string
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3
//contents of $browser
Array
(
[browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$
[browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9*
[parent] => Firefox 0.9
[platform] => WinXP
[browser] => Firefox
[version] => 0.9
[majorver] => 0
[minorver] => 9
[cssversion] => 2
[frames] => 1
[iframes] => 1
[tables] => 1
[cookies] => 1
[backgroundsounds] =>
[vbscript] =>
[javascript] => 1
[javaapplets] => 1
[activexcontrols] =>
[cdf] =>
[aol] =>
[beta] => 1
[win16] =>
[crawler] =>
[stripper] =>
[wap] =>
[netclr] =>

)

PHP是进行此类检测的错误地点。这是个坏主意的原因有很多,在很多地方都有很好的记录

成功使用浏览器兼容性的关键是检测对所需功能的支持,并对这些特定功能进行多边形填充或适当降级。检测实际浏览器或浏览器版本是一种糟糕的做法,可能会给您带来误报和漏报问题。由于这项练习的全部目的是避免兼容性问题,因此结果不准确会使整个过程有点弄巧成拙

对于功能检测,Modernizer是一个很好的小工具,但是如果你真的不能像你在问题中所说的那样使用它,这里有一个小JS函数专门检测对日期输入字段类型的支持:

/**
 * @returns boolean - True if browser suppors 'date' input type.
 */
function browserSupportsDateInput() {
    var i = document.createElement("input");
    i.setAttribute("type", "date");
    return i.type !== "text";
}
正如你所看到的,这真的很简单。(顺便说一句,你可以)

在您的站点中使用该功能,现在填充日期字段变得非常容易

这是您的HTML:

<input type='date' name='whatever' class='datepicker'>
就这么简单

当然,现代化会使它变得更好。Modernizr本身不做多边形填充,因此如果不支持日期输入类型,您仍然需要类似于上面的代码来应用datepicker插件,但是Modernizr所做的(我在上面的代码中没有做)是允许您告诉浏览器只在需要时加载datepicker库。这将为现代浏览器节省大量带宽。现代化使这种事情变得非常容易


希望上面的内容能让你思考一下做这类事情的最佳方式。这都是关于最佳实践的。如果您觉得必须使用PHP,那就这样做吧,但请注意,您违背了几乎所有专家的建议,从长远来看,这会给您带来更多麻烦。

您可以查看。浏览器可能会欺骗您(或者不向您提供任何信息),那么将这些信息发送到服务器有什么意义呢?另外,添加
id
属性如何使其与浏览器不兼容?@BLaZuRE这不是问题,输入标记正在呈现服务器-side@BLaZuRE他担心的不是id,而是html5中作为日期输入字段呈现的type=“date”的使用:@RMK啊,我没有看到类型之间的区别,这就是我困惑的原因。那太棒了!但我放弃了有77个文件和380kb的LoadDetector库。是的,这可能太过分了。正如约翰尼法尔多所建议的那样,坚持现代化。它可以解决你所面临的问题,而不会“超重”。我猜,标记为A;)无论用户做什么,他们=D感谢有用的答案。非常有用!如果(!browserSupportsDateInput()){作为反向返回,则应为
。@Bora-yep,oops.修复了该问题。:-)谢谢。很高兴您发现它有用。