kaleidr.js 載入器
kaleidr.js 是所有 Kaleidr 嵌入功能的入口腳本。它定義全局對象 window.Kaleidr 和自定義元素 <kaleidr-map>。腳本體積小,不包含地圖程式庫或產品程式碼。掛載產品時,它從同一 CDN 載入該產品的包並傳入選項。
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
沒有 npm 包。SDK 只能通過 script 標籤載入。React、Next.js、Vue 和 TypeScript 用法請參閱框架集成。
載入腳本
| 問題 | 答案 |
|---|---|
| 標籤放在哪裡? | 任意位置。<kaleidr-map> 元素無論位於標籤前後都能掛載。 |
何時調用 Kaleidr.mount? | 腳本執行後。對於普通 <script src> 標籤,頁面中後續腳本即可調用。 |
能使用 async 或 defer 嗎? | 元素可以。調用 Kaleidr.mount 時須等待標籤的 load 事件,因為此前 window.Kaleidr 尚未定義。 |
| 載入幾次? | 每頁一次。 |
能添加 integrity 嗎? | 不能。檔案會在原路徑更新,固定哈希將在下一次發佈時失效。參見 CDN 版本管理。 |
| 能在伺服器上運行嗎? | 不能,需要 window 和 document。服務端渲染的應用程式應僅在瀏覽器中載入。 |
使用 async 載入腳本,並在載入後掛載:
<div id="map" style="height:480px"></div>
<script>
const s = document.createElement('script');
s.src = 'https://cdn.kaleidr.com/embed/v1/kaleidr.js';
s.async = true;
s.onload = () => {
Kaleidr.mount('#map', { product: 'viewer', shareId: 'YOUR_MAP_ID' });
};
document.head.appendChild(s);
</script>
window.Kaleidr
| 成員 | 說明 |
|---|---|
Kaleidr.mount(target, options) | 將產品掛載到元素中並返回操作句柄。 |
Kaleidr.init() | 初始化文檔中已有的 <kaleidr-map> 元素,通常無需手動調用。 |
Kaleidr.enable(on) | 開啓或關閉後續掛載。 |
Kaleidr.version | 載入器版本字串,用於診斷。 |
Kaleidr.mount(target, options)
const handle = Kaleidr.mount('#chat', {
product: 'chat',
publishableKey: 'kld_pk_live_…',
map: myMap,
contained: true,
});
| 參數 | 類型 | 說明 |
|---|---|---|
target | CSS 選擇器或 HTMLElement | 掛載目標。選擇器通過 document.querySelector 僅解析一次。 |
options | 對象 | 必填。參見選項。 |
返回一個操作句柄。
運行行為:
- 立即返回。 會話交換和產品包載入在後台進行。此期間的句柄調用會排隊,在產品就緒後依次執行。對於 Viewer 和 Tile,就是 iframe 內地圖回報就緒之時,因此能在調用
setCamera之前執行mount,下一行的設置仍有效。 - 掛載失敗不會拋異常。 找不到目標、載入包失敗、會話被拒絕或 ID 無效時,控制台記錄含
[kaleidr:<product>]的錯誤。仍會返回句柄,但其方法不執行操作。唯一會拋異常的是缺少選項對象的Kaleidr.mount('#map'),它會拋出TypeError。 - 不向程式碼反饋結果。 沒有可等待的 Promise 或回調。參見判斷掛載是否成功。
- 每個目標只允許一個掛載。 再次掛載前先調用原句柄的
handle.destroy()。即使首次掛載尚在載入, 銷毀後在同一元素重新掛載也安全;已銷毀的掛載不會干擾新掛載。
選項
| 選項 | 類型 | 預設值 | 適用產品 | 說明 |
|---|---|---|---|---|
product | 'chat' | 'viewer' | 'editor' | 'tile' | 無,必填 | 全部 | 選擇掛載的產品。 |
publishableKey | 字串 | 無 | chat、editor、tile | 可發佈金鑰 kld_pk_…。SDK 將其交換為短期會話,僅把會話交給產品。不要傳給 Viewer。伺服器金鑰 (kld_sk_…) 會在請求發送前被拒絕。 |
shareId | 字串 | 無 | viewer、chat | Viewer:已發佈地圖的 ID。無金鑰的 Chat:由地圖所有者提供聊天服務的已發佈地圖。 |
mapId | 字串 | 無 | viewer | shareId 的別名,僅在沒有 shareId 時使用。 |
styleId | 字串 | 組織的預設底圖 | tile、editor | 例如 kaleidr-morning 的樣式 ID,或完整樣式 URL。 |
map | 運行中的地圖實例 | 無 | chat | 供助手操控的地圖:Mapbox GL JS、MapLibre GL JS、Google Maps 或 Leaflet。參見支持的地圖。純聊天面板可省略。 |
mapTarget | CSS 選擇器 | 無 | chat | 供助手操作的 Viewer/Tile <kaleidr-map> 元素,用來代替 map。 |
contained | 布爾值 | false | chat | 將面板停靠到有定位和尺寸的目標內部。預設是在視口左上角的固定懸浮窗口。 |
lang | 字串 | 頁面有效的 <html lang>,否則英語 | chat | 回答語言,使用 BCP 47 標籤,如 en、ko 或 pt-BR。參見聊天語言。 |
title | 字串 | 面板自身標題 | chat | 面板標題欄的文本,元素屬性為 chat-title。 |
placeholder | 字串 | 面板自身佔位文字 | chat | 輸入框佔位提示。 |
center | [longitude, latitude] | 產品預設值 | viewer、tile、editor | 初始中心點。 |
zoom | 數值 | 產品預設值 | viewer、tile、editor | 初始縮放級別。Viewer/Tile 只有和 center 同時提供才生效。 |
pitch | 數值 | 產品預設值 | viewer、tile、editor | 初始傾斜角(度)。 |
bearing | 數值 | 產品預設值 | viewer、tile、editor | 初始旋轉角(度)。 |
theme | 對象或對象的 JSON 字串 | 無 | chat、editor | Chat:自定義 CSS 屬性,如 { '--highlight-color': '#0b5fff' }。Editor:參閱 17 個主題鍵。非 JSON 字串會被忽略並警告。 |
enabled | 布爾值 | 無 | 全部 | 每次掛載獨立控制的啓用開關,僅在掛載時讀取。 |
base | URL | https://cdn.kaleidr.com | 全部 | 產品包來源。只採用源站,並始終從其 /embed/v1/ 載入。只有基礎地址覆蓋規則允許的源站才生效;其他值會被忽略並警告。 |
viewerBase | URL | https://map-embed.kaleidr.com | viewer、tile | iframe 的來源,只使用源站。 |
apiBase | URL | https://api.kaleidr.com/inference-api | chat、editor、tile | 會話交換和產品請求的 API 地址,必須含 /inference-api;只填寫源站會返回 404。 |
tileBase | URL | https://tile.kaleidr.com | editor | 解析樣式 ID 的主機。 |
註意:
apiKey是publishableKey已棄用的別名。- 四種
…Base選項用於測試其他部署,生產環境通常不需要。base只改變包的來源;地圖頁面、API 和底圖主機仍使用 Kaleidr 地址,除非分別覆蓋。 lang、title和placeholder在掛載時讀取,更改它們需要銷毀並重新掛載。- 產品不使用的選項會靜默忽略。
基礎地址覆蓋規則
base(選項和元素屬性)以及頁面全局變量 window.__KALEIDR_EMBED_BASE__ 用於指定產品包的來源。覆蓋只在來源屬於下列之一時有效:
| 允許的源站 | 示例 |
|---|---|
| Kaleidr CDN | https://cdn.kaleidr.com |
載入 kaleidr.js 的源站 | kaleidr.js 從 https://static.example.com 載入,且 base 為 https://static.example.com。 |
| 當前頁面的源站 | 頁面在 https://www.example.com/…,且 base 為 https://www.example.com。 |
其他值均被忽略。掛載仍繼續,包從預設 CDN 載入,同時控制台顯示一條警告:
[kaleidr] base "https://other.example.net" is IGNORED — bundles load from https://cdn.kaleidr.com. A base must be the Kaleidr CDN, the origin kaleidr.js was loaded from, or this page's own origin.
頁面全局變量必須是字串,其他類型會被靜默跳過。若載入器與包從同一源站提供,自行托管也遵循此規則。
各產品預設攝像機設置:
| 產品 | 預設視角 |
|---|---|
| viewer | 地圖作者保存的視圖。 |
| tile | 樣式預設視圖,否則顯示全球。 |
| editor | 中心 [0, 0],縮放 2,傾斜 0,旋轉 0。 |
| chat | 不適用,Chat 不建立地圖。 |
詳細說明見各產品頁面:Chat、Viewer、Tile、Editor。
操作句柄
Kaleidr.mount 對所有產品返回結構相同的句柄。
interface KaleidrHandle {
readonly product: 'chat' | 'viewer' | 'editor' | 'tile';
setCamera(camera: {
center?: [number, number]; // [longitude, latitude]
zoom?: number;
pitch?: number;
bearing?: number;
duration?: number; // milliseconds
}): void;
setTheme(theme: string | Record<string, string>): void;
setStyle(style: string): void;
destroy(): void;
}
每個句柄都有全部方法,但具體效果因產品而異:
| 方法 | chat | viewer | editor | tile |
|---|---|---|---|---|
setCamera(camera) | 警告 |