2012-12-17 22 views
9

我試圖加載諾基亞地圖的JavaScript API異步:異步加載諾基亞地圖Javascript API第

var oScript = document.createElement('script'); 
oScript.type = 'text/javascript'; 
oScript.async = true; 
oScript.src = "http://api.maps.nokia.com/2.2.3/jsl.js?with=maps,positioning,placesdata"; 
document.body.appendChild(oScript); 

按預期的,它不工作的時候了,所以我試圖重寫文件撰寫思想,可能是問題,無濟於事(例如,我做了這個https://stackoverflow.com/a/7884407/1741150)。

我遇到的錯誤是,基本上nokia.maps.map沒有定義(因此,用我不能創建一個映射:

new nokia.maps.map.Display(); 

有沒有辦法做到這一點,或任何曾經管理這樣做,我可能失去了一些東西

編輯:我其實是想在頁面腳本異步,而不是創建地圖異步(這當然不是一個問題)

謝謝,

回答

2

你應該看看jHERE庫,如果你想玩諾基亞Maps API,它會給你一個光滑的異步加載和一堆很酷的其他功能。爲JavaScript

+0

感謝@loris,我將有看看那個儘快! – tchap

+0

Here you go:http://jsfiddle.net/3ZA7x/ –

+0

你好,我正在開發一個應用程序與MH5集成iOS和Android諾基亞地圖。我想有一個可拖動的標記,所以它是可能在mh5或jHERE插件 – user869123

8

該處地圖API(3.0)

爲JavaScript新的3.0該處地圖API是很好的模塊化的,並完全支持異步加載。例如,它可能使用requirejs如下加載一個簡單的地圖:

require(['mapsjsService','mapsjsEvents', 'mapsjsUi'], function() { 

     var platform = new H.service.Platform({ 
      app_id: '<YOUR APP ID>', 
      app_code: '<YOUR TOKEN>' 
     }); 
     var defaultLayers = platform.createDefaultLayers(); 
     var map = new H.Map(document.getElementById('map'), 
     defaultLayers.normal.map); 
     var behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map)); 
     var ui = H.ui.UI.createDefault(map, defaultLayers); 
    }); 

配置文件需要如下被分配:

requirejs.config({ 
    baseUrl: '.', 
    waitSeconds: 0, 
    map: { 
     '*': { 
     'css': 'require-css' // or whatever the path to require-css is 
     } 
    }, 
    paths: { 
     'mapsjsCore' : 'https://js.api.here.com/v3/3.0/mapsjs-core', 
     'mapsjsService' : 'https://js.api.here.com/v3/3.0/mapsjs-service', 
     'mapsjsEvents' : 'https://js.api.here.com/v3/3.0/mapsjs-mapevents', 
     'mapsjsUi' :'https://js.api.here.com/v3/3.0/mapsjs-ui', 

     'mapsjsCss' :'https://js.api.here.com/v3/3.0/mapsjs-ui', 
     }, 
     shim: { 
     'mapsjsService': { 
      deps: ['mapsjsCore'] 
     }, 
     'mapsjsEvents': { 
      deps: ['mapsjsCore'] 
     }, 
     'mapsjsUi': { 
      deps: ['mapsjsCore', 'css!mapsjsCss'] 
     } 
     } 
    }); 

如可以看到的,所有的模塊依賴於mapsjsCore,但是沒有一個子模塊依賴於彼此。 mapsjsUi是一個特殊情況,因爲它具有用於默認外觀的關聯CSS文件。您可以在標題中保存默認CSS(或覆蓋),或者使用requirejs插件(如require-css)加載它。需要注意的是,在配置中需要使用waitSeconds:0這一行,以避免在將第一次下載HERE Maps for JavaScript庫到瀏覽器時發生超時,因爲它們不會在本地找到,所以您依賴於速度您的互聯網連接至少一次。

或者用jQuery的:

$.getScript('https://js.api.here.com/v3/3.0/mapsjs-core.js', function() { 
 
    $.getScript('https://js.api.here.com/v3/3.0/mapsjs-service.js', function() { 
 
    $.getScript('https://js.api.here.com/v3/3.0/mapsjs-mapevents.js', function() { 
 
     $.getScript('https://js.api.here.com/v3/3.0/mapsjs-mapevents.js', function() { 
 
     //// 
 
     // 
 
     // Don't forget to set your API credentials 
 
     // 
 
     var platform = new H.service.Platform({ 
 
      app_id: 'DemoAppId01082013GAL', 
 
      app_code: 'AJKnXv84fjrb0KIHawS0Tg', 
 
      useCIT: true 
 
     }); 
 
     // 
 
     // 
 
     ///// 
 
     var defaultLayers = platform.createDefaultLayers(); 
 
     var map = new H.Map(document.getElementById('map'), 
 
      defaultLayers.normal.map, { 
 
      center: { 
 
       lat: 50, 
 
       lng: 5 
 
      }, 
 
      zoom: 4 
 
      }); 
 
     var behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map)); 
 
     var ui = H.ui.UI.createDefault(map, defaultLayers); 
 
     }); 
 
    }); 
 
    }); 
 
});
body { 
 
     margin: 0; 
 
     padding: 0; 
 
    } 
 

 
    #map { 
 
     width: 100%; 
 
     height: 100%; 
 
     position: absolute; 
 
     overflow: hidden; 
 
     top: 0; 
 
     left: 0; 
 
    }
