2010-04-29 96 views
2

我們希望允許用戶下載hta文件並在其中運行我們的網絡應用程序,並且某些網頁檢測到它們正在hta文件中運行,並提供額外的功能網絡應用程序通常無權執行。javascript檢測是否在hta中運行

如何簡單地檢測頁面是否正在從hta文件容器中瀏覽?

回答

0

我還沒有測試,但不會只是看着window.location工作?

+0

號雖然應用程序是由一個HTA文件(其中包含登錄屏幕)打開,登錄後,用戶在瀏覽web應用程序的正常html文件。 Window.location只是給用戶當前的位置。 – rjmunro 2010-04-29 12:00:15

4

window.location.protocol=='file:'將表示本地頁面,但可能是本地 html頁面或本地hta。

我在想每個上下文中的window.external可能會有所不同。 所以使開放a.htma.hta包含:

<script>document.write(window.external)</script> 

我們得到:

  • IE:[object]
  • 火狐:[xpconnect wrapped (nsISupports, nsISidebar, nsISidebarExternal, nsIClassInfo)]
  • 鉻:[object Object]
  • HTA:null

因此,isHTA=(window.external==null)將指示HTA上下文。

或者,isHTA=false;try{isHTA=(window.external==null)}catch(e){}

爲了安全起見,因爲我只測試IE,FF和Chrome的當前版本,誰知道其他瀏覽器就行了。

+0

這個作品很棒,但是在safari窗口中,'window.external'也是空的! :( – CPlusSharp 2013-03-12 08:12:04

0

這可能適合該法案。驗證屬性可以被刪除。

<hta:application id="myHTA"/> 
<script> 
alert("isHTA = " + isHTA("myHTA")); 

function isHTA(htaId) { 
    var retval = false; 
    var hta = window[htaId]; 
    if (!hta) { 
    // hta wasn't defined 
    } else if (hta.scopeName != "hta") { 
    // hta:application 
    } else if (hta.nodeName != "application") { 
    // hta:application 
    } else if (hta.tagName != "application") { 
    // hta:application 
    } else { 
    retval = true; 
    // attributes only a real hta would have 
    var attribKeys = [ 
     "applicationName", 
     "border", 
     "borderStyle", 
     "caption", 
     "commandLine", 
     "contextMenu", 
     "icon", 
     "innerBorder", 
     "maximizeButton", 
     "minimizeButton", 
     "scroll", 
     "scrollFlat", 
     "selection", 
     "showInTaskBar", 
     "singleInstance", 
     "sysMenu", 
     "version", 
     "windowState" 
    ]; 
    for (var i=0;i<attribKeys.length;i++) { 
     var attribKey = attribKeys[i]; 
     if (!hta.attribKey === undefined) { 
     retval = false; 
     break; 
     } 
    } 
    } 
    return retval; 
} 

</script> 
+0

這隻會在你知道被使用的hta的id時才起作用 – TJR 2011-08-06 15:58:16

2

怎麼樣只是: -

var isHTA = (document.all && top.document && (top.document.getElementsByTagName('application')[0])); 
1

HTA的是他們如何填充與< HTA的DOM獨特:應用>標籤。我用下面的搶HTA對象:

var hta; 
var elements = document.getElementsByTagName("APPLICATION"); 
for(var i=0; i<elements.length; i+=1) { 
    if ("hta" === elements[i].scopeName.toString().toLowerCase()) { 
     hta = elements[i]; 
     break; 
    } 
} 

// To test if the page is an HTA: 
var isHta = (undefined !== hta); 

在其他瀏覽器,你將不得不使用完整的標籤名稱來訪問相同的對象:

// For Firefox/Chrome/IE 
var elements = document.getElementsByTagName("HTA:APPLICATION"); 
+0

其他瀏覽器支持運行HTA文件 – rjmunro 2013-01-22 10:26:56

+1

rjmunro:除了支持HTA的mshta.exe之外,我發現這在從HTTP服務器提供HTA時非常有用 - 我可以將它們作爲HTML文檔提供,在其他瀏覽器中顯示如何將其作爲HTA運行。 – w3dman 2013-01-23 20:11:12

0

檢查HTA的commandLine財產 - 應用程序對象是查看您是否作爲真正的HTML應用程序運行的最佳方法,因爲此屬性僅在mshta.exe中可用。

您需要獲取HTM-Application對象來檢查此屬性。如果你不知道對象的ID,你可以使用此代碼:

// Check if running in a HTML-Application 
var isHTA = false; 
var htaApp = document.getElementsByTagName("HTA:APPLICATION") 
if (!htaApp.length) { 
    htaApp = document.getElementsByTagName("APPLICATION"); 
} 
if (htaApp.length == 1 && htaApp[0]) { 
    isHTA = typeof htaApp[0].commandLine !== "undefined"; 
} 
相關問題