Как вставить карту Google в веб-страницу с помощью GreaseMonkey? - PullRequest
0 голосов
/ 17 февраля 2012

Кажется, ничего из того, что я пробовал, не работает.Я нашел эти две ссылки и подумал, что они будут полезны, но это тоже не сработало. Динамическая загрузка JavaScript с помощью JavaScript https://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();
        });
    }
);

Я обнаружил, что если я не включу// @require http://www.google.com/jsapi?key=ABQIAAAAfoo в скрипте Greasemonkey, я получаю Google - неопределенная ошибка.Если я включу его, init_map () никогда не будет вызван.Есть предложения?

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

var init_map определяет локальную переменную в контексте GreaseMonkey.

Если вы хотите запустить JavaScript в контексте веб-страницы, я рекомендую вставить два тега <script> в веб-страницу (другой методэто префикс всех ваших глобальных переменных с unsafeWindow.):

  1. API карты Google
  2. Ваш скрипт.

Пример:

// ==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 вместо простой строки

Самый простой способ встроить строку кода JavaScript в сценарий GreaseMonkey без экранирования кавычек и новых строк - использовать формат E4X:

script2.textContent = <x><![CDATA[ 
alert("test");
]]></x>.toString();
1 голос
/ 20 июня 2016

Я проверил ответы здесь и во многих других местах, и ничего не сработало. Может быть, потому что API сейчас v3 или кто знает.

Я собираюсь опубликовать ответ, который работал для меня, который довольно сильно отличается от других, которые я нашел, и я думаю, что может быть использован для многих других случаев. Возможно, это немного уродливо, но в конце концов это инъекция скрипта, и никто не любит инъекции.

Я не копирую все это в jsbin / codepen / etc., потому что они просто не могут копировать среду 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 SCRIPT

// 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), мне было бы очень интересно узнать.

1 голос
/ 10 апреля 2012

Я пометил этот вопрос как дубликат , как использовать API карт Google с greasemonkey, чтобы прочитать таблицу адресов и проследить маршрут? , но мод "не нашел доказательств в поддержку этого".

Так что я просто скопирую и вставлю то, что сделал в своем вопросе, поскольку это не дубликат ...
Нет, шучу:)

Давайте начнем с вашего последнего утверждения:

Я обнаружил, что если я не включу // @require http://www.google.com/jsapi?key=ABQIAAAAfoo в скрипт Greasemonkey, я получаю Google - неопределенная ошибка.Если я включу его, init_map () никогда не будет вызван.Есть предложения?

Да.
Во-первых, API карт Google не должен загружаться как @require.Вместо этого сделайте это следующим образом:

API_js_callback = "http://maps.google.com/maps/api/js?sensor=false&region=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, в противном случае вы получите ошибку "Google is undefined".
Итак, ваш код должен начинаться так:

var init_map = function() {
    google = unsafeWindow.google
    new google.maps.Geocoder().geocode . . . . . .

Об остальной части вашего кода ... ну, просто нажмите на ссылку выше, и там вы найдете, как создать DIV на лету, добавить карту к нему, добавить DIV на страницу в фиксированном положениии т. д.

Не стесняйтесь копировать все, что вы хотите.

Сценарии Greasemonkey все равно бесплатны:)

...