2015-06-14 2 views
17

Я пытаюсь загрузить API Карт Google в Javascript Web Worker, но он не может загрузить библиотеку карт. Код Web Worker выглядит следующим образом:Использование «API Карт Google» в веб-рабочем

importScripts('http://maps.googleapis.com/maps/api/js?libraries=geometry&key=MYAPIKEY&sensor=FALSE'); 

Это терпит неудачу с простой

Script Error. 

в Chrome при попытке загрузить работник.

Я предполагаю, что что-то в библиотеке карт пытается получить доступ к DOM. Но это всего лишь предположение. У кого-нибудь есть решение?

EDIT: Я открыл ссылку выше и попытался извлечь + изменить ее содержимое. Итак, WebWorker.js теперь выглядит так:

var window = {google: {}}; 
var google = {maps: {}}; 
(function() { 

    function getScript(src) { 
     importScripts(src); 
    //document.write('<' + 'script src="' + src + '"><' + '/script>'); 
    } 

    var modules = google.maps.modules = {}; 
    google.maps.__gjsload__ = function(name, text) { 
    modules[name] = text; 
    }; 

    google.maps.Load = function(apiLoad) { 
    delete google.maps.Load; 
    apiLoad([0.009999999776482582,[[["http://mt0.googleapis.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026","http://mt1.googleapis.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026"],null,null,null,null,"[email protected]",["https://mts0.google.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026","https://mts1.google.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026"]],[["http://khm0.googleapis.com/kh?v=174\u0026hl=de-DE\u0026","http://khm1.googleapis.com/kh?v=174\u0026hl=de-DE\u0026"],null,null,null,1,"174",["https://khms0.google.com/kh?v=174\u0026hl=de-DE\u0026","https://khms1.google.com/kh?v=174\u0026hl=de-DE\u0026"]],[["http://mt0.googleapis.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026","http://mt1.googleapis.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026"],null,null,null,null,"[email protected]",["https://mts0.google.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026","https://mts1.google.com/[email protected]\u0026src=api\u0026hl=de-DE\u0026"]],[["http://mt0.googleapis.com/[email protected],[email protected]\u0026src=api\u0026hl=de-DE\u0026","http://mt1.googleapis.com/[email protected],[email protected]\u0026src=api\u0026hl=de-DE\u0026"],null,null,null,null,"[email protected],[email protected]",["https://mts0.google.com/[email protected],[email protected]\u0026src=api\u0026hl=de-DE\u0026","https://mts1.google.com/[email protected],[email protected]\u0026src=api\u0026hl=de-DE\u0026"]],null,null,[["http://cbk0.googleapis.com/cbk?","http://cbk1.googleapis.com/cbk?"]],[["http://khm0.googleapis.com/kh?v=86\u0026hl=de-DE\u0026","http://khm1.googleapis.com/kh?v=86\u0026hl=de-DE\u0026"],null,null,null,null,"86",["https://khms0.google.com/kh?v=86\u0026hl=de-DE\u0026","https://khms1.google.com/kh?v=86\u0026hl=de-DE\u0026"]],[["http://mt0.googleapis.com/mapslt?hl=de-DE\u0026","http://mt1.googleapis.com/mapslt?hl=de-DE\u0026"]],[["http://mt0.googleapis.com/mapslt/ft?hl=de-DE\u0026","http://mt1.googleapis.com/mapslt/ft?hl=de-DE\u0026"]],[["http://mt0.googleapis.com/vt?hl=de-DE\u0026","http://mt1.googleapis.com/vt?hl=de-DE\u0026"]],[["http://mt0.googleapis.com/mapslt/loom?hl=de-DE\u0026","http://mt1.googleapis.com/mapslt/loom?hl=de-DE\u0026"]],[["https://mts0.googleapis.com/mapslt?hl=de-DE\u0026","https://mts1.googleapis.com/mapslt?hl=de-DE\u0026"]],[["https://mts0.googleapis.com/mapslt/ft?hl=de-DE\u0026","https://mts1.googleapis.com/mapslt/ft?hl=de-DE\u0026"]],[["https://mts0.googleapis.com/mapslt/loom?hl=de-DE\u0026","https://mts1.googleapis.com/mapslt/loom?hl=de-DE\u0026"]]],["de-DE","US",null,0,null,null,"http://maps.gstatic.com/mapfiles/","http://csi.gstatic.com","https://maps.googleapis.com","http://maps.googleapis.com",null,"https://maps.google.com","https://gg.google.com","http://maps.gstatic.com/maps-api-v3/api/images/","https://www.google.com/maps",0],["http://maps.gstatic.com/maps-api-v3/api/js/21/3/intl/de_ALL","3.21.3"],[141790386],1,null,null,null,null,null,"",["geometry"],null,0,"http://khm.googleapis.com/mz?v=174\u0026","AIzaSyDQi59vEjsIzBM-AFMeDbszVsOckQOb5A8","https://earthbuilder.googleapis.com","https://earthbuilder.googleapis.com",null,"http://mt.googleapis.com/vt/icon",[["http://mt0.googleapis.com/vt","http://mt1.googleapis.com/vt"],["https://mts0.googleapis.com/vt","https://mts1.googleapis.com/vt"],null,null,null,null,null,null,null,null,null,null,["https://mts0.google.com/vt","https://mts1.google.com/vt"],"/maps/vt",306000000,132],2,500,[null,"http://g0.gstatic.com/landmark/tour","http://g0.gstatic.com/landmark/config",null,"http://www.google.com/maps/preview/log204","","http://static.panoramio.com.storage.googleapis.com/photos/",["http://geo0.ggpht.com/cbk","http://geo1.ggpht.com/cbk","http://geo2.ggpht.com/cbk","http://geo3.ggpht.com/cbk"]],["https://www.google.com/maps/api/js/master?pb=!1m2!1u21!2s3!2sde-DE!3sUS!4s21/3/intl/de_ALL","https://www.google.com/maps/api/js/widget?pb=!1m2!1u21!2s3!2sde-DE"],null,0,0,"/maps/api/js/ApplicationService.GetEntityDetails",0], loadScriptTime); 
    }; 

    importScripts(
    'http://maps.gstatic.com/maps-api-v3/api/js/21/3/intl/de_ALL/main.js' 
    , 'http://maps.gstatic.com/maps-api-v3/api/js/21/3/intl/de_ALL/geometry.js' 
    ); 

})(); 