<head> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<meta name="viewport" content="initial-scale=1.0, width=device-width" /> 
 
    <link rel="stylesheet" type="text/css" 
 
    href="http://js.api.here.com/v3/3.0/mapsjs-ui.css" /> 
 
</head> 
 
<body> 
 
<div id="map"></div> 
 
</body> 
 

 

JavaScript的諾基亞地圖API(2.2.4-2.5.4)

最近棄用的版本Nokia Maps API for JavaScript(版本2.2.4及更高版本)支持異步加載,如下所示

詳細資料可參考方法API Reference 特徵。負載有兩個回調一個成功的(在這裏你可以繼續你的App ID and token添加,顯示地圖等,以及一個失敗。

// this is our initial script that will load jsl.js 
 
var oScript = document.createElement("script"), 
 
    //once the jsl.js is load, we load all features 
 
    onScriptLoad = function() { 
 
    nokia.Features.load(
 
     // here we get all features (provide one or many "with" parameters 
 
     nokia.Features.getFeaturesFromMatrix(["all"]), 
 
     // an callback when everything was successfully loaded 
 
     onApiFeaturesLoaded, 
 
     // an error callback 
 
     onApiFeaturesError, 
 
     // a target document (or null if the current document applies) 
 
     null, 
 
     // a flag indicating that loading should be asynchronous 
 
     false 
 
    ); 
 
    }, 
 
    // once all features we loaded, we can instantiate the map 
 
    onApiFeaturesLoaded = function() { 
 

 
    ///////////////////////////////////////////////////////////////////////////////////// 
 
    // Don't forget to set your API credentials 
 
    // 
 
    // Replace with your appId and token which you can obtain when you 
 
    // register on http://api.developer.nokia.com/ 
 
    // 
 
    nokia.Settings.set("appId", "YOUR APP ID"); 
 
    nokia.Settings.set("authenticationToken", "YOUR TOKEN"); 
 
    //   
 
    ///////////////////////////////////////////////////////////////////////////////////// 
 

 
    var mapContainer = document.getElementById("mapContainer"); 
 
    var map = new nokia.maps.map.Display(mapContainer, { 
 
     center: [40.7127, -74.0059], 
 
     zoomLevel: 13, 
 
     components: [new nokia.maps.map.component.ZoomBar(), 
 
     new nokia.maps.map.component.Behavior(), 
 
     ] 
 
    }); 
 
    }, 
 
    // if an error occurs during the feature loading 
 
    onApiFeaturesError = function(error) { 
 
    alert("Whoops! " + error); 
 
    }; 
 

 
oScript.type = "text/javascript"; 
 
// NOTE: tell jsl.js not to load anything by itself by setting "blank=true" 
 
oScript.src = "http://api.maps.nokia.com/2.2.4/jsl.js?blank=true"; 
 
// assign the onload handler 
 
oScript.onload = onScriptLoad; 
 

 
//finally append the script 
 
document.getElementsByTagName("head")[0].appendChild(oScript);
 body { 
 
     margin: 0; 
 
     padding: 0; 
 
    } 
 

 
    #mapContainer { 
 
     width: 100%; 
 
     height: 100%; 
 
     position: absolute; 
 
     overflow: hidden; 
 
     top: 0; 
 
     left: 0; 
 
    }
<!DOCTYPE html> 
 
    <html> 
 
     <head> 
 
      <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
 
      <title>Asynchronous Loading</title> 
 
     </head> 
 
     <body> 
 
      <div id="mapContainer"></div> 
 

 
     </body> 
 
    </html>

+0

請注意,** Feature.load **的API參考顯然已移到[here](http:// developer .here.com/JavaScript的的API /文檔/地圖/ topics_api_pub/nokia.Features.html)。 – Veksi

+0

另外值得注意的是,從第3版開始,加載功能已發生變化。有關更多信息,請訪問http://developer.here.com/documentation/versions。 – Veksi

+1

@Veski - 我已經更新了答案,以澄清新的** 3.x **版本是非常容易異步加載。我不會鼓勵在新項目 –