我们希望允许我们的用户下载hta文件并在其中运行我们的网络应用程序,并让某些页面检测到它们在hta文件中运行并提供Web应用程序通常不具备的其他功能许可。
如何简单地检测是否正在从hta文件容器中浏览页面?
答案 0 :(得分:4)
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,以及谁知道其他浏览器会做什么。
答案 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>