Но это все еще приводит к ошибке «Ошибка скрипта».

+0

Я тоже застрял на этом, idk, почему никто не потрудился ответить. Надеюсь, это изменится? – pascalwhoop

+0

Просто для любопытства: зачем вы хотите загрузить карту google в api в веб-сайте? – albanx

+0

Ошибка 'Script error'. Это потому, что вы пытаетесь импортировать JS-файлы с другого сервера. Один из способов обойти это состоит в том, чтобы ваш сервер имел простой API, такой как '/ fetch-script? Src =" http: //maps.gstatic ... "' и который возвращает содержимое JS. В PHP файл будет просто 'echo file_get_contents (http: //maps.gstatic ...)' –

ответ

2

Google client api, такой как карта, диск и т. Д., Нуждается в элементе dom, поэтому вы не можете использовать карту api в веб-работнике. У меня также была аналогичная проблема в прошлом после нескольких часов исследований. Я подтвердил, что это невозможно сделать, по крайней мере, в это время. Его мало что нужно знать о веб-wroker.

Есть очень мало объектов, мы можем иметь доступ в веб-работников:

XMLHttpRequest, JSON, рабочий, навигатор, местоположение, установить и ясно таймаута, сценарии импорта, установите и четкий интервал.

Окно или родительский объект localStorage недоступны для веб-работника.

для получения более подробной информации вы можете проверить связь this.

1

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

// create a fake document for jQuery to function - DOES NOT PROVIDE ACCESS TO ACTUAL DOM ELEMENTS 
// from Tomáš Zato comment on http://stackoverflow.com/questions/10491448/how-to-access-jquery-in-html-5-web-worker 
var document = self.document = {parentNode: null, nodeType: 9, toString:function() {return "FakeDocument"}}; 
var window = self.window = self; 
var fakeElement = Object.create(document); 
fakeElement.nodeType = 1; 
fakeElement.toString=function() {return "FakeElement"}; 
fakeElement.parentNode = fakeElement.firstChild = fakeElement.lastChild = fakeElement; 
fakeElement.ownerDocument = document; 

document.head = document.body = fakeElement; 
document.ownerDocument = document.documentElement = document; 
document.getElementById = document.createElement = function() {return fakeElement;}; 
document.createDocumentFragment = function() {return this;}; 
document.getElementsByTagName = document.getElementsByClassName = function() {return [fakeElement];}; 
document.getAttribute = document.setAttribute = document.removeChild = 
    document.addEventListener = document.removeEventListener = 
    function() {return null;}; 
document.cloneNode = document.appendChild = function() {return this;}; 
document.appendChild = function(child) {return child;}; 
Смежные вопросы