【问题标题】:Is there a way to truly detect Internet Explorer wether it's PHP or Javascript有没有办法真正检测 Internet Explorer 是 PHP 还是 Javascript
【发布时间】:2014-01-16 21:23:28
【问题描述】:

我一直在玩 HTML5,但我似乎无法让视频在所有浏览器中正常播放。 IE 支持 HTML5 视频,但是当视频播放时,绿色透明背景会覆盖视频。如果你不知道在你的 IE 浏览器上播放这个video。这是一个Imgur 截图,IE11。

所以我的解决方法是将视频转换为 SWF 文件并实现下面的脚本

<?php 
      if (preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT'])) {?>
      <div id="flashContent">
              <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="100%" id="flow" align="middle" style="">
                <param name="movie" value="/index.files/Flow_Double_Size_v01.swf" />
                <param name="quality" value="high" />
                <param name="play" value="true" />
                <param name="loop" value="true" />
                <param name="wmode" value="transparent" />
                <param name="scale" value="noscale" />
                <param name="menu" value="false" />
                <param name="devicefont" value="false" />
                <param name="salign" value="" />
                <param name="allowScriptAccess" value="sameDomain" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="/index.files/Flow_Double_Size_v01.swf" width="100%" height="100%">
      <param name="movie" value="/index.files/Flow_Double_Size_v01.swf" />
            <param name="quality" value="high" />
            <param name="play" value="true" />
            <param name="loop" value="true" />
            <param name="wmode" value="transparent" />
            <param name="scale" value="noscale" />
            <param name="menu" value="false" />
            <param name="devicefont" value="false" />
            <param name="salign" value="" />
            <param name="allowScriptAccess" value="sameDomain" />
          <!--<![endif]-->
            <a href="http://www.adobe.com/go/getflash">
              <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
            </a>
          <!--[if !IE]>-->
          </object>
          <!--<![endif]-->
        </object>
      </div>
      <?php }else{  ?>
        <div class="video-container">
          <video autoplay="autoplay" loop class="bg-1">
            <source src="/index.files/html5video/Flow_Updates_MP4_Codec_v02.m4v" type="video/mp4">
            <source src="/index.files/html5video/Flow_Updates_MP4_Codec_v02.ogv" type="video/ogg">
            <source src="/index.files/html5video/Flow_Updates_MP4_Codec_v02.webm" type="video/webm">
          </video>
        </div>
      <?php }; ?>

所以我遇到的问题是,flash 播放器时不时地不会被 IE 解释,它什么也不会播放,有一天它会播放下一个它不是。我会清除缓存并在我们的客户计算机上进行测试,看看他们是否正在运行闪存阻止程序,而他们没有。当我在 IE 上使用开发人员工具查看源代码时,我意识到条件语句甚至没有被读取。

我从CSS Tricks 获得了 PHP 脚本,我还将在 cmets 中找到的脚本更新为 if (preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT'])) { }

如果有替代方案,我将不胜感激。我还尝试了带有 Flash 嵌入的 HTML5 播放器的后备版本,但 IE 似乎没有回退到它。我需要 IE 来专门播放 SWF 文件。

【问题讨论】:

  • 在这两种情况下,您都依赖浏览器的诚实向您的代码报告自己。使用 JS,您可以检查 JS 引擎中是否有特定功能可用。我会努力寻找一些资源。
  • @MonkeyZeus 使用 Modernizr 怎么样?这对于检测浏览器功能通常非常方便,您可以将其缩减为仅包含您需要的内容。不过总的来说同意 - 检测功能而不是检查特定浏览器是最好的方法。
  • @MonkeyZeus 谢谢。我会试一试并报告。
  • 哦,哇,我什至没有考虑到您可能正在使用虚拟机,我猜是大海捞针,哈哈。我在所有可用的浏览器中对其进行了测试:IE 10+11、FF 和 Chrome,它们都可以完美运行,所以我希望这只是一个 VM 问题,否则 IE 11 的开发人员在某个地方犯了一个大错误

标签: javascript php internet-explorer html5-video


【解决方案1】:

我建议您不要完全避免使用 IE,因为最新版本可以播放 HTML5 视频。如果可以播放html5视频,我认为如果您检查用户浏览器的兼容性会更好。

http://html5test.com/compare/browser/ie-10/ie-11.html

但是如果你不想一个庞大的库只是为了检测浏览器,我下面的代码可以帮助你。

方法 A - 供应商名称:

var ie = (navigator.appName === 'Microsoft Internet Explorer') === true;

方法 B - 正则表达式:

var ie =  (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) === true;

方法 C - 条件代码 (https://gist.github.com/padolsey/527683):

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;
}());

