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

时间:2011-02-08 13:30:57

标签: javascript jquery

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

问题是在服务器上someBooleanVar1和someBooleanVar2将作为字符串“false”和“true”接收,但不会作为“0”和“1”接收。有没有办法自动将布尔参数转换为“1”和“0”?

6 个答案:

答案 0 :(得分: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 :(得分: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);

答案 2 :(得分:1)

我知道这篇文章有点旧但我还是想传递这个信息^^ 我将vars传递给php并用以下方式捕获它们:

filter_var($var, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

像这样我将字符串变为布尔值 true=1 false= false,因为字符串在php中是空的

也许我读错了这个问题。但这就是我所理解的:) 使用上面的代码,您可以轻松构建一个函数并添加更多过滤器,以使所有内容按您的需要工作:)

答案 3 :(得分:0)

不是真的自动但添加0会将布尔值转换为0或1:

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

答案 4 :(得分:0)

这是对易江答案的解决方法。如果您调用ajax并且没有数据集,则会出错。在转换布尔值之前添加了一个测试,以查看是否设置了data属性。我使用下划线,随意用原生的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 );

答案 5 :(得分:0)

这是一个更优化的版本,它不会污染全局命名空间,递归转换值,处理潜在的未定义数据属性,并使用正确的方法将布尔值转换为相应的整数值。

$.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不会在内部执行这一点,这令人非常震惊。