جاوا اسکریپت Sandboxed

جاوا اسکریپت Sandboxed یک زیرمجموعه ساده شده از زبان جاوا اسکریپت است که راهی امن برای اجرای منطق دلخواه جاوا اسکریپت از قالب های سفارشی Google Tag Manager ارائه می دهد. برای ارائه یک محیط اجرای ایمن، برخی از ویژگی های جاوا اسکریپت محدود یا حذف می شوند. جاوا اسکریپت Sandboxed بر اساس ECMAScript 5.1 است. برخی از ویژگی‌های ECMAScript 6 مانند توابع پیکان و اعلان‌های const / let در دسترس هستند.

محیط اجرای جهانی

جاوا اسکریپت Sandboxed در محیط استاندارد اجرای جهانی مانند جاوا اسکریپت معمولی اجرا نمی شود، بنابراین شی window و ویژگی های آن در دسترس نیستند. این شامل روش‌های تعریف‌شده در حوزه جهانی مانند encodeURI یا setTimeout ، مقادیر کلی مانند location یا document ، و مقادیر کلی تعریف‌شده توسط اسکریپت‌های بارگذاری‌شده است. به جای اینها، یک تابع require جهانی برای همه جاوا اسکریپت جعبه شنی در دسترس است که بسیاری از این توابع را فراهم می کند. مقادیر را می توان از پنجره با ابزار copyFromWindow خواند.

سیستم نوع ساده شده

جاوا اسکریپت Sandboxed انواع زیر را پشتیبانی می کند: null ، undefined ، string ، number ، boolean ، array ، object و function . آرایه ها و اشیاء با استفاده از نحو تحت اللفظی ( [] {} ) ایجاد می شوند و چون دسترسی به محیط استاندارد اجرای جهانی وجود ندارد، سازنده های جهانی مانند String() و Number() در دسترس نیستند. هیچ کلمه کلیدی new در جاوا اسکریپت سندباکس وجود ندارد و توابع به this کلمه کلیدی دسترسی ندارند. برخی از روش های نوع بومی نیز حذف شده اند. برای فهرست جامعی از روش‌های نوع بومی پشتیبانی‌شده به کتابخانه استاندارد مراجعه کنید.

قالب کد قالب سفارشی

کد نوشته شده برای پیاده سازی یک الگوی سفارشی، بدنه یک تابع را نشان می دهد که هر زمان که تگ شما فعال شود یا متغیر شما ارزیابی شود، اجرا می شود. این تابع دارای یک پارامتر داده واحد ( data ) است که تمام مقادیر پیکربندی شده در UI برای آن تگ یا نمونه متغیر را با کلیدهایی که روی نام پارامترهای قالب مشخص شده در الگوی سفارشی تنظیم شده اند، نگه می دارد.

نمونه اجرای تگ beacon

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']);