在本指南中,您将了解如何将现有自定义 HTML 代码转换为使用沙盒化 JavaScript。
本教程将使用 injectScript
API。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 -->
转换代码
以上述代码中的 JavaScript 部分为例:
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXXX-1', 'auto');
ga('send', 'pageview');
若要创建必要的沙盒化 JavaScript,请查看此脚本使用的是哪种原生 JavaScript API,然后将代码转换为使用等效的沙盒化 JavaScript API。
例如,analytics.js
代码中使用的是以下原生 JavaScript API:
原生 JavaScript | 沙盒化 JavaScript |
---|---|
window.ga |
setInWindow |
arguments |
createArgumentsQueue |
+ new Date |
getTimestamp |
若要在脚本中使用沙盒化 JavaScript API,您需要先使用 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
字段类型。将 ID 从
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
脚本仅会加载一次:
- 运行多次的代码
- 同一容器中基于此自定义模板的多个代码
- 以相同的
cacheToken
使用injectScript()
的其他自定义模板
权限
如果您在此之前尝试运行此代码,可能会注意到控制台中显示了一些错误。
之所以出现这些错误,是因为沙盒化 JavaScript 需要您声明自己访问的值和网址。在此示例中,您需要访问 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
权限。
此时,如果您再次点击运行代码,会在控制台中看到一个新错误。这一次错误涉及的是 Inject Scripts
。
要配置 Inject Scripts
权限,请执行以下操作:
将
https://www.google-analytics.com/analytics.js
添加到Allowed URL Match Patterns
。
现在,当您点击运行代码时,控制台中应该不会再显示错误。您已成功将代码转换为自定义模板。点击 Save
,然后就可以像使用任何其他代码一样在 Google 跟踪代码管理器中使用此新代码了。
完全转换后的代码
沙盒化 JavaScript 的最终结果应如下所示:
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);