【问题标题】:Differentiating between IE10 desktop and metroIE10桌面和metro的区别
【发布时间】:2012-09-02 14:46:59
【问题描述】:

我想检测用户何时使用 Metro vs Desktop IE10。

我在网上搜索了很多,我发现的结论是,没有 100% 的方法可以找出(使用代码)用户是在 IE10 Metro 风格还是桌面风格下运行。 然后我找到了一些网站,它有一个检测 activeX 的 avascript。

这足以检测 Metro 与桌面吗?

代码如下:

    <html>
<body>
<script type="text/javascript">
var myActiveX = null;
var isActiveXCapable = false;

function InitMyActiveX() {

  try {
    new ActiveXObject("");
  }
  catch (e) {
    // FF has ReferenceError here
    if (e.name == 'TypeError' || e.name == 'Error') {
      isActiveXCapable = true;
    }
  }
  try {
    myActiveX = new ActiveXObject("My.ActiveX");
  }
  catch (e) {
    myActiveX = null;
  }

  if (myActiveX != null) {
    document.getElementById("myInfo").innerHTML = myActiveX.GetSomeInfo();
  } else {

    document.getElementById("CallMyActiveX").setAttribute("disabled", "disabled");

    if (!isActiveXCapable) {
      document.getElementById("myInfo").innerHTML = "Browser does not support ActiveX";
    } else {
      document.getElementById("myInfo").innerHTML = "MyActiveX is not installed";
    }
  }
}

function DoSomething() {
InitMyActiveX();
  if (myActiveX != null) {
    var s = myActiveX.DoSomething();
    document.getElementById("myResult").innerHTML = s;
  }

}
</script>

<div id="myInfo"></div>
<input type="button" id="CallMyActiveX" value="Call me" onclick="DoSomething()"  />
<div id="myResult"></div>
</body>
</html>

在 IE10 桌面上执行时,我看到“未安装 MyActiveX”。 在 Firefox 中,我得到:“未安装 MyActiveX”。 我会在 IE10 Metro 风格中得到相同的结果吗? 这将有助于确定是否在地铁中运行?

如果这不正确并且无法区分它们,那么我如何完全模仿IE10桌面中的Metro风格?如何完全禁用 activeX,这样它会给我与 Metro Ie10 相同的结果?

谢谢, 塔尔

【问题讨论】:

  • 为什么要区分两者? Microsoft 建议应用程序应寻找功能而不是平台。例如,如果您的脚本在禁用 activeX 时执行某些操作,那么无论您是在 Metro 还是桌面上运行,如果禁用了 activeX,它都应该执行相同的操作。
  • 由于许多原因,我需要区分它们... ActiveX 只是我发现区分两者的某种方式。问题是这行得通吗?这是识别我在哪个版本上工作的正确方法吗?
  • 这就是重点。为什么需要区分?你能在这里给出一些理由吗?
  • @Tal 你找到解决方案了吗....我太感兴趣了

标签: javascript microsoft-metro activex internet-explorer-10


【解决方案1】:

在爬网寻找解决方案以确定我的 IE10 是作为桌面版还是 Metro 版运行后,我最终将所有内容汇总在以下函数中:

function checkForIE10MetroStyle() {
var result = false;
if (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints >= 2) {
    var platF = navigator.platform;
    var cpu = navigator.cpuClass;

    if (platF.toLowerCase() == 'win64' || cpu.toLowerCase() == 'arm') {
        // both potential platforms found - now search deeper
        try {
            // IE10 Metro does not support ActiveX
            new ActiveXObject("htmlfile");
        } catch (e) {
            // finally check for fullscreen-mode
            result = (window.innerWidth == screen.width && window.innerHeight == screen.height);
        }
    }
}

return result;

}

不幸的是,没有确切的可能性是 100% 确定的......但首先我检查 msPointerEnabled 和(但这不是必需的)如果至少有两个“接触点”可用。由于我的脚本在触摸版和鼠标版之间会有所不同,因此我需要进行此项检查 - 您可以将其省略。

但由于 IE10 也支持 msPointerEnabled,我遵循许多人建议的平台字符串...结合 CPU,因为 MS Surface 运行 ARM。最后是两点:ActiveX 和分辨率...

但不幸的是,如果您愿意,即使所有这些点都可以使用具有触控功能的台式机/笔记本电脑进行模拟...嗯,目前很难获得您的桌面 IE10,但并非不可能。

如果 MS 能够实现一个简单的属性来判断是否触摸以及桌面或地铁,我会喜欢它......但他们没有。

希望我的代码对您有所帮助?

【讨论】:

  • 亲爱的奥拉夫,你的帖子很有趣。我刚刚在诺基亚 Lumia 手机上尝试了您的方法。不幸的是,catch 块中的 IF 子句不起作用。我得到以下值: window.innerWidth = 1024 != screen.width = 371 和 window.innerHeight = 1553 != screen.height = 619
  • 亲爱的 Windwalker,因为我无法使用装有 Windows Phone 的手机,所以我很难说出那里发生了什么。但是由于我们公司最近在移动优化方面的工作,我猜你的网页可能使用了缩放窗口的视口设置?如果您还检查用户代理字符串以获取对诺基亚的引用,也许它可能会很方便?或者您只是将其忽略,并希望一切都是正确的。有时我也决定接近完美总比不达到要好;-)
【解决方案2】:

IE10 Metro 和 IE10 桌面版的功能几乎相同(IE10 桌面支持插件,IE10 Metro 不支持)。 如果您希望用户使用桌面版本并且他们使用的是 Metro 版本,那么最好的方法是引导他们使用桌面版本。 考虑到用户是IE10 Metro版,你希望他使用IE10桌面版,他可以在导航栏中点击2次打开桌面版......这将是最好的方法

【讨论】:

    【解决方案3】:

    根据 Tomaž Ščavničar 的回答,如果有帮助,您似乎可以强制用户使用桌面版本。

    这篇 SO 帖子有更多信息:

    Forcing IE10 in UI/Metro to switch to desktop mode

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      相关资源
      最近更新 更多