为什么Chrome和Firefox处理jQuery ajax()回调中的javascript变量集的方式不同?
使用jQuery 1.9.1,回调服务器来检查一些数据:
$form = $("#form2")
var str = $form.serialize();
status = true;
$.ajax({
type : 'POST',
url : 'check_zip.php',
data : str,
async : false,
success : function (data) {
obj = JSON.parse(data);
var result = obj.result;
status = result;
},
error : function (msg) {
alert(msg);
status = false;
}
});
if (status == "false" || status === false) {
....
我发现Chrome会返回状态“false”(字符串),Firefox会返回状态false(布尔值)。 这是预期的行为? 我很惊讶!
正在解析的JSON是数据:“{”result“:false}”
typeof(状态)在Chrome中是字符串,在FF中是布尔型。
这个问题似乎出现在这里:
var result = obj.result;
status = result;
由于Chrome中结果的数据类型是布尔值,而状态的数据类型是字符串。
得到它了。 问题是宣布地位之前缺失的“var”。
正如@bfavaretto在下面指出的那样,状态已经被定义为一个全局变量。 因此,如果我使用了一个名为“ajax_status”的变量,那么没有var或者我可以使用“status”变量名称就可以,但必须使其成为本地变量(使用var)。
以下代码在FF和Chrome中都很像冠军。
$form = $("#form2")
var str = $form.serialize();
var status = true; // <--- change 1 - use "var"
$.ajax({
type : 'POST',
url : 'check_zip.php',
data : str,
async : false,
success : function (data) {
obj = JSON.parse(data);
var result = obj.result;
status = result;
},
error : function (msg) {
alert(msg);
status = false;
}
});
if (status === false) { // <-- change 2 - just use boolean comparison
...
另一种编码方式是
var ajaxreturn = $.ajax({
type : 'POST',
url : 'check_zip.php',
data : str,
async : false,
success : function (data) {
},
error : function (msg) {
alert("Unexpected server response on zip validation");
}
});
var status = false;
try {
obj = JSON.parse(ajaxreturn.responseText);
status = obj.result;
} catch (e) {
status = false;
}
if (status === false) {
...
最好的做法可能不是重用现有的变量名称状态,所以使用第二个例子,这会给出
var ajaxreturn = $.ajax({
type : 'POST',
url : 'check_zip.php',
data : str,
async : false,
success : function (data) {
},
error : function (msg) {
alert("Unexpected server response on zip validation");
}
});
var check_status = false;
try {
obj = JSON.parse(ajaxreturn.responseText);
check_status = obj.result;
} catch (e) {
check_status = false;
}
if (check_status === false) {
...
看着你的代码,肯定还有其他问题。 在Chrome中,字符串{"result":"false"}
被正确接收,解析并显示它包含字符串false
。 在Firefox上,您的XHR调用看起来会因某些不明原因而失败,调用error
处理程序,您自己显式执行status = false
,从而导致它输出布尔值false
。 虽然这是不同数据类型的唯一合理解释,但它并不能解释为什么alert
呼叫不会显示错误框。 在早期的测试中,可能是您选中了“不允许此页面创建更多对话框”框? 我很好奇,当你将errorhandler行更改为status = 684
而不是false
时,FF中的输出是什么。
我们需要一个可重复使用的案例来进一步深入研究,其他所有评论都表明FF和Chrome对JSON的解析是一致的。
链接地址: http://www.djcxy.com/p/2851.html上一篇: Why do Chrome and Firefox handle javascript variable set inside jQuery ajax() callback differently?
下一篇: Difference between proxy server and reverse proxy server