在 HTTPS 專案中使用百度地圖 API

含光發表於2019-04-09

百度地圖 API 產品簡介

百度地圖 JavaScript API 是一套由 JavaScript 語言編寫的應用程式介面,可幫助您在網站中構建功能豐富、互動性強的地圖應用,支援 PC 端和移動端基於瀏覽器的地圖應用開發,且支援 HTML5 特性的地圖開發。 百度地圖 JavaScript API 支援 HTTP 和 HTTPS,免費對外開放,可直接使用。介面使用無次數限制。在使用前,您需先申請金鑰(ak)才可使用。

基礎使用

引用百度地圖 API, 將 "您的密匙" 替換為你在百度地圖申請的 AK, 即可使用。

<script
  type="text/javascript"
  src="http://api.map.baidu.com/api?v=3.0&ak=您的金鑰"
></script>
複製程式碼

更多問題

問題1. https專案

在 https 專案中通過http匯入會出現以下問題:

https專案中使用http匯入

那麼百度地圖的 JavaScript API 是否支援 HTTPS 請求呢?

答案是當然支援

JavaScript API V2.0 及以上版本支援 HTTPS。 如果想使用 HTTPS 協議呼叫 JavaScript API,直接將指令碼引用的協議修改為 HTTPS 即可。

<script
  type="text/javascript"
  src="https://api.map.baidu.com/api?v=2.0&ak=您的金鑰"
></script>
<script
  type="text/javascript"
  src="https://api.map.baidu.com/api?v=3.0&ak=您的金鑰"
></script>
複製程式碼

以上是官方文件介紹的用法,在用搜尋引擎查詢問題解決方案時,看到前輩們的技術部落格都說使用 <script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=您的金鑰"></script> 不能達到預期效果,必須新增引數 &s=1 才可以。 不知道是不是官方進行過優化,下面兩張圖是今日實測的結果:

不新增引數s=1

新增引數s=1
可以看到新增 &s=1 後所得到的結果與沒新增時是 一致的

問題2. 瀏覽器警告

在部分瀏覽器(如谷歌)中會產生警告如下:

在瀏覽器中會產生警告

  A parser-blocking, cross site (i.e. different eTLD+1) script, 
  https://api.map.baidu.com/getscript?v=3.0&ak='您的金鑰'&services=&t=20190301102433,
  is invoked via document.write. 
  The network request for this script MAY be blocked by the browser in this or 
  a future page load due to poor network connectivity. 
  If blocked in this page load, it will be confirmed in a subsequent console message. 
  See https://www.chromestatus.com/feature/5718547946799104 for more details.
複製程式碼

這段警告的大概意思是說一個阻塞性的解析器,跨站點的指令碼,通過document.write呼叫。此指令碼的網路請求可能由於網路連線不良而被瀏覽器在此頁面載入或將來的頁面載入中阻止。如果在此頁面載入中被阻止,將在隨後的控制檯訊息中確認。更多詳情參見

那麼我們來分析一下百度地圖API匯入得到的JavaScript的程式碼

  (function() {
    window.BMAP_PROTOCOL = "https"; // https匯入會有此行程式碼
    window.BMap_loadScriptTime = new Date().getTime();
    document.write(
    `<script 
        type="text/javascript" 
        src="https://api.map.baidu.com/getscript?v=3.0&ak='您的金鑰'&services=&t=20190301102433"
     > </script>`
    );
  })();
複製程式碼

可以得知正是這段程式碼中的 document.write 引發的警告。那麼我們通過 <script type="text/javascript" src="https://api.map.baidu.com/getscript?v=3.0&ak='您的金鑰'&services=&t=20190301102433"> </script> 匯入百度地圖的API就可以避免此警告。不過這樣匯入缺失的另外兩行window.BMAP_PROTOCOL = "https"window.BMap_loadScriptTime = (new Date).getTime() 要記得新增上,避免產生其他問題。

相關文章