如消息所述,您应该只包含一次 API。您可以通过一次 API 加载创建任意数量的地图实例。
由于您总是加载小地图,因此一种简单的解决方案是简单地删除 Maps API<script>
标记或drupal_add_js()
从创建大灯箱地图的节点调用。当然,如果您将其作为独立页面打开,您将无法再查看该节点中的地图;它只能作为已经包含 Maps API 的页面的一部分。
或者,您可以有条件地在页面上仅包含一次 Maps API 脚本。我的 PHP 和 Drupal 编码有点生疏,但我认为它看起来像这样:
if( ! $mapsApiLoaded ) {
$mapsApiLoaded = TRUE;
drupal_add_js(
'https://maps.googleapis.com/maps/api/js?sensor=false',
'external'
);
}
在您的块和节点中使用该代码而不是裸drupal_add_js()
调用或<script>
标记,它应该只加载一次 API。
(当然,如果您正在进行车辆跟踪等,sensor=false
应sensor=true
按照Maps API 服务条款的要求阅读)。
或者这里是另一种在 Drupal 中加载 .js 文件的方法。
有趣的是,多年前曾讨论过在函数中添加“仅加载一次”drupal_add_js()
功能,但它被解决为“wontfix”。:-(
你也可以在纯 JavaScript 中做类似的事情。在检查尚未加载后,只需使用为 Maps APIdocument.write()
编写标签:<script>
<script>
function loadMapsAPI() {
if( window.google && google.maps )
return;
document.write(
'<script src="',
'https://maps.googleapis.com/maps/api/js',
'?v=3&sensor=false',
'">',
'<\/script>'
);
}
</script>
测试它:
<script>
loadMapsAPI();
</script>
<script>
loadMapsAPI();
</script>
<script>
// Normal Maps API initialization code here
</script>
请注意,您不能这样做:
<script>
loadMapsAPI();
// Normal Maps API initialization code here
</script>
这是因为document.write()
in在当前标签之后loadMapsAPI()
写出 API 的<script>
标签。因此,如果您将该调用和地图初始化的其余部分放在同一个标签中,它们的顺序将是错误的:<script>
<script>
<script>
loadMapsAPI();
// Normal Maps API initialization code here
</script>
... The Maps API <script> generated by document.write is *here* ...
将loadMapsAPI()
函数定义和调用合并在同一个<script>
标签中就可以了:
<script>
function loadMapsAPI() {
if( window.google && google.maps )
return;
document.write(
'<script src="',
'https://maps.googleapis.com/maps/api/js',
'?v=3&sensor=false',
'">',
'<\/script>'
);
}
loadMapsAPI();
</script>
甚至不让它成为一个函数:
<script>
if( !( window.google && google.maps ) ) {
document.write(
'<script src="',
'https://maps.googleapis.com/maps/api/js',
'?v=3&sensor=false',
'">',
'<\/script>'
);
}
</script>
然后,您将<script>
在需要的地方重复该标签。
现在,如果您<script>
从 PHP 代码生成这些标签,可能需要担心更多的转义和引用,但我会让您弄清楚这部分,因为我不是 PHP 专家。