您好Stack Overflow用户。我已经创建了一个很好的小脚本,可以将API中的A / B测试信息附加到我们的一个会话cookie中,以存储在我们的数据库中。这个脚本适用于所有浏览器,但IE(惊喜!)。这是代码:
<script>
function addTParam() {
function getCookie(acqsource) {
var i, x, y, ARRcookies = document.cookie.split(';');
for (i = 0; i < ARRcookies.length; i++) {
x = ARRcookies[i].substr(0, ARRcookies[i].indexOf('='));
y = ARRcookies[i].substr(ARRcookies[i].indexOf('=') + 1);
x = x.replace(/^\s+|\s+$/g, '');
if (x == acqsource) {
return unescape(y);
}
}
}
if (typeof (abtester) != 'undefined') {
var experimentId = 0;
var variationId = 0;
var variationIdx = -1;
var activeExpts = abtester.activeExperiments;
var values;
var newArray = [];
for (var i = 0; i < activeExpts.length; i++) {
experimentId = activeExpts[i];
if (abtester.variationIdsMap.hasOwnProperty(experimentId)) {
variationId = abtester.variationIdsMap[experimentId];
newArray = newArray.concat(variationId);
}
}
newArray = activeExpts.concat(newArray);
values = newArray.join('-');
var contents = getCookie('acqsource');
if (values && values.length > 0 && (contents.indexOf(values) === -1)) {
contents += "&tp=" + values;
document.cookie = "acqsource=" + contents + "; domain=domain.com; path=/";
}
}
}
$(document).ready(function () {
addTParam();
});
</script>
为了给出一些解释,这个函数会将一个字符串“tp = 123456-7890123”附加到acqsource cookie。然而,当它执行getCookie函数时,IE要么:a)找不到它,要么b)说它不存在(它应该,页面在加载时创建该cookie)。这是在DOM完成后加载的,所以这不是问题。
我已经详尽地搜索了这个问题,甚至找到了我公司的其他几个开发人员,我们所有人都很难过。提前谢谢!
答案 0 :(得分:0)
所以,我已经弄明白了。我检查cookie的方式是检查是否有=
。这就是问题,因为IE设置会话cookie的方式,如果cookie为null,则返回为未定义,因为该cookie中没有=
。所以一些代码魔术让我这样:
var contents = getCookie('acqsource');
if (values && values.length > 0 && contents !== undefined && (contents.indexOf(values) === -1)) {
contents += '&tp=' + values;
document.cookie = 'acqsource=' + contents + '; domain=domain.com; path=/';
}
else if (values && values.length >0 && contents === undefined){
document.cookie = 'acqsource=' + values + '; domain=domain.com; path=/';
}
基本上,您需要检查cookie是否未定义,如果没有,则写入并追加。但是,如果cookie为空,则只需将其添加到其中即可。希望这可以帮助任何最终陷入困境的人使用会话cookie和IE。