Обнаружение JavaScript при запуске в hta - PullRequest
2 голосов
/ 29 апреля 2010

Мы хотели бы позволить нашим пользователям загружать hta-файл и запускать в нем наше веб-приложение, а некоторые страницы обнаруживать, что они работают в hta-файле, и предлагать дополнительные функции, которые веб-приложение обычно не имеет разрешение делать.

Как я могу просто определить, просматривается ли страница из контейнера hta-файла?

Ответы [ 7 ]

4 голосов
/ 05 мая 2011

window.location.protocol=='file:' будет указывать на локальную страницу, но это может быть локальная HTML-страница или местный hta.

Я думаю, window.external может быть различным в каждом контексте. Таким образом, создание и открытие a.htm и a.hta, содержащее:

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

Получаем:

  • IE: [object]
  • FireFox: [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 и кто знает, что будут делать другие браузеры.

2 голосов
/ 09 августа 2011

А как же просто: -

 var isHTA = (document.all && top.document && (top.document.getElementsByTagName('application')[0]));
1 голос
/ 22 января 2013

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 голосов
/ 03 мая 2019

думаю, не так много людей, все еще использующих 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>
0 голосов
/ 12 марта 2013

Проверка свойства commandLine объекта HTA-Application - лучший способ проверить, работаете ли вы как настоящее HTML-приложение, поскольку это свойство доступно только в mshta.exe.

Вам необходимо получить объект HTM-Application, чтобы проверить это свойство. Если вы не знаете идентификатор объекта, вы можете использовать этот код:

// 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";
}
0 голосов
/ 06 августа 2011

Это может соответствовать всем требованиям. Проверка атрибутов может быть удалена.

<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 голосов
/ 29 апреля 2010

Я не тестировал, но разве не смотрю на работу window.location?

...