You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:33:16