希望其中一个建议对您有所帮助。如果没有,希望您能找到最好的方法。

祝你好运。

【讨论】:

  • 抱歉,A 和 B 肯定不行。 navigator.appName 显然在 IE11 中返回“Netscape”,并且 MSIE 没有出现在用户代理字符串中。但是,您可以搜索“三叉戟”。
  • 另外,我认为 C 也不能在 IE 10 或更高版本中工作 - IE10 取消了条件 cmets
【解决方案2】:

我在 cmets 中提到了这一点,但嗅探特定浏览器总是很痛苦。我了解 IE11 也对用户代理字符串进行了一些更改,因此 MSIE 不再出现在其中(来源 - http://www.sitepoint.com/internet-explorer-11-review/),这可能是您问题的根源。

更好的方法是检测特定功能。 Modernizr 是一个非常棒的库,而且相当容易使用。例如,检测 h264 支持可能涉及以下内容:

if (Modernizr.video.h264 === false) {
    // Do stuff
}

检测视频支持似乎有点奇怪 - Chrome 会为上面的代码返回 "probably",所以我会确保您进行一些跨浏览器测试。

您还可以创建自己的 Modernizr 构建,仅包含您需要的功能,因此不需要那么重。

编辑:如果您需要在 PHP 中检测它,那么您可以在用户代理字符串中搜索"Trident"。我相信这应该有效。但是,除非绝对必要,否则我将始终避免浏览器嗅探,因为您永远不知道未来的浏览器会是什么样子。

【讨论】:

  • 好吧,我认为 php 字符串是原因,因为我从 2-3 年前得到它的文章。今晚晚些时候我会收集大家的意见,看看哪一个效果最好。再次感谢!
  • 另外,我们的客户是一家公司,我正在建立的这个网站是为他们的内部员工准备的,他们都在 IE8 上使用 Windows vista。无赖:(
  • 哎哟!我感觉到你的痛苦:-(
  • 正如我在其他地方提到的,大多数检测 IE 的传统方法不再有效。 IE10 取消了条件 cmets,而 IE 11 将 navigator.appName 更改为“Netscape”并从用户代理屏幕中删除了“MSIE”。我能想到的唯一可以检测到 IE 的方法是在用户代理字符串中搜索“Trident”。也就是说,浏览器嗅探是不受欢迎的——在可能的情况下,特征检测是一种更好的方法。
  • 已更新我的答案以包括在 PHP 中检测它。
【解决方案3】:

在这种情况下可能根本不需要检测 Internet Explorer,因为问题似乎出在这个 particular video file 上。 IE 可以播放大多数 mp4 视频,但如果它不喜欢视频的编码方式,它偶尔会失败。如果您只是在试验,很可能当您使用自己的视频时,它会正常工作。

如果不是这种情况,或者您对使用此视频文件一无所知,或者您自己也有同样的问题,我建议您使用不同的编码设置进行播放。 ffmpeg 通常是相当不错的,你可以从这样的命令开始:

ffmpeg -i INPUTFILE -b 1500k -vcodec libx264 -vpre slow -vpre baseline -g 30 "OUTPUTFILE.mp4"

查看documentation 并尝试一些不同的比特率和预设。与此同时,我会尝试提醒 videojs,他们的视频无法在 IE 中运行,看看他们是否可以修复它。

现在,如果您仍然无法解决问题,检测浏览器的最佳方法是在客户端上,因为可以更改用户代理字符串。 99% 的情况下,您都希望进行特征检测,但是当您解决此类特定于浏览器的错误时,浏览器检测是可以的。

您可以通过查找 document.documentMode 来检测 Internet Explorer。 value that IE gives you 告诉你它是否在兼容模式下运行。其他浏览器没有这个属性,可以这样检测IE:

var isIE = 'documentMode' in document;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多