本文概述了 at.js
库和Experience Platform Web SDK。
我们允许我们的客户直接从Adobe Experience Cloud的“实现”选项卡下载库。 使用客户拥有的如下设置自定义at.js库: clientCode、imsOrgId等。
CDN上提供了预建版本。 您可以直接在页面上的CDN上引用库,也可以将其下载并托管在您自己的基础架构上。 它以缩小和未缩小的格式提供。 未缩小的版本有助于进行调试。
URL结构: https://cdn1.adoberesources.net/alloy/[版本]非缩小版本的/alloy.min.js或alloy.js。
例如:
在每个at.js文件末尾,您会找到我们实例化和传递设置对象的部分。 它是可自定义的,在下载时,我们使用当前客户设置填充该部分。
window.adobe.target.init(window, document, {
"clientCode": "demo",
"imsOrgId": "",
"serverDomain": "localhost:5000",
"timeout": 2000,
"globalMboxName": "target-global-mbox",
"version": "2.0.0",
"defaultContentHiddenStyle": "visibility: hidden;",
"defaultContentVisibleStyle": "visibility: visible;",
"bodyHiddenStyle": "body {opacity: 0 !important}",
"bodyHidingEnabled": true,
"deviceIdLifetime": 63244800000,
"sessionIdLifetime": 1860000,
"selectorsPollingTimeout": 5000,
"visitorApiTimeout": 2000,
"overrideMboxEdgeServer": false,
"overrideMboxEdgeServerTimeout": 1860000,
"optoutEnabled": false,
"optinEnabled": false,
"secureOnly": false,
"supplementalDataIdParamTimeout": 30,
"authoringScriptUrl": "//cdn.tt.omtrdc.net/cdn/target-vec.js",
"urlSizeLimit": 2048,
"endpoint": "/rest/v1/delivery",
"pageLoadEnabled": true,
"viewsEnabled": true,
"analyticsLogging": "server_side",
"serverState": {},
"decisioningMethod": "server-side",
"legacyBrowserSupport": false
});
SDK的配置已完成 configure
命令。
configure
是 始终 第一个命令名为。
示例:
alloy("configure", {
"edgeConfigId": "ebebf826-a01f-4458-8cec-ef61de241c93",
"orgId":"ADB3LETTERSANDNUMBERS@AdobeOrg"
});
可在配置期间设置许多选项。 所有选项均可在下面找到,并按类别分组。
使用at.js 2.x,如果您启用设置 pageLoadEnabled
,库将通过以下方式触发对Target Edge的调用 execute -> pageLoad
. 如果所有设置都设置为默认值,则无需自定义编码。一旦at.js添加到页面并由浏览器加载,将执行Target Edge调用。
在Adobe Target中创建的内容 可视化体验编辑器 SDK可自动检索和渲染。
要请求并自动呈现Target选件,请使用 sendEvent
命令并设置 renderDecisions
选项至 true
. 这样做会强制SDK自动呈现任何符合自动呈现条件的个性化内容。
示例:
alloy("sendEvent", {
"renderDecisions": true,
"xdm": {
"commerce": {
"order": {
"purchaseID": "a8g784hjq1mnp3",
"purchaseOrderNumber": "VAU3123",
"currencyCode": "USD",
"priceTotal": 999.98
}
}
}
});
Experience PlatformWeb SDK会自动发送包含WEB SDK执行的选件的通知,以下示例展示通知请求有效负载的外观:
{
"events": [{
"xdm": {
"_experience": {
"decisioning": {
"propositions": [
{
"id": "AT:eyJhY3Rpdml0eUlkIjoiMTI3MDE5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
"scope": "cart",
"scopeDetails": {
"decisionProvider": "TGT",
"activity": {
"id": "127019"
},
"experience": {
"id": "0"
},
"strategies": [
{
"step": "entry",
"algorithmID": "0",
"trafficType": "0"
},
{
"step": "display",
"algorithmID": "0",
"trafficType": "0"
}
],
"characteristics": {
"eventToken": "bKMxJ8dCR1XlPfDCx+2vSGqipfsIHvVzTQxHolz2IpSCnQ9Y9OaLL2gsdrWQTvE54PwSz67rmXWmSnkXpSSS2Q=="
}
}
}
]
}
},
"eventType": "display",
"web": {
"webPageDetails": {
"viewName": "cart",
"URL": "https://alloyio.com/personalizationSpa/cart"
},
"webReferrer": {
"URL": ""
}
},
"device": {
"screenHeight": 800,
"screenWidth": 1280,
"screenOrientation": "landscape"
},
"environment": {
"type": "browser",
"browserDetails": {
"viewportWidth": 1280,
"viewportHeight": 284
}
},
"placeContext": {
"localTime": "2021-12-10T15:50:34.467+02:00",
"localTimezoneOffset": -120
},
"timestamp": "2021-12-10T13:50:34.467Z",
"implementationDetails": {
"name": "https://ns.adobe.com/experience/alloy",
"version": "2.6.2",
"environment": "browser"
}
}
}
]
}
有两种方法可以触发对Target Edge的调用,以便获取用于页面加载的选件。
示例 1:
adobe.target.getOffer({
mbox: "target-global-mbox",
success: console.log,
error: console.error
});
示例 2:
adobe.target.getOffers({
request: {
execute: {
pageLoad: {}
}
}
})
.then(console.log)
.catch(console.error);
执行 sendEvent
命令,其特殊作用域位于 decisionScopes
: __view__
. 我们使用此范围作为信号,从Target中获取所有页面加载活动并预取所有视图。 Web SDK还将尝试评估所有基于VEC视图的活动。 Web SDK当前不支持禁用视图预取。
要访问任何个性化内容,您可以提供回调函数,在SDK收到来自服务器的成功响应后将调用该函数。 您的回调提供了一个结果对象,该对象可能包含包含包含任何返回的个性化内容的主张属性。
示例:
alloy("sendEvent", {
xdm: {...},
decisionScopes: ["__view__"]
}).then(function(result) {
if (result.propositions) {
result.propositions.forEach(proposition => {
proposition.items.forEach(item => {
if (item.schema === HTML_SCHEMA) {
// manually apply offer
document.getElementById("form-based-offer-container").innerHTML =
item.data.content;
const executedPropositions = [
{
id: proposition.id,
scope: proposition.scope,
scopeDetails: proposition.scopeDetails
}
];
// manually send the display notification event, so that Target/Analytics impressions aare increased
alloy("sendEvent",{
"xdm": {
"eventType": "decisioning.propositionDisplay",
"_experience": {
"decisioning": {
"propositions": executedPropositions
}
}
}
});
}
});
});
}
});
您可以使用获取基于表单的编辑器活动 getOffer
函数:
示例 1:
adobe.target.getOffer({
mbox: "hero-banner",
success: console.log,
error: console.error
});
示例 2:
adobe.target.getOffers({
request: {
execute: {
mboxes: [
{
index: 0,
name: "hero-banner"
}]
}
}
})
.then(console.log)
.catch(console.error);
您可以使用获取基于表单编辑器的活动 sendEvent
命令,并将mbox名称传递给 decisionScopes
选项。 此 sendEvent
命令将返回一个使用包含所请求活动/建议的对象解析的promise:这就是 propositions
数组如下所示:
[
{
"id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
"scope": "hero-banner",
"scopeDetails": {
"decisionProvider": "TGT",
"activity": {
"id": "434689"
},
"experience": {
"id": "0"
},
"strategies": [
{
"algorithmID": "0",
"trafficType": "0"
}
],
"characteristics": {
"eventToken": "2lTS5KA6gj4JuSjOdhqUhGqipfsIHvVzTQxHolz2IpTMromRrB5ztP5VMxjHbs7c6qPG9UF4rvQTJZniWgqbOw=="
}
},
"items": [
{
"id": "1184844",
"schema": "https://ns.adobe.com/personalization/html-content-item",
"meta": {
"geo.state": "bucuresti",
"activity.id": "434689",
"experience.id": "0",
"activity.name": "a4t test form based activity",
"offer.id": "1184844",
"profile.tntId": "04608610399599289452943468926942466370-pybgfJ"
},
"data": {
"id": "1184844",
"format": "text/html",
"content": "<div> analytics impressions </div>"
}
}
]
},
{
"id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
"scope": "hero-banner",
"scopeDetails": {
"decisionProvider": "TGT",
"activity": {
"id": "434689"
},
"characteristics": {
"eventToken": "E0gb6q1+WyFW3FMbbQJmrg=="
}
},
"items": [
{
"id": "434689",
"schema": "https://ns.adobe.com/personalization/measurement",
"data": {
"type": "click",
"format": "application/vnd.adobe.target.metric"
}
}
]
}
]
示例:
alloy("sendEvent", {
xdm: { ...},
decisionScopes: ["hero-banner"]
}).then(function (result) {
var propositions = result.propositions;
if (propositions) {
// Find the discount proposition, if it exists.
for (var i = 0; i < propositions.length; i++) {
var proposition = propositions[i];
for (var j = 0; j < proposition.items; j++) {
var item = proposition.items[j];
if (item.schema === HTML_SCHEMA) {
// apply offer
document.getElementById("form-based-offer-container").innerHTML =
item.data.content;
const executedPropositions = [
{
id: proposition.id,
scope: proposition.scope,
scopeDetails: proposition.scopeDetails
}
];
alloy("sendEvent", {
"xdm": {
"eventType": "decisioning.propositionDisplay",
"_experience": {
"decisioning": {
"propositions": executedPropositions
}
}
}
});
}
}
}
}
});
您可以使用来应用Target活动 applyOffers
函数: adobe.target.applyOffer(options)
示例:
adobe.target.getOffers({...})
.then(response => adobe.target.applyOffers({ response: response }))
.then(() => console.log("Success"))
.catch(error => console.log("Error", error));
进一步了解 applyOffers
命令 专用文档.
您可以使用来应用Target活动 applyPropositions
命令。
示例:
alloy("applyPropositions", {
propositions: [...]
});
进一步了解 applyPropositions
命令 专用文档.
您可以使用跟踪事件 trackEvent
函数或使用 sendNotifications
.
此函数会触发一个请求,以报告用户操作,例如点击次数和转化次数。 它不会在响应中投放活动。
示例 1
adobe.target.trackEvent({
"type": "click",
"mbox": "some-mbox"
});
示例 2
adobe.target.sendNotifications({
request: {
notifications: [{
...,
mbox: {
name: "some-mbox"
},
type: "click",
...
}]
}
});
您可以通过调用 sendEvent
命令,填充 _experience.decisioning.propositions
XDM字段组,并设置 eventType
更改为2个值之一:
decisioning.propositionDisplay
:表示Target活动的渲染。decisioning.propositionInteract
:表示用户与活动的交互,例如鼠标单击。此 _experience.decisioning.propositions
XDM字段组是一个对象数组。 每个对象的属性派生自 result.propositions
返回到 sendEvent
命令: { id, scope, scopeDetails }
示例1 — 跟踪a decisioning.propositionDisplay
呈现活动后的事件
alloy("sendEvent", {
xdm: {},
decisionScopes: ['discount']
}).then(function(result) {
var propositions = result.propositions;
var discountProposition;
if (propositions) {
// Find the discount proposition, if it exists.
for (var i = 0; i < propositions.length; i++) {
var proposition = propositions[i];
if (proposition.scope === "discount") {
discountProposition = proposition;
break;
}
}
}
if (discountProposition) {
// Find the item from proposition that should be rendered.
// Rather than assuming there a single item that has HTML
// content, find the first item whose schema indicates
// it contains HTML content.
for (var j = 0; j < discountProposition.items.length; j++) {
var discountPropositionItem = discountProposition.items[i];
if (discountPropositionItem.schema === "https://ns.adobe.com/personalization/html-content-item") {
var discountHtml = discountPropositionItem.data.content;
// Render the content
var dailySpecialElement = document.getElementById("daily-special");
dailySpecialElement.innerHTML = discountHtml;
// For this example, we assume there is only a single place to update in the HTML.
break;
}
}
// Send a "decisioning.propositionDisplay" event signaling that the proposition has been rendered.
alloy("sendEvent", {
xdm: {
eventType: "decisioning.propositionDisplay",
_experience: {
decisioning: {
propositions: [
{
id: discountProposition.id,
scope: discountProposition.scope,
scopeDetails: discountProposition.scopeDetails
}
]
}
}
}
});
}
});
示例2 — 跟踪a decisioning.propositionInteract
发生点击量度后的事件
alloy("sendEvent", {
xdm: { ...},
decisionScopes: ["hero-banner"]
}).then(function (result) {
var propositions = result.propositions;
if (propositions) {
// Find the discount proposition, if it exists.
for (var i = 0; i < propositions.length; i++) {
var proposition = propositions[i];
for (var j = 0; j < proposition.items.length; j++) {
var item = proposition.items[j];
if (item.schema === "https://ns.adobe.com/personalization/measurement") {
// add metric to the DOM element
const button = document.getElementById("form-based-click-metric");
button.addEventListener("click", event => {
const executedPropositions = [
{
id: proposition.id,
scope: proposition.scope,
scopeDetails: proposition.scopeDetails
}
];
// send the click track event
alloy("sendEvent", {
"xdm": {
"eventType": "decisioning.propositionInteract",
"_experience": {
"decisioning": {
"propositions": executedPropositions
}
}
}
});
});
}
}
}
}
});
使用 adobe.target.triggerView
函数。 每当加载新页面或重新渲染页面上的组件时,都可以调用此函数。应该为单页应用程序(SPA)实施adobe.target.triggerView(),以便使用可视化体验编辑器(VEC)创建A/B测试和体验定位(XT)活动。 如果未在网站上实施adobe.target.triggerView(),则无法将VEC用于SPA。
示例
adobe.target.triggerView("homeView")
要触发或指示单页应用程序视图更改,请设置 web.webPageDetails.viewName
下的属性 xdm
的选项 sendEvent
命令。 如果有选件,Web SDK将检查视图缓存。 viewName
指定于 sendEvent
它将执行这些操作并发送显示通知事件。
示例
alloy("sendEvent", {
renderDecisions: true,
xdm:{
web:{
webPageDetails:{
viewName: "homeView"
}
}
}
});
从Adobe Target返回的个性化内容包括 响应令牌,其中包含有关活动、选件、体验、用户配置文件、地理信息等的详细信息。 这些详细信息可与第三方工具共享或用于调试。 可在Adobe Target用户界面中配置响应令牌。
使用at.js自定义事件来监听Target响应并读取响应令牌。
示例
document.addEventListener(adobe.target.event.REQUEST_SUCCEEDED, function(e) {
console.log("Request succeeded", e.detail);
});
确保您使用的是Platform Web SDK版本2.6.0或更高版本。
响应令牌作为 propositions
在结果中公开的 sendEvent
命令。 每个建议都包含一系列建议 items
,则每个项目将具有 meta
使用响应令牌填充的对象(如果在Target管理员UI中启用了它们)。 了解详情
示例
alloy("sendEvent", {
renderDecisions: true,
xdm: {}
}).then(function(result) {
if (result.propositions) {
// Format of result.propositions:
/*
[
{
"id": "",
"scope": "",
"items": [
{
"id": "",
"schema": "",
"data": {},
"meta": { // RESPONSE TOKENS
"activity.name": ...,
"offer.id": ...,
"profile.activeActivities": ...
}
}
],
"scopeDetails": {}
"renderAttempted": false
}
]
*/
}
});
使用at.js,您可以通过设置 bodyHidingEnabled: true
因此,at.js会在获取和应用DOM更改之前负责预隐藏个性化容器。
通过覆盖at.js,可以预先隐藏包含个性化内容的页面部分 bodyHiddenStyle
.
默认情况下 bodyHiddenStyle
隐藏整个HTML body
.
可以使用覆盖这两个设置 window.targetGlobalSettings
. window.targetGlobalSettings
应放置在加载at.js之前。
使用Web SDK,客户可以在configure命令中设置其预隐藏样式,如下面的示例所示:
alloy("configure", {
edgeConfigId: "configurationId",
orgId: "orgId@AdobeOrg",
debugEnabled: true,
prehidingStyle: "body { opacity: 0 !important }"
});
在异步加载Web SDK时,我们建议在插入Web SDK之前在页面中插入以下代码片段:
<script>
!function(e,a,n,t){
if (a) return;
var i=e.head;if(i){
var o=e.createElement("style");
o.id="alloy-prehiding",o.innerText=n,i.appendChild(o),
setTimeout(function(){o.parentNode&&o.parentNode.removeChild(o)},t)}}
(document, document.location.href.indexOf("adobe_authoring_enabled") !== -1, "body { opacity: 0 !important }", 3000);
</script>
使用at.js支持以下2种类型的A4T日志记录:
示例1:使用Target全局设置
可以通过设置启用Analytics客户端日志记录 analyticsLogging: client_side
,或通过覆盖 window.targetglobalSettings
对象。
设置此选项后,返回的有效负载格式如下所示:
{
"analytics": {
"payload": {
"pe": "tnt",
"tnta": "167169:0:0|0|100,167169:0:0|2|100,167169:0:0|1|100"
}
}
}
然后,可以通过数据插入API将有效负载转发到Analytics。
示例2:在中配置它 getOffers
函数:
adobe.target.getOffers({
request: {
experienceCloud: {
analytics: {
logging: "client_side"
}
},
prefetch: {
mboxes: [{
index: 0,
name: "a1-serverside-xt"
}]
}
}
})
.then(console.log)
响应有效负载如下所示:
{
"prefetch": {
"mboxes": [{
"index": 0,
"name": "a1-serverside-xt",
"options": [{
"content": "<img src=\"http://s7d2.scene7.com/is/image/TargetAdobeTargetMobile/L4242-xt-usa?tm=1490025518668&fit=constrain&hei=491&wid=980&fmt=png-alpha\"/>",
"type": "html",
"eventToken": "n/K05qdH0MxsiyH4gX05/2qipfsIHvVzTQxHolz2IpSCnQ9Y9OaLL2gsdrWQTvE54PwSz67rmXWmSnkXpSSS2Q==",
"responseTokens": {
"profile.memberlevel": "0",
"geo.city": "bucharest",
"activity.id": "167169",
"experience.name": "USA Experience",
"geo.country": "romania"
}
}],
"analytics": {
"payload": {
"pe": "tnt",
"tnta": "167169:0:0|0|100,167169:0:0|2|100,167169:0:0|1|100"
}
}
}]
}
}
Analytics有效负载(tnta
token)应包含在Analytics点击中,使用 数据插入API.
可以通过设置启用Analytics服务器端日志记录 analyticsLogging: server_side
,或通过覆盖 window.targetglobalSettings
对象。
然后,数据将按如下方式流动:
Web SDK还支持:
如果针对该DataStream配置禁用了Adobe Analytics,则会启用Analytics客户端日志记录。
客户有权访问Analytics令牌(tnta
),需要与Analytics共享 数据插入API
通过链接 sendEvent
命令并遍历生成的建议数组。
示例
alloy("sendEvent", {
"renderDecisions": true,
"xdm": {
"web": {
"webPageDetails": {
"name": "Home Page"
}
}
}
}
).then(function (results) {
var analyticsPayloads = new Set();
for (var i = 0; i < results.propositions.length; i++) {
var proposition = results.propositions[i];
var renderAttempted = proposition.renderAttempted;
if (renderAttempted === true) {
var analyticsPayload = getAnalyticsPayload(proposition);
if (analyticsPayload !== undefined) {
analyticsPayloads.add(analyticsPayload);
}
}
}
var analyticsPayloadsToken = concatenateAnalyticsPayloads(analyticsPayloads);
// send the page view Analytics hit with collected Analytics payload using Data Insertion API
});
下图显示了启用Analytics客户端时数据如何流动:
为数据流配置启用Analytics时,将启用Analytics服务器端日志记录。
启用服务器端Analytics日志记录后,需要与Analytics共享A4T有效负载,以便Analytics报表显示正确的展示次数并在Experience Edge级别共享转化,这样客户就无需执行任何附加处理。
下面显示了启用服务器端Analytics日志记录时数据如何流入我们的系统:
您可以使用 window.targetGlobalSettings
覆盖 at.js 库中的设置,而不是在 Target Standard/Premium UI 中或通过使用 REST API 来配置设置。
应在加载at.js之前或在管理>实施>编辑at.js设置>代码设置>库标头中定义覆盖。
示例:
window.targetGlobalSettings = {
timeout: 200, // using custom timeout
visitorApiTimeout: 500, // using custom API timeout
enabled: document.location.href.indexOf('https://www.adobe.com') >= 0 // enabled ONLY on adobe.com
};
Web SDK不支持此功能。
示例 1
adobe.target.getOffer({
mbox: "target-global-mbox",
params: {
"profile.name": "test",
"profile.gender": "female"
},
success: console.log,
error: console.error
});
示例 2
adobe.target.getOffers({
request: {
execute: {
pageLoad: {
profileParameters: {
name: "test",
gender: "female"
}
}
}
}
})
.then(console.log)
.catch(console.error);
要更新Target配置文件,请使用 sendEvent
命令并设置 data.__adobe.target
属性,为键名加上前缀 profile
.
示例
alloy("sendEvent", {
renderDecisions: true,
data: {
__adobe: {
target: {
"profile.gender": "female",
"profile.age": 30
}
}
}
});
示例 1
adobe.target.getOffer({
mbox: "target-global-mbox",
params: {
"entity.name": "T-shirt",
"entity.id": "1234"
},
success: console.log,
error: console.error
});
示例 2
adobe.target.getOffers({
request: {
execute: {
pageLoad: {
parameters: {
"entity.name": "T-shirt",
"entity.id": "1234"
}
}
}
}
})
.then(console.log)
.catch(console.error);
要发送推荐数据,请使用 sendEvent
命令并设置 data.__adobe.target
属性,为键名加上前缀 entity
.
示例
alloy("sendEvent", {
renderDecisions: true,
data: {
__adobe: {
target: {
"entity.name": "T-shirt",
"entity.id": "1234"
}
}
}
});
使用at.js有多种发送方式 mbox3rdPartyId
,使用 getOffer
或 getOffers
:
示例 1
adobe.target.getOffer({
mbox:"test",
params:{
"mbox3rdPartyId": "1234"
},
success: console.log,
error: console.error
});
示例 2
adobe.target.getOffers({
request: {
id:{
thirdPartyId: "1234"
},
execute: {
pageLoad: {}
}
}
})
.then(console.log)
.catch(console.error);
或者有办法设置 mbox3rdPartyId
在 targetPageParams
或 targetPageParamsAll
.
在中设置时 targetPageParams
,它将在请求中发送 target-global-mbox
也称为 pag-lLoad
.
建议应使用以下方式设置 targetPageParamsAll
因为它将在每个目标请求中发送。
使用的优势 targetPageParamsAll
就是您可以定义 mbox3rdPartyId
,这将确保所有target请求都拥有权限 mbox3rdPartyId
.
window.targetPageParamsAll = function() {
return {
"mbox3rdPartyId": "1234"
};
};
window.targetPageParams = function() {
return {
"mbox3rdPartyId": "1234"
};
};
Web SDK支持目标第三方ID。 但是,还需要执行几个步骤。 在深入研究解决方案之前,我们应该先谈谈 identityMap
.
Identity Map允许客户发送多个身份。 所有身份都处于命名空间中。 每个命名空间可以具有一个或多个标识。 特定标识可以标记为主标识。
有了这些知识,我们可以了解设置Web sdk以使用Target第三方ID的必要步骤。
alloy("sendEvent", {
"renderDecisions": true,
"xdm": {
"identityMap": {
"TGT3PID": [
{
"id": "1234",
"primary": true
}
]
}
}
});
使用at.js有两种方法可设置属性令牌,即使用 targetPageParams
或 targetPageParamsAll
. 使用 targetPageParams
将资产令牌添加到 target-global-mbox
调用,但使用 targetPageParamsAll
将令牌添加到所有target调用:
示例 1
window.targetPageParamsAll = function() {
return {
"at_property": "1234"
};
};
示例 2
window.targetPageParams = function() {
return {
"at_property": "1234"
};
};
使用Web SDK,客户在设置Adobe Target命名空间下的数据流配置时,可以在更高级别设置属性:
这意味着该特定数据流配置的每个Target调用都将包含该资产令牌。
此功能仅在at.js 2.x中可用。at.js 2.x具有一个名为的新函数 getOffers
. getOffers
允许客户预取一个或多个mbox的内容。 示例如下:
adobe.target.getOffers({
request: {
prefetch: {
mboxes: [{
index: 0,
name: "test-mbox",
parameters: {
...
},
profileParameters: {
...
}
}]
}
}
})
.then(console.log)
.catch(console.error);
注意:强烈建议确保 mbox
在 mboxes
数组有自己的索引。 通常,第一个mbox具有 index=0
,下一页 index=1
等。
Web SDK当前不支持此功能。
At.js会公开以下调试功能:
window.___target_trace
对象注意:所有这些调试功能都可以通过 Adobe Experience Platform调试器
在使用Web SDK时,您拥有多种调试功能: