2010-04-29 95 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"; 
} 
相关问题