为什么Chrome和Firefox处理jQuery ajax()回调中的javascript变量设置不同?

时间:2013-05-23 01:00:50

标签: javascript jquery google-chrome firefox

使用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(status)是Chrome中的字符串,FF中是布尔值。

这个问题似乎在这里出现:

         var result = obj.result;
         status = result; 

因为Chrome中的结果数据类型是布尔值,而状态的数据类型是字符串。

variable change shown in debugger

2 个答案:

答案 0 :(得分:3)

知道了。问题是在声明状态之前缺少“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) { 
       ... 

答案 1 :(得分:1)

查看您的代码,必然会出现其他问题。在Chrome中,字符串{"result":"false"}已正确接收,解析并显示其包含字符串false。在Firefox上,您的XHR调用似乎因某些未识别的原因而失败,调用error处理程序,您自己显式执行status = false,从而导致它输出布尔值false。虽然这是对不同数据类型的唯一逻辑解释,但它并不能解释为什么alert调用不会显示错误框。可能是您在早期测试期间选中了“不允许此页面创建更多对话框”框?我很好奇当你将错误处理程序行更改为status = 684而不是false时,FF中的输出是什么。

我们需要一个可重现的案例,以便进一步深入研究,所有其他评论都表明FF和Chrome以相同的方式解析JSON。