我以前见过类似的帖子,但我在网上看到的解决方案似乎都不适合我。
我正在尝试使用WebBrowser控件来显示使用Google Maps JavaScript API的本地保存的HTML文件,但JavaScript仍被顽固地禁用。
为了测试问题,我使用基于https://developers.google.com/maps/documentation/javascript/examples/map-simple的Google地图创建了一个简单的页面。我还添加了一个按钮来直接测试JavaScript是否正常运行
c:\ map-test.html在Firefox和IE中都运行良好。
<!DOCTYPE html>
<html>
<head>
<title>Google Maps JavaScript API v3 Example: Map Simple</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<style>
html, body, #map_canvas {
margin: 0;
padding: 0;
height: 100%;
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<script>
var map;
function initialize() {
var mapOptions = {
zoom: 8,
center: new google.maps.LatLng(-34.397, 150.644),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById('map_canvas'),
mapOptions);
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<input type="button" onclick="alert('JavaScript Functioning');" value="Test JavaScript">
<div id="map_canvas"></div>
</body>
</html>
然后,我创建了一个名为cWebBrowser的WebBrowser控件的MS Access表单,并添加了一个加载c:\ map-test.html的方法。 Google地图界面无法加载,测试按钮已停止。
Private Sub Form_Current()
Me.cWebBrowser.ControlSource = "=(""file:///C:/map-test.html"")"
End Sub
接下来,我尝试了map-simple的在线版本。 JavaScript按预期工作,并加载了Google Map界面
Private Sub Form_Current()
Me.cWebBrowser.ControlSource = "=(""https://google-developers.appspot.com/maps/documentation/javascript/examples/map-simple"")"
End Sub
我一直试图解决这个问题很长一段时间没有成功。
根据这篇文章http://support.microsoft.com/?kbid=315933,我在IE安全设置中启用了“我的电脑专区”
在所有区域中,我启用了以下内容:
在高级选项卡下,我启用了以下内容:
有人建议在我的网页上添加网络标记,但这也无济于事。
我已尝试清除缓存。
我已尝试更改文件名,以防清除后缓存仍然存在。
map-test.html在IE和WebBrowser控件中下载时都能正常工作,但只能在本地使用IE工作。除了安全设置之外还有什么可能导致问题?我缺少安全设置吗?我可以做任何其他测试来诊断问题吗?
我的智慧结束了。
环境:
Windows 7 64位
Access 2010
IE 9
P.S。
问题继续变得怪异
今天,我尝试创建一个非常简单的JavaScript页面,以确保它不是导致问题的Google Maps代码。
<!DOCTYPE html>
<html>
<body>
<input type="button" onclick="alert('JavaScript Functioning');" value="Test JavaScript">
</body>
</html>
起初它起作用,我很高兴。接下来,我尝试了谷歌地图测试页面,这也有效!所以,我尝试了我的全功能地图(在IE和Firefox中工作)加载来自我的数据库应用程序的JSON输出,这一切都火上浇油,谷歌地图代码内部导致了很多错误(不幸的是,我没有记录错误)
现在,我回到原点;没有一个页面允许编写脚本,包括上面的5个班轮?!?!
答案 0 :(得分:2)
首先,请查看Enhanced Protected Mode and Local Files和Understanding Local Machine Zone Lockdown。
我使用完全相同的环境测试了不同的配置,它们都有效(请参阅下面的注意事项)。
创建一个新表单,然后添加一个webbrowser控件:
将其ControlSource
设置为URL:
下载HTML并将其保存到我的桌面,然后引用ControlSource
中的本地文件:
添加了一个按钮,并在其ControlSource
事件中设置了Web浏览器的OnClick
:
Private Sub Command1_Click()
WebBrowser0.ControlSource = "=""C:\Users\Renaud\Desktop\map-simple.htm"""
End Sub
从上面提到的关于本地网页安全的文章的链接,我尝试了一些事情:
如果文件保存在用户的临时文件夹中,则会正确加载
试试吧,在资源管理器中输入%TEMP%
,它会带你到C:\Users\username\AppData\Local\Temp
或类似的东西
将html文件保存在那里并尝试从Access加载它,例如使用上面表单上的按钮:
Private Sub Command1_Click()
WebBrowser0.ControlSource = "=""C:\Users\Renaud\AppData\Local\Temp\map-simple.htm"""
End Sub
或者,对于允许您打开文件的IE,您需要降低其完整性级别,以便在IE打开它时强制在Internet区域中运行(从而使其正常工作)。 您可以通过打开命令提示符(以管理员身份)检查文件的当前设置:
现在,我们可以设置文件Integrity并再次检查设置:
现在您应该能够从Access和IE打开该文件。
请注意,当您将ACL从NTFS系统移动到另一个NTFS系统时,ACL会随文件一起移动,但如果将它们复制到USB闪存驱动器或其他格式为FAT的系统,它们可能会丢失,因此它们可能需要如果它们丢失,则重新应用于目标机器上。
我尝试向文件本身添加Mark Of The Web,正如Remou所提到的,但它对我不起作用,文件将无法加载。
这是我试过的:
<!doctype html>
<!-- saved from url=(0014)about:internet -->
<html>
<head>
<title>Google Maps JavaScript API v3 Example: Map Simple</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
....
另一件可行的方法是尝试从本地http服务器提供文件,例如Mongoose
答案 1 :(得分:2)
什么在我的机器上有效
纯粹为了未来的读者。
使用工具栏中的Windows 7和Access 2010以及Web浏览器控件,而不是其他ActiveX控件;使用OP中的代码(下面)并添加Mark of the Web (MOTW);使用保存到桌面的* .html文件;将webbrowser控件源设置为="C:\Users\<user>\Desktop\java.htm"
。
<!DOCTYPE html>
<!-- saved from url=(0023)http://www.contoso.com/ -->
<html>
<head>
<title>Google Maps JavaScript API v3 Example: Map Simple</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<style>
html, body, #map_canvas {
margin: 0;
padding: 0;
height: 100%;
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<script>
var map;
function initialize() {
var mapOptions = {
zoom: 8,
center: new google.maps.LatLng(-34.397, 150.644),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById('map_canvas'),
mapOptions);
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<input type="button" onclick="alert('JavaScript Functioning');" value="Test JavaScript">
<div id="map_canvas"></div>
</body>
</html>
答案 2 :(得分:0)
我在Access表单上多次使用WebBrowser控件,并使用本地生成的内容。
为了便于携带,我不想弄乱每台计算机上的安全设置。
我的解决方案是使用VBA而不是Javascript,用于本地运行的任何内容。您甚至可以将基于VBA的事件处理程序附加到文档元素。 (使用对象浏览器探索MSHTML库。)
这包括使用file://加载的文件和通过导航到about:blank然后使用WebBrowser.Document.Open / .Write写入内容而构建的页面。
对于Google地图,您应该能够构建托管基于互联网的iframe的本地文档。 安全方面,Javascript不会在本地文档中工作,但它应该在iframe中工作。
......汤姆罗宾逊