繁体   English   中英

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

[英]jQuery.ajax() and sending boolean request arguments

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

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

有一个固定版本的@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);

我知道这篇文章有点旧,但我仍然希望传递这些信息^^我将vars传递给php并抓住它们:

filter_var($var, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

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

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

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

$.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);

这是对易江答案的解决方法。 如果您调用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 );

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM