javascript检测是否在hta中运行

时间:2010-04-29 11:46:44

标签: javascript web-applications hta

我们希望允许我们的用户下载hta文件并在其中运行我们的网络应用程序,并让某些页面检测到它们在hta文件中运行并提供Web应用程序通常不具备的其他功能许可。

如何简单地检测是否正在从hta文件容器中浏览页面?

7 个答案:

答案 0 :(得分:4)

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

我认为window.external在每种情况下都可能有所不同。 因此,制作并打开a.htma.hta包含:

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

我们得到:

  • IE:[object]
  • FireFox:[xpconnect wrapped (nsISupports, nsISidebar, nsISidebarExternal, nsIClassInfo)]
  • Chrome:[object Object]
  • HTA:null

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

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

为了安全起见,因为我只测试了当前版本的IE,FF和Chrome,以及谁知道其他浏览器会做什么。

答案 1 :(得分:2)

只是: -

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

答案 2 :(得分:1)

HTA在使用&lt; HTA:APPLICATION&gt;填充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");

答案 3 :(得分:0)

我还没有测试过,但是不只是看window.location工作?

答案 4 :(得分: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>

答案 5 :(得分:0)

检查HTA-Application对象的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";
}

答案 6 :(得分:0)

猜测现在没有多少人仍在使用HTA,我认为以下内容应涵盖所有情况:

<script language=javascript>
  var VBScriptVersion = "";
  function getVBScriptVersion() {
    var firstScriptBlock = document.getElementsByTagName('script')[0];
    var tmpScript = document.createElement('script');
      tmpScript.setAttribute("language", "VBScript");
      tmpScript.text = 'VBScriptVersion = ScriptEngineMajorVersion & "." & ScriptEngineMinorVersion';
      tmpScript.async = false;
      tmpScript.onload = function() {
        this.parentNode.removeChild(this);
      }
    firstScriptBlock.parentNode.insertBefore(tmpScript, firstScriptBlock);
    return VBScriptVersion;
  }

  var isHTA = (getVBScriptVersion()!="" && window.external==null);
</script>