در این راهنما، یاد خواهید گرفت که چگونه یک تگ HTML سفارشی موجود را برای استفاده از جاوا اسکریپت sandboxed تبدیل کنید.
این آموزش از API injectScript
استفاده می کند. injectScript
یک API رایج است که برای تبدیل یک تگ موجود که به اسکریپت های شخص ثالث متکی است استفاده می شود. این تگها اغلب در حین بارگیری یک اسکریپت، عملکرد پایه را تنظیم میکنند، سپس پس از بارگیری اسکریپت، آن را با عملکردهای اضافی تقویت میکنند.
برچسب اصلی
<!-- Google Analytics -->
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXXX-1', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<!-- End Google Analytics -->
کد را تبدیل کنید
بخش جاوا اسکریپت تگ بالا را در نظر بگیرید:
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXXX-1', 'auto');
ga('send', 'pageview');
برای ایجاد جاوا اسکریپت sandboxed لازم، به APIهای جاوا اسکریپت بومی این اسکریپت نگاه کنید و کد خود را به استفاده از APIهای جاوا اسکریپت sandboxed معادل تبدیل کنید.
به عنوان مثال، در تگ analytics.js
، از این APIهای جاوا اسکریپت بومی استفاده می شود:
جاوا اسکریپت بومی | جاوا اسکریپت Sandboxed |
---|---|
window.ga | setInWindow |
arguments | createArgumentsQueue |
+ new Date | getTimestamp |
برای استفاده از Sandboxed JavaScript APIs در اسکریپت خود، باید به آنها require
باشید. به عنوان مثال، برای استفاده از setInWindow()
API، آن را به بالای اسکریپت خود اضافه کنید:
const setInWindow = require('setInWindow');
بعد، window.ga
را تبدیل کنید:
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)}
// becomes
const createArgumentsQueue = require('createArgumentsQueue');
const ga = createArgumentsQueue('ga', 'ga.q');
سپس، تخصیص ga.l
تبدیل کنید:
ga.l=+new Date;
// becomes
const getTimestamp = require('getTimestamp');
setInWindow('ga.l', getTimestamp(), true);
در نهایت، دو تماس را به ga()
تبدیل کنید:
ga('create', 'UA-XXXXXX-1', 'auto');
ga('send', 'pageview');
// becomes
const trackingId = data.trackingId;
ga('create', trackingId, 'auto');
ga('send', 'pageview');
برای استفاده از data.trackingId
، یک فیلد به الگوی خود اضافه کنید:
به برگه
Fields
بروید و رویAdd Field
کلیک کنید.نوع فیلد
Text input
را انتخاب کنید.شناسه را از
text1
بهtrackingId
تغییر دهید.
در این مرحله، اولین تگ <script/>
تبدیل کرده اید، اما باید در اسکریپت پشتیبانی نیز بارگیری کنید.
برای انجام این کار:
<script async src='https://www.google-analytics.com/analytics.js'></script>
// becomes
const injectScript = require('injectScript');
const url = 'https://www.google-analytics.com/analytics.js';
injectScript(url, data.gtmOnSuccess, data.gtmOnFailure, url);
ارسال cacheToken
به injectScript()
یک بهینه سازی را فعال می کند. برای سناریوهای زیر، اسکریپت analytics.js
فقط یک بار بارگیری می شود:
- برچسبی که چندین بار اجرا می شود
- بیش از یک برچسب از این الگوی سفارشی در یک ظرف.
- سایر قالب های سفارشی با استفاده از
injectScript()
با همانcacheToken
مجوزها
اگر قبل از این مرحله سعی کردید این کد را اجرا کنید، ممکن است متوجه برخی از خطاها در کنسول شده باشید.
این خطاها به این دلیل ظاهر میشوند که جاوا اسکریپت sandbox شده از شما میخواهد مقادیر و URLهایی را که به آنها دسترسی دارید را اعلام کنید. در این مثال، شما باید به متغیرهای سراسری ga.q
، ga.l
و ga
دسترسی داشته باشید و میخواهید اسکریپتی را تزریق کنید که در https://www.google-analytics.com/analytics.js
میزبانی شده است.
برای پیکربندی مجوزهای Global Variables
:
به برگه
Permissions
بروید،Accesses Global Variables
را گسترش دهید و سپس رویAdd Key
کلیک کنید.ga
برای کلید استفاده کنید و کادرهایRead
،Write
وExecute
را علامت بزنید.این فرآیند را برای
ga.q
وga.l
تکرار کنید. توجه داشته باشید که این فیلدها به مجوزExecute
نیاز ندارند.
در این مرحله اگر دوباره روی Run Code کلیک کنید، یک خطای جدید در کنسول دریافت خواهید کرد. این بار، خطا به Inject Scripts
اشاره می کند.
برای پیکربندی مجوز Inject Scripts
:
https://www.google-analytics.com/analytics.js
را بهAllowed URL Match Patterns
اضافه کنید.
حالا وقتی روی Run Code کلیک میکنید، هیچ خطایی در کنسول وجود ندارد. شما با موفقیت تگ را به یک الگوی سفارشی تبدیل کردید. روی Save
کلیک کنید و از تگ جدید خود مانند هر تگ دیگر در Google Tag Manager استفاده کنید.
تگ کاملا تبدیل شده
نتیجه نهایی جاوا اسکریپت سندباکس شما باید به شکل زیر باشد:
const setInWindow = require('setInWindow');
const copyFromWindow = require('copyFromWindow');
const createArgumentsQueue = require('createArgumentsQueue');
const getTimestamp = require('getTimestamp');
const injectScript = require('injectScript');
const trackingId = data.trackingId;
const ga = createArgumentsQueue('ga', 'ga.q');
setInWindow('ga.l', getTimestamp(), false);
ga('create', trackingId, 'auto');
ga('send', 'pageview');
const url = 'https://www.google-analytics.com/analytics.js';
injectScript(url, data.gtmOnSuccess, data.gtmOnFailure, url);