我正在开发一个JavaScript应用程序,该应用程序可以从Web服务器(通过http)运行,也可以从文件系统(在file:// URL上)运行。
作为此代码的一部分,我需要使用XMLHttpRequest在与页面相同的目录中以及页面的子目录中加载文件。
在Web服务器上执行时,此代码可以正常工作(“通过”),而在文件系统中运行时,此代码在Internet Explorer 8中则无法工作(“失败”):
<html><head> <script> window.onload = function() { var xhr = new XMLHttpRequest(); xhr.open("GET", window.location.href, false); xhr.send(null); if (/TestString/.test(xhr.responseText)) { document.body.innerHTML="<p>PASS</p>"; } } </script> <body><p>FAIL</p></body>
当然,起初它会失败,因为文件系统上根本无法运行任何脚本。将向用户显示一个黄色条,警告该用户:“为了帮助保护您的安全,Internet Explorer限制了该网页的运行脚本或ActiveX控件,这些脚本或ActiveX控件可以访问您的计算机。”
但是,即使我单击了该栏并单击“允许阻止的内容”,该页面仍会失败;我在xhr.open调用中收到“访问被拒绝”错误。
这让我感到困惑,因为MSDN表示“出于开发目的,允许在本地计算机区域中使用file://协议。” 这个本地文件应该是本地计算机区域的一部分,对吗?
我如何才能获得类似的代码?我可以提示用户安全警告;我不能强迫他们在控制面板中关闭安全性。
编辑: 实际上,我不是在我的情况下加载XML文档。我正在加载纯文本文件(.txt)。
嗯,这可能是本机XMLHttpRequest对象和ActiveX对象之间的区别吗?我似乎还记得那件事。也就是说,代替
var xhr = new XMLHttpRequest();
尝试
var xhr = new ActiveXObject("MSXML2.XMLHTTP");
显然,请进行一些检查以查看浏览器是否支持ActiveX。当然,这也仅限于IE。