序列化JavaScript的导航器对象

Alb*_*reo 9 javascript serialization

我正在创建一个页面,以帮助诊断用户在我们的网页上遇到的问题(您知道,询问用户"您使用的是什么浏览器?"通常会导致"Internet").

这个页面已经向我提交了所有HTTP头文件,现在我正在尝试让JavaScript提供更多信息,所以我认为拥有用户的navigatorJavaScript对象会很棒,我开始查看如何序列化它以便我可以提交它通过表格.

问题是我无法navigator使用我所知道的任何JSON库序列化对象,每个人都返回一个空对象(?!),所以我决定编写一个ad-hoc序列化器.

你可以在这里找到代码:

<!DOCTYPE html>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            function serialize (object) {
                var type = typeof object;
                if (object === null) {
                    return '"nullValue"';
                }
                if (type == 'string' || type === 'number' || type === 'boolean') {
                    return '"' + object + '"';
                }
                else if (type === 'function') {
                    return '"functionValue"';
                }
                else if (type === 'object') {
                    var output = '{';
                    for (var item in object) {
                        if (item !== 'enabledPlugin') {
                            output += '"' + item + '":' + serialize(object[item]) + ',';
                        }
                    }
                    return output.replace(/\,$/, '') + '}';
                }
                else if (type === 'undefined') {
                    return '"undefinedError"';
                }
                else {
                    return '"unknownTypeError"';
                }
            };
            $(document).ready(function () {
                $('#navigator').text(serialize(navigator));
            });
        </script>
        <style type="text/css">
            #navigator {
                font-family: monospaced;
            }
        </style>
        <title>Serialize</title>
    </head>
    <body>
        <h1>Serialize</h1>
        <p id="navigator"></p>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这段代码似乎在Firefox,Opera,Chrome和Safari中完美运行,但(显然)在Internet Explorer(至少版本8.0)中不起作用,它抱怨"对象不支持的属性或方法" for (var item in object) {.

您是否有任何关于如何修复代码或如何navigator通过其他方式达到目标(序列化对象)的提示?


解决方案(v 2.0):

更换

for (var item in object) {
    if (item !== 'enabledPlugin') {
        output += '"' + item + '":' + serialize(object[item]) + ',';
    }
}
Run Code Online (Sandbox Code Playgroud)

for (var item in object) {
    try {
        if (item !== 'enabledPlugin') {
            output += '"' + item + '":' + serialize(object[item]) + ',';
        }
    }
    catch (e) {
    }
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理.

Tha*_*hai 11

尝试将其放入新对象中

var _navigator = {};
for (var i in navigator) _navigator[i] = navigator[i];
Run Code Online (Sandbox Code Playgroud)

然后序列化它(如果浏览器没有本机JSON API,可能使用一些JSON库,我使用json2.js):

$('#navigator').text(JSON.stringify(_navigator));
Run Code Online (Sandbox Code Playgroud)

编辑:似乎Internet Explorer不允许navigator.pluginsnavigator.mimeTypes迭代,所以这适用:

var _navigator = {};
for (var i in navigator) _navigator[i] = navigator[i];

delete _navigator.plugins;
delete _navigator.mimeTypes;

$('#navigator').text(JSON.stringify(_navigator));
Run Code Online (Sandbox Code Playgroud)


vla*_*ras 9

接受的答案中的 JSON 仅包含顶级元素。看看这个https://jsfiddle.net/j1zb7qm0/ -_navigator.connection是空的。我写了一个小函数来收集所有嵌套的属性:

function recur(obj) {
  var result = {}, _tmp;
  for (var i in obj) {
    // enabledPlugin is too nested, also skip functions
    if (i === 'enabledPlugin' || typeof obj[i] === 'function') {
        continue;
    } else if (typeof obj[i] === 'object') {
        // get props recursively
        _tmp = recur(obj[i]);
        // if object is not {}
        if (Object.keys(_tmp).length) {
            result[i] = _tmp;
        }
    } else {
        // string, number or boolean
        result[i] = obj[i];
    }
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它var _navigator = recur(navigator)或创建自己的包装器。事实上,您可以使用它来迭代和复制任何嵌套对象。