如果浏览器是IE8或Mobile Safari,则尝试编写cookie,如果使用其他浏览器,则尝试使用localstorage - 使用Javascript

时间:2014-01-14 19:27:33

标签: javascript jquery html html5 internet-explorer-8

所以,我有一个我正在创建的变量,它与表单中的POST数据一起传递。由于某种类型的代码怪癖,任何现代浏览器都会创建两次变量,并且如果将变量的值设置为cookie,则会为同一事件触发两个不同的唯一ID。如果现代浏览器将值设置为localstorage,则只生成一个唯一ID,一切正常。

但是,Mobile Safari不会对localstorage进行处理(因为Apple将localstorage的目录移动到随机清空的目录),并且IE8无法将值设置为localstorage。为了绕过这些问题,这两个浏览器应该设置一个cookie,它可以按预期工作,并为事件生成一个唯一的标识符。

我不能只使用特征检测,因为IE8在技术上支持localstorage,但是当页面的文档类型不是HTML5时。 Mobile Safari还支持localstorage,但与其他现代浏览器的处理方式不同。

我可以说这两项检查工作是将Chrome识别为“其他任何内容”,但唯一标识符显示为未定义。

以下代码阻止变量设置并存储在localstorage中会出现什么问题?

$(document).ready(function() {
if ($.browser.msie && parseInt($.browser.version, 10) === 8) {
    var uuid = $.cookie("uuid");
        if(typeof uuid === 'undefined'){
    var uuid = guid();
            document.cookie='uuid='+uuid;
            var iam = "ie8";
            alert(iam);
  } 
} else {
    if (navigator.userAgent.match(/(iPad|iPhone|iPod touch);.*CPU.*OS 7_\d/i)){
        var uuid = $.cookie("uuid");
            if(typeof uuid === 'undefined'){
                var uuid = guid();
                document.cookie='uuid='+uuid;
                var iam = "safari mobile";
                alert(iam);
            } else {
                if (localStorage.getItem("uuid") === null) {
                    var uuid = guid();
                    localStorage.setItem("uuid", uuid);
                    var iam = "anything else";
                    alert(iam);
                }
            }
    }
}
});

注意事项:

  • 有一个以3秒为间隔调用的函数,使用Ajax将此数据发布到PHP处理文件。
  • 有一个名为guid的函数可以生成一个20个字符的唯一代码。
  • 浏览器我们特别需要检查:IE8(可能在下面)和Mobile Safari(即在iPad,iPhone或iPod上)。
  • 在谷歌浏览器和Firefox中,uuid未使用当前脚本结构定义,而是应该在本地存储,并具有由guid函数生成的字符串。
  • 以上代码链接到jQuery 1.8.2(以获取对$ .browser的访问权限)和jQuery.cookie.js

1 个答案:

答案 0 :(得分:1)

您可能需要else { if ()

http://jsfiddle.net/FE2AQ/1/

else if (){