0

您好 Stack Overflow 用户。我创建了一个不错的小脚本,将 A/B 测试信息从他们的 API 附加到我们的一个会话 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>

为了解释一下,这个函数会在 acqsource cookie 中附加一个字符串“tp=123456-7890123”。但是,当它执行 getCookie 函数时,IE 要么:a) 找不到它,要么 b) 说它不存在(它应该在加载时创建该 cookie)。这一切都是在 DOM 完成后加载的,所以这不是问题。

我已经在谷歌上详尽地搜索了这个问题,甚至联系了我公司的其他几个开发人员,我们所有人都被难住了。提前致谢!

4

1 回答 1

0

所以,我已经想通了。我检查 cookie 的方法是检查是否有=. 这就是问题所在,因为 IE 设置会话 cookie 的方式,如果 cookie 为空,它会返回未定义,因为=该 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 而陷入困境的人。

于 2013-01-14T18:35:50.327 回答