使用PHP检查浏览器的HTML5兼容性

4

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

我该如何仅使用PHP代码检查用户的浏览器是否兼容html5?

顺便说一下,我不喜欢modernizr。我想通过PHP自己解决。

示例:

HTML5兼容浏览器:

<input type="date" value="" />

不兼容Html5的浏览器:

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

1
你可以检查。浏览器可能会欺骗你(或不提供任何信息),那么将此信息发送到服务器有什么意义呢?另外,添加id属性如何使其不兼容浏览器? - BLaZuRE
@BLaZuRE,这不是问题,输入标签是在服务器端呈现的。 - Bora
@BLaZuRE 他所担心的不是ID,而是在HTML5中呈现为日期输入字段的type="date"的使用:http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_input_type_date - Remko
@RMK 啊,我没有看到类型上的区别,所以我感到困惑。 - BLaZuRE
6个回答

9

PHP不是进行这种检测的正确选择。有很多原因说明这是一个坏主意,而且这些原因已经在很多地方得到了充分的记录。

成功处理浏览器兼容性的关键是检测所需要的功能是否被支持,然后针对这些特定的功能进行polyfill或优雅地降级。检测实际浏览器或浏览器版本是不好的做法,可能会导致假阳性和假阴性问题。既然整个目的是避免兼容性问题,那么有不准确的结果会使整个过程显得有些自我矛盾。

对于特性检测,Modernizr是一个非常好的工具,但如果像你在问题中所说的那样真的无法兼容它,这里有一个小的JS函数,专门检测date输入字段类型的支持情况:

/**
 * @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'>

现在,您可以使用下面的 jQuery 代码来实现以下功能:
$(function() {
    if(!browserSupportsDateInput()) {
        $(".datepicker").datepicker();
    }
});

就这么简单。

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

希望以上内容能给您一些思路,以找到最佳方法来完成这种事情。这都是关于最佳实践的。如果您认为必须在PHP中完成它,那就这样吧,但请注意,您正在违反几乎每个专家的建议,并且这会在长期内带来更多麻烦。


非常有用!应该是 if(!browserSupportsDateInput()) { 作为反向返回。 - Bora
@Bora - 是的,糟糕。已经修复了。 :-) 谢谢。很高兴你觉得它有用。 - Spudley

5
更好(并已经确立)的最佳实践是:
a)使一切在非HTML5浏览器中也能正常工作
或者
b)仅使您的应用程序支持HTML5,并不给旧浏览器使用的可能性
或者
c)使用JS工具来模拟(一些)HTML5功能以在较旧的浏览器中使用:http://en.wikipedia.org/wiki/HTML5_Shiv!甚至在一些高端主要网站上也使用它,所以这并不糟糕...

我猜是标记为A的;) 不管用户做什么,它们都很有用。谢谢你的帮助回答。 - Bora

2

太棒了,这个库很好!但是我放弃了一个有77个文件和380kb的负载检测库。 - Bora
是的,这可能有些过度了。正如JohnnyFaldo所建议的那样,坚持使用modernizr。它将解决你面临的问题,而不会变得“过重”。 - Remko

0
以下类可能对您有所帮助:不是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 />";
        ?> 

0

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

$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] =>

)


0

只用PHP无法进行功能检测。

我建议重新考虑你对Modernizr的不喜欢,它真的非常棒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接