任何自定义变量名称和值的总组合长度可以 不超过64个字节。请记住,这不等于64 字符。因为名称和值在存储时是URI编码的,所以有些 字符使用多个字节。例如,=存储为%3D 而不是=并使用3个字节而不是1.获取URI列表 编码值,在网络上搜索URL编码参考。
我有两个问题:
我试图创建一个确保自定义名称和值不会太长的函数。 可以改进吗? (当然可以。)
function truncateCustomVarAndSet(index, name, value, scope) {
var keyValuePair,
encodedPair,
lengthOK = false;
while (!lengthOK && value.length > 0) {
keyValuePair = name + '=' + value;
encodedPair = encodeURIComponent(keyValuePair);
lengthOK = encodedPair.length <= 64;
if (!lengthOK) {
value = value.substring(0, value.length - 1);
}
}
_gaq.push(['_setCustomVar', index, name, value, scope]);
}
修改:现在使用encodeURIComponent
代替encodeURI
。
编辑2: @yahelc将gaq更改为_qac,因此我从参数列表中删除了gaq,因为它不再需要了。
答案 0 :(得分:2)
我已经测试了推送完全组合64个字符的自定义变量,看起来64只是密钥的编码字节和值,而不是任何连接字符。
您应该使用encodeURIComponent
,因为encodeURI
does not encode &
, +
, and =
。
另外,不要忘记_gaq
前面的下划线。 _gaq
需要成为全局变量,因此,无需将其作为参数传递。
看起来你的一般方法是有效的,并且避免了在编码字符的中间错误地裁剪字符串的问题(正如我以前的方法错误地做的那样。)
这是代码的精简版(削减~220个字符):
function truncateCustomVarAndSet(index, name, value, scope) {
while (value.length && encodeURIComponent(name + value).length > 64) {
value = value.substring(0, value.length-1);
}
_gaq.push(['_setCustomVar', index, name, value, scope]);
}
经过测试:
truncateCustomVarAndSet(3,"34567890345678903=1=1=456789034567895678904567890","211222$#!#11221122112122112eeeqeqqeqefo1op2k1po12kop21pok2p1o",1)
_gaq.push(["_trackPageview"]);
记录为:
自定义Var 3
标签:'34567890345678903 = 1 = 1 = 456789034567895678904567890'
价值:'211222 $'
范围:'1'
答案 1 :(得分:1)
从描述中看来,只有当键或值具有等于时,似乎“=”才被视为集合的一部分。
我已经减少了你的功能。
function truncateCustomVarAndSet(index, name, value, scope) {
var n = encodeURIComponent(name)
,v = encodeURIComponent(value)
for(;(n + v).length > 64; v=encodeURIComponent(value=value.substr(1-value.length)));
_gaq.push(['_setCustomVar', index, name, value, scope]);
}