2

ユーザーが hta ファイルをダウンロードしてその中で Web アプリを実行できるようにし、特定のページが hta ファイルで実行されていることを検出し、通常は Web アプリが許可されていない追加機能を提供できるようにしたいと考えています。 .

ページが hta ファイル コンテナーから参照されているかどうかを簡単に検出するにはどうすればよいですか?

4

7 に答える 7

4

window.location.protocol=='file:'はローカル ページを示しますが、それはローカル html ページまたはローカル hta である可能性があります。

私はwindow.external、それぞれの文脈で異なるかもしれないと考えています。したがって、作成して開きa.htma.hta含める:

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

我々が得る:

  • いいえ:[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 のみをテストしており、他のブラウザーが何をするかは誰にもわかりません。

于 2011-05-05T02:47:47.533 に答える
2

ただどうですか:-

 var isHTA = (document.all && top.document && (top.document.getElementsByTagName('application')[0]));
于 2011-08-09T07:59:58.377 に答える
1

HTA は、DOM に <HTA:APPLICATION> タグを設定する方法が独特です。以下を使用して 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");
于 2013-01-21T21:34:57.383 に答える
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";
}
于 2013-03-12T10:00:07.657 に答える
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>
于 2019-05-03T05:54:46.223 に答える
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>
于 2011-08-06T15:54:57.177 に答える
0

私はテストしていませんが、window.location を見るだけでは機能しませんか?

于 2010-04-29T11:52:18.213 に答える