採用沙箱機制的 JavaScript

沙箱式 JavaScript 是 JavaScript 語言的簡化版,可讓您透過安全的方式從 Google 代碼管理工具的自訂範本執行任意 JavaScript 邏輯。為了提供安全的執行環境,系統會停用或移除某些 JavaScript 功能。沙箱化 JavaScript 以 ECMAScript 5.1 為基礎。部分 ECMAScript 6 功能可用,例如箭頭函式和 const/let 宣告。

全域執行環境

標準全域執行環境 (例如一般 JavaScript) 不會執行沙箱 JavaScript,因此無法使用 window 物件及其屬性。這包含全域範圍中定義的方法 (例如 encodeURIsetTimeout)、全域值 (例如 locationdocument),以及由載入指令碼定義的全域值。用來取代這些方法的全域 require 函式,適用於所有提供這些函式的沙箱機制 JavaScript。您可以使用 copyFromWindow 公用程式從視窗中讀取值。

簡化類型系統

採用沙箱機制的 JavaScript 支援以下類型:nullundefinedstringnumberbooleanarrayobjectfunction。陣列和物件是使用常值語法 ( [] {}) 建立,且無法存取標準全域執行環境,因此無法使用 String()Number() 等全域建構函式。沙箱 JavaScript 中沒有 new 關鍵字,且函式無法存取 this 關鍵字。 部分原生類型方法也已經移除。如需支援原生方法的完整清單,請參閱標準程式庫一文。

自訂範本程式碼格式

編寫自訂範本的程式碼代表每次代碼觸發或評估您的變數時,所執行的函式主體。這個函式具有單一資料參數 (data),可保留使用者介面中針對該標記或變數執行個體設定的所有值,並將鍵設為自訂範本中指定的範本參數名稱。

信標代碼導入範例

const sendPixel = require('sendPixel');
const encodeUri = require('encodeUri');
const encodeUriComponent = require('encodeUriComponent');

let url = encodeUri(data['url']);

if (data['useCacheBuster']) {
  const encode = require('encodeUriComponent');
  const cacheBusterQueryParam = data['cacheBusterQueryParam'] || 'gtmcb';
  const last = url.charAt(url.length - 1);
  let delimiter = '&';
  if (url.indexOf('?') < 0) {
    delimiter = '?';
  } else if (last == '?' || last == '&') {
    delimiter = '';
  }
  url += delimiter +
      encodeUriComponent(cacheBusterQueryParam) + '=' + encodeUriComponent(data['randomNumber']);
}
sendPixel(url, data['gtmOnSuccess'], data['gtmOnFailure']);