ユーザーが hta ファイルをダウンロードしてその中で Web アプリを実行できるようにし、特定のページが hta ファイルで実行されていることを検出し、通常は Web アプリが許可されていない追加機能を提供できるようにしたいと考えています。 .
ページが hta ファイル コンテナーから参照されているかどうかを簡単に検出するにはどうすればよいですか?
ユーザーが hta ファイルをダウンロードしてその中で Web アプリを実行できるようにし、特定のページが hta ファイルで実行されていることを検出し、通常は Web アプリが許可されていない追加機能を提供できるようにしたいと考えています。 .
ページが hta ファイル コンテナーから参照されているかどうかを簡単に検出するにはどうすればよいですか?
window.location.protocol=='file:'
はローカル ページを示しますが、それはローカル html ページまたはローカル hta である可能性があります。
私はwindow.external
、それぞれの文脈で異なるかもしれないと考えています。したがって、作成して開きa.htm
、a.hta
含める:
<script>document.write(window.external)</script>
我々が得る:
[object]
[xpconnect wrapped (nsISupports, nsISidebar, nsISidebarExternal, nsIClassInfo)]
[object Object]
null
したがって、isHTA=(window.external==null)
HTA コンテキストを示します。
または、isHTA=false;try{isHTA=(window.external==null)}catch(e){}
安全のために、私は現在のバージョンの IE、FF、および Chrome のみをテストしており、他のブラウザーが何をするかは誰にもわかりません。
ただどうですか:-
var isHTA = (document.all && top.document && (top.document.getElementsByTagName('application')[0]));
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");
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";
}
現在でも 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>
これは法案に合うかもしれません。属性を削除できることを確認します。
<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>
私はテストしていませんが、window.location を見るだけでは機能しませんか?