2012-09-02 64 views
2

我想檢測用戶使用Metro vs Desktop IE10時的情況。區分IE10桌面和地鐵

我在網上搜索了很多,我發現的結論是,如果用戶在IE10 Metro風格或桌面風格下運行,沒有100%的方法可以找出(使用代碼)。 然後我發現了一些網站,它有一個avascript檢測activeX。

這將足以檢測地鐵與桌面?

的代碼如下:

<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,所以它會給我同樣的結果作爲地鐵IE10?

感謝, 塔爾

+3

你爲什麼要在兩者之間進行區分?微軟建議應用程序應該尋找能力而不是平臺。例如,如果您的腳本在禁用activeX時執行了某些操作,則無論您是在城域還是臺式機上運行,​​如果禁用了activeX,它都應執行相同的操作。 – Aarkan

+0

由於很多原因,我需要區分它們...... ActiveX事件只是我發現區分這兩者的一種方式。問題是這個工作嗎?這是確定我在哪個版本上工作的正確方法? – Tal

+0

這就是要點。爲什麼需要區分?你能在這裏提出一些理由嗎? – Aarkan

回答

3

抓取網絡的解決方案,以確定我的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,因此我遵循平臺字符串,因爲許多人認爲...與MS Surface結合運行ARM。最後兩點:ActiveX和分辨率... ...

但不幸的是,即使所有這些點可以用觸摸式桌面/筆記本電腦模擬,如果你想......那麼,很難讓你的桌面IE10到目前爲止,但並非不可能。

我會喜歡它,如果MS會實施一個簡單的屬性,告訴是否觸摸和桌面或地鐵......但他們沒有。

希望我的代碼可以幫助你?

+0

親愛的奧拉夫,你的帖子非常有趣。 我剛剛在諾基亞Lumia手機上試過你的方法。不幸的是,catch塊中的IF子句不起作用。 我得到以下值: window.innerWidth = 1024!= screen.width = 371和 window.innerHeight = 1553!= screen.height = 619 – Windwalker

+0

親愛的Windwalker,因爲我無法使用Windows Phone手機我幾乎無法說出那裏發生了什麼。但是由於我們公司在移動優化方面的最新工作,我猜可能您的網頁可能會使用縮放窗口的視口設置?如果您還檢查用戶代理字符串以獲取對諾基亞的引用,可能會很方便嗎?或者你只是不發表,希望一切都會是正確的。我也有時決定,接近完美比從未達到它要好;-) – OlafW

+0

我認爲這是一個很好的觀點。 非常感謝! – Windwalker

0

IE10 metro和IE10桌面版本的功能幾乎相同(IE10桌面支持插件,IE10 metro不支持)。 如果您希望用戶使用桌面版本,並且他們使用的是metro版本,最好的方法是引導他們使用桌面版本。 考慮到用戶在IE10 metro版本中的情況,並且您希望他使用IE10桌面版本,他可以在導航欄中單擊2個點擊打開桌面版本....這將是最好的方式來做到這一點opening IE10 desktop version from IE10 metro version

相關問題