Alb*_*reo 9 javascript serialization
我正在创建一个页面,以帮助诊断用户在我们的网页上遇到的问题(您知道,询问用户"您使用的是什么浏览器?"通常会导致"Internet").
这个页面已经向我提交了所有HTTP头文件,现在我正在尝试让JavaScript提供更多信息,所以我认为拥有用户的navigator
JavaScript对象会很棒,我开始查看如何序列化它以便我可以提交它通过表格.
问题是我无法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.plugins
和navigator.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)
接受的答案中的 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)
或创建自己的包装器。事实上,您可以使用它来迭代和复制任何嵌套对象。
归档时间: |
|
查看次数: |
5157 次 |
最近记录: |