Prebid头部竞价adUnits变量动态创建失败求助
解决Prebid动态生成adUnits无效的问题
你的核心问题在于错误地通过字符串拼接来构建JavaScript对象,之后又错误地处理成了字符串数组,而不是直接创建原生的JavaScript对象并推入数组。Prebid需要的是一个真实的对象数组,而不是看起来像对象的字符串,这就是手动写的代码能运行、动态生成的不行的原因。
先拆解下你原来的问题:你最后把preadUnits(拼接出来的对象格式字符串)用JSON.stringify处理后套上数组括号,得到的adUnits其实是一个包含单个长字符串的数组,而不是Prebid需要的对象数组。比如最终adUnits的值是["{code: '/123/468x60', ...},{code: ...}"],这显然不符合Prebid的参数要求。
正确的动态生成方式:直接构建对象数组
我们完全不需要拼接字符串,直接在循环里创建JavaScript对象,然后push到adUnits数组里即可:
var arrayadsname = adsname.split('#'); // content: /123/468x60#/123/336x280#/123/300x600 var arrayadssize = adssize.split('#'); // content: 468x60#336,280|300,250#300,600|300,250 var adUnits = []; for (var i = 0; i < arrayadsname.length; i++) { // 处理当前广告位的尺寸,生成二维数字数组 var sizeParts = arrayadssize[i].split('|'); var sizes = sizeParts.map(function(sizeStr) { // 统一处理"468x60"和"336,280"格式,转成数字数组 var dimensions = sizeStr.replace('x', ',').split(',').map(Number); return dimensions; }); // 创建当前广告单元的原生对象 var adUnit = { code: arrayadsname[i], mediaTypes: { banner: { sizes: sizes } }, bids: [{ bidder: 'adserver', params: { networkId: 1234 } }] }; // 将对象推入adUnits数组 adUnits.push(adUnit); }
关键改进点说明
- 直接创建原生对象:不再拼接字符串,而是直接定义
adUnit对象,确保最终adUnits是标准的对象数组,完全匹配Prebid的参数要求。 - 尺寸处理更严谨:用
map方法把尺寸字符串转成数字数组,既避免了嵌套循环拼接字符串的麻烦,同时确保尺寸是数字类型(Prebid要求尺寸必须是数字数组,字符串格式会导致识别失败)。 - 规避JSON序列化错误:不需要用
JSON.stringify或JSON.parse做额外处理,因为我们直接操作的就是JavaScript对象,而非字符串。
关于控制台报错的解释
你看到的严格模式相关错误,是因为Prebid在严格模式下运行,而错误的adUnits格式(字符串数组而非对象数组)导致内部函数调用时触发了不符合严格规范的操作。修正adUnits的生成方式后,这个错误会自动消失。
内容的提问来源于stack exchange,提问作者chelssi
相关产品推荐
相关产品推荐

