我正在创建一个页面,帮助诊断我们的用户在网页上遇到的问题(你知道,询问用户“您使用什么浏览器?”通常会得到“互联网”)。
这个页面已经将所有HTTP头提交给了我,现在我想让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
对象)?
解决方案(v 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) {
}
}
它能够正常工作。
$("element").serialize();
仅适用于表单元素(请参阅.serialize())。 - Albireo