javascript - 序列化 JavaScript 的导航器对象

标签 javascript serialization

我正在创建一个页面来帮助诊断我们的用户在使用我们的网页时遇到的问题(您知道,询问用户“您使用的是什么浏览器?”通常会得到“Internet”)。

该页面已经向我提交了所有 HTTP header ,现在我正在尝试让 JavaScript 提供更多信息,所以我认为拥有用户的 navigator JavaScript 对象会很棒,我开始寻找如何序列化它,以便我可以通过表单提交它。

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

你可以在这里找到代码:

<!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>

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

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


解决方案(2.0 版):

替换

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

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

而且有效。

最佳答案

尝试将它放入一个新对象中

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

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

$('#navigator').text(JSON.stringify(_navigator));

编辑:似乎 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));

关于javascript - 序列化 JavaScript 的导航器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970202/

相关文章:

c# - .NET IpcChannel 不能可靠地正确清理?

python - 逆向工程通信协议(protocol)

c# - 如何在 C# XML 序列化中指定一个属性是另一个属性?

java - 可反序列化异常: local class is not compatible cause of serialVersionID

php - 在 Cookie 中存储表单值

javascript - Jquery:slideToggle,然后滚动到 div

javascript - 文件中的 jQuery 常用功能

javascript - JQuery 替换不适用于 JW Player

javascript - 较小的运算符在 JavaScript 代码中给出错误

java - 更新类的serialVersionUID理解