jQuery.ajax()和发送布尔值请求参数

7
$.ajax({
  url : uri,
  type : 'post',
  data : {someBooleanVar1: false, subVar: {someBooleanVar2: true}}
});

问题在于服务器上的someBooleanVar1和someBooleanVar2将被接收为字符串"false"和"true",而不是"0"和"1"。是否有任何方法可以自动将布尔参数转换为"1"和"0"?

6个回答

2

有一个固定版本的@jcubic答案:

function convertBoolToNum(obj) {
    $.each(obj, function(i) {
        if (typeof obj[i] == 'object') {
            convertBoolToNum(this);
        }
        else if (typeof obj[i] == 'boolean') {
            obj[i] = Number(obj[i]);
        }
    });
}

$.ajax = (function($ajax) {
  return function(options) {
    convertBoolToNum(options.data);
    return $ajax(options);
  };
})($.ajax);

1

试试这个,它应该会自动将布尔值转换为数据选项中的数字。

$.ajax = (function($ajax) {
  return function(options) {
    if (options.data != undefined) {
       for (var i in options.data) {
          if (options.data.hasOwnProperty(i) && 
              (typeof options.data[i] == "boolean")) {
            options.data[i] = Number(options.data[i]);
          }
       }
    }           
    return $ajax(options);
  };
})($.ajax);

非常好的想法!只有一个错误,转换对象不是递归的,因此它将无法使用{var: {subVar:false}}。我已经修复了它,请查看下面我的答案。 - barbushin

1

我知道这篇文章有点旧,但我仍然想传递这个信息^^ 我将变量传递到PHP并使用以下代码捕获:

filter_var($var, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

像这样,我将字符串转换为布尔值true=1false= 在php中,false作为字符串为空。也许我理解问题有误。但这是我所理解的 :) 使用上述代码,您可以轻松构建一个函数并添加更多过滤器,以使所有内容按照您的意愿工作 :)

0

虽然不是真正的自动,但添加0将把布尔值转换为0或1:

data : {someBooleanVar1: false + 0, someBooleanVar2: true + 0}

1
可能在jQuery中有一些非常定制的选项/方法适用于这种情况。也许有一个简短的JavaScript代码可以自动完成此转换。 - barbushin
1
当你发布你的答案时,你期望得到什么?你认为我和其他开发人员不知道如何将布尔变量转换为数字吗? - barbushin
3
SeniorDev,你太粗鲁了。从“不用了谢谢”开始你就变得很无礼了。有人给你提供了免费的建议,你当然可以拒绝,但是尊重那位愿意花时间提供帮助的人是你至少应该做到的。顺便说一下,我不知道true+0等于1。我猜我是你所说的“其他开发者”中的一员。 - Serge Wautier
3
@Serge,对不起,我不想这么“粗鲁”。但是,我不只是询问布尔值转换为数字的问题。顺便说一下,像“false + 0”这样的转换是错误的建议,更好的方法是使用“Number(false)”。 - barbushin
1
@SeniorDev 在 JavaScript 中,将一个变量附加 + 是将其强制转换为 Number 的常用方法;将 !! 附加以进行 Boolean 强制转换。JavaScript 源代码需要通过互联网传输,因此简洁性很重要。 - Yi Jiang
显示剩余4条评论

0
这是对Yi Jiang回答的修复。如果您调用ajax并且没有设置数据,它会出现错误。添加了一个测试来查看是否设置了数据属性,然后再转换布尔值。我使用underscore,可以随意更换成原生js函数hasownprop ...
function convertBoolToNum( obj ) {
  $.each( obj, function( i ) {
    if ( typeof obj[i] == 'object' ) {
      convertBoolToNum(this);
    }
    else if ( typeof obj[i] == 'boolean' ) {
      obj[i] = Number( obj[i] );
    }
  } );
}

$.ajax = ( function( $ajax ) {
  return function( options ) {
    if ( _.has( options, 'data' ) ) { 
      convertBoolToNum( options.data );
    }  
    return $ajax( options );
  };
} )( $.ajax );

0
这里有一个更加优化的版本,它不会污染全局命名空间,可以递归地转换值,处理潜在的未定义的data属性,并使用正确的方法将布尔值转换为相应的整数值。
$.ajax = (function($ajax) {
    return function(options) {
        (function (obj) {
            var _fn = arguments.callee;
            $.each(obj, function(i) {
                if (typeof obj[i] == 'object') {
                    _fn(this);
                } else if (typeof obj[i] == 'boolean') {
                    obj[i] = ~~obj[i];
                }
            })   
        })(options.data || {});
        return $ajax(options);
    };
})($.ajax);    

我仍然认为这很令人震惊,jQuery在发送请求之前没有内部执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接