如何使用GreaseMonkey在网页中插入谷歌地图
How to insert a Google map in a webpage using GreaseMonkey?
我尝试过的似乎都不起作用。我发现了这两个链接,并认为它们会有所帮助,但这也没有奏效。使用JavaScript动态加载JavaScripthttps://developers.google.com/loader/
以下是我的Greasemonkey脚本目前的大致情况:
var init_map = function() {
new google.maps.Geocoder().geocode({address:'1125 NW 12th Ave, Portland, OR'},function(result){
alert(result);
});
}
function loadMaps() {
GM_log("loadMaps called");
google.load("maps", "3", {"callback" : init_map, "other_params":"key=foo&sensor=false"});
}
function loadScript(filename,callback){
var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.onload = callback;
fileref.setAttribute("src", filename);
if (typeof fileref!="undefined"){
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
$(document).ready(
function() {
GM_log("document ready");
loadScript('http://www.google.com/jsapi?key=ABQIAAAAfoo',function(){
loadMaps();
});
}
);
我发现如果不包括//@requirehttp://www.google.com/jsapi?key=ABQIAAAAfoo在Greasemonkey脚本中,我得到了一个谷歌未定义的错误。如果我包含了它,init_map()就永远不会被调用。有什么建议吗?
var init_map
在GreaseMonkey上下文中定义了一个局部变量。
如果你想在网页的上下文中运行JavaScript,我建议在网页中注入两个<script>
标签(另一种方法是用unsafeWindow.
作为所有全局变量的前缀):
- 谷歌地图API
- 你的剧本
示例:
// ==UserScript==
// @name Name of script
// @namespace YourNameSpaceHere
// @match http://blabla.com/*
// @version 1.0
// @run-at document-end
// ==/UserScript==
var head = document.head || document.documentElement;
var script = document.createElement('script');
script.src = 'http://www.google.com/jsapi?key=ABQIAAAAfoo';
head.appendChild(script);
var script2 = document.createElement('script');
script2.textContent = '... code here ..';
head.appendChild(script2);
// Clean-up:
script.parentNode.removeChild(script);
script2.parentNode.removeChild(script2);
E4X而不是普通字符串
在GreaseMonkey脚本中嵌入一系列JavaScript代码,而不必转义引号和换行符,最简单的选择是使用E4X格式:
script2.textContent = <x><![CDATA[
alert("test");
]]></x>.toString();
我将这个问题标记为如何使用带有greatemonkey的谷歌地图api来读取地址表并跟踪路线的重复?但国防部"没有发现任何证据支持它"。
所以我只复制粘贴我在问题中所做的,因为它不是重复的
不,只是开玩笑:)
让我们从你的最后一句话开始:
我发现如果我不包括//@requirehttp://www.google.com/jsapi?key=ABQIAAAAfoo在Greasemonkey脚本,我得到一个谷歌是未定义的错误。如果我真的包括它,init_map()永远不会被调用。有什么建议吗?
是的
首先,谷歌地图API不应该作为@require
加载。相反,像这个一样
API_js_callback = "http://maps.google.com/maps/api/js?sensor=false®ion=BR&callback=initialize";
var script = document.createElement('script');
script.src = API_js_callback;
var head = document.getElementsByTagName("head")[0];
(head || document.body).appendChild(script);
其次,添加google = unsafeWindow.google
,否则会出现"谷歌未定义"错误
所以,你的代码应该像这样开始
var init_map = function() {
google = unsafeWindow.google
new google.maps.Geocoder().geocode . . . . . .
关于代码的其余部分。。。好吧,只需点击上面的链接,你就会发现如何在飞行中创建DIV,添加地图,将DIV附加到页面的固定位置,等等。
随意复制你想要的任何东西。
Greasemonkey脚本无论如何都是免费的:)
我在这里和许多其他地方测试了答案,但没有任何结果。也许是因为API现在是v3,或者谁知道呢。
我将发布对我有效的答案,它与我发现的其他答案截然不同,我相信可以用于许多其他情况。可以说这有点难看,但毕竟这是脚本注入,没有人喜欢注入。
我没有在jsbin/codepen/等中复制整个东西,因为他们根本无法复制GS(Greasemonkey)环境(至少目前还不能)和内部工作。
加载API
我控制了目的地的网页,所以这是在那里,而不是通过GS.添加的
<script src="https://maps.googleapis.com/maps/api/js?key=my-personal-key"></script>
根据我的经验,如果你不添加密钥,在几次请求后就会失败,你将不得不等待一段时间,直到它再次工作。
我还有一个带有浮动窗口的div,在那里我可以创建我的地图。
<div style="overflow:hidden; height:500px; width:700px; position:fixed; top:20px; right:20px; border:3px solid #73AD21;">
<div id="gmap_canvas" style="height:500px;width:700px;"></div>
<style>#gmap_canvas img{max-width:none!important;background:none!important}</style>
<div id="Content_Title"></div>
</div>
GS脚本
// Pass whatever data you need to the window
unsafeWindow.mapdata=JSON.stringify(mapdata);
// Define content of script
var script2 = document.createElement('script');
script2.textContent = `
// Get data
mapdata=JSON.parse(window.mapdata);
// Create map and use data
function initializeX2() {
// some stuff ...
// Create map
var mapCanvas = document.getElementById('gmap_canvas');
var myLatLng = {lat: parseFloat(mapdata[max].latitude), lng: parseFloat(mapdata[max].longitude)};
var mapOptions = {
center: myLatLng,
zoom: 15,
mapTypeControl: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(mapCanvas, mapOptions);
var marker=[];
var contentInfoWindow=[];
var infowindow=[];
// Create markers
for (var i = max ; i > max-iterations ; i--) {
// Create marker
var BLatLng={lat: parseFloat(mapdata[i].latitude), lng: parseFloat(mapdata[i].longitude)};
console.log(BLatLng);
marker[i] = new google.maps.Marker({
position: BLatLng,
map: map
});
// Create infowindow
contentInfoWindow[i]=mapdata[i].number + " - " + mapdata[i].name;
infowindow[i] = new google.maps.InfoWindow({content: contentInfoWindow[i] });
// The function has this strange form to take values of references instead of references (pointers)
google.maps.event.addListener(marker[i], 'click', function(innerKey) {
return function() {
infowindow[innerKey].open(map, marker[innerKey]);
}
}(i));
// Open markers
infowindow[i].open(map, marker[i]);
}; // end of for
}; // end of initializeX2
initializeX2();
`; // End of string to be added to page
// Add script to the page
var head = document.head || document.documentElement;
head.appendChild(script2);
// Clean-up:
script2.parentNode.removeChild(script2);
一些解释
在我的情况下,标记在创建时打开,多个标记可能保持打开状态。这是我想要的行为。如果你想要其他东西,你必须四处寻找。
这可能会对你有所帮助。只创建一个窗口,一次只打开一个信息窗口(http://www.aspsnippets.com/Articles/Google-Maps-API-V3-Open-Show-only-one-InfoWindow-at-a-time-and-close-other-InfoWindow.aspx)
如果有人使用API v3(通过google = unsafeWindow.google
)获得了其他解决方案,我将非常有兴趣了解。
- 谷歌地图固定位置覆盖
- 不显示带有本地json文件数据的谷歌地图脚本
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 谷歌地图标记不会显示
- 无法在JS中显示谷歌地图
- 使用.load()后在Lightbox中插入谷歌地图
- 谷歌地图自动完成删除空格并在地址字符串中插入加号(+)
- 谷歌地图 - 按城市名称插入标记
- 地图引擎谷歌-地图插入
- 使用javaScript在新窗口中插入带有一些谷歌地图内容的代码
- 如何使用GreaseMonkey在网页中插入谷歌地图
- 如何在谷歌地图脚本中插入一个简单的标记
- 在谷歌地图中插入标记
- 如何在弹出窗口或灯箱插入谷歌地图
- 如何插入缩放,卫星图像和交通选项在谷歌地图上的PHP和javascript
- 如何插入我的照片到谷歌地图
- 通过URL插入图像到谷歌地图信息窗口
- 在谷歌地图API,我如何插入多个标记与多个信息窗口
- 如何将谷歌地图插入Wordpress
- 如何在谷歌地图上插入一个标记来指出特定的位置