AJAX JSON 乱码

2019-03-25 13:40|来源: 网路

网上下了一个JS、功能是把FORM里的内容序列化为JSON、用AJAX方式提交到后台
JS比较小巧
(function ($) {
    var formJson = {};
    var currentForm = null;

    $.fn.form_serialize = function () {
        currentForm = $(this);
        formJson = {};
        var doms = currentForm.find('[name]');
        $.each(doms, function (index, dom) {
            var domName = $(dom).attr('name');
            if (!formJson[domName]) {
                formJson[domName] = { Name: domName, Type: $(dom).attr('type'), Doms: currentForm.find('[name=' + domName + ']') };
            }
        });
        return getResult();
    };

    var getResult = function () {
        var d = {
            toJson: function () {
                var data = {};
                $.each(formJson, function (key, json) {
                    data[key] = getVal(json);
                });
                return data;
            },
        };
        return d.toJson();
    }

    var getVal = function (json) {
        var methods = {
            getDefaultVal: function (dom) {
                return $(dom).val();
            },
            getSelectVal: function (dom) {
                var val = '';
                var selectType = $(dom).attr('type');
                if (selectType == 'select-multiple') {
                    var items = $(dom).val();
                    if (items == null) return '';
                    for (var i = 0; i < items.length; i++) {
                        val += i == 0 ? items[i] : (',' + items[i]);
                    }
                    return val;
                } else {
                    return $(dom).val();
                }
            },
            getRadioVal: function (dom) {
                return $(dom).attr('checked') ? $(dom).val() : null;
            },
            getCheckBoxVal: function (dom) {
                return methods.getRadioVal(dom);
            }
        };

        var dispacher = function (type, dom) {
            switch (type) {
                case 'text':
                case 'password':
                case 'hidden':
                case 'textarea':
                    return methods.getDefaultVal(dom);
                case 'select-one':
                case 'select-multiple':
                    return methods.getSelectVal(dom);
                case 'radio':
                    return methods.getRadioVal(dom);
                case 'checkbox':
                    return methods.getCheckBoxVal(dom);
                default:
                    return '';
            }
        };

        var domType = json.Type;
        var doms = $(json.Doms);
        var count = doms.length;
        if (count > 1) {
            var val = '';
            var index = 0;
            for (var i = 0; i < count; i++) {
                var v = dispacher(domType, doms.eq(i));
                if (v == '' || v == null || v == undefined)
                    continue;
                val += index++ == 0 ? dispacher(domType, doms.eq(i)) : (',' + dispacher(domType, doms.eq(i)));
            }
            return val;
        } else {
            return dispacher(domType, doms);
        }
    };
})(jQuery);
AJAX调用为:
var formjson=$("#main").form_serialize();
$.getJSON(actionnm,formjson, function(data)
到后台后FORM中输入的中文就乱码了
JSP、ACTION应该没问题、因为我改为FORM的SUBMIT提交就没问题
JS中的这段我改了一下
  getDefaultVal: function (dom) {
   eturn encodeURI(encodeURI($(dom).val()));
   },
还是乱码
不知应怎么改?
应改不是那段JS的问题
我改成
var formjson={"wfclient.cname":"字字"};
$.getJSON(actionnm,formjson, function(data)
也不行

问题补充:解决了、但是不爽
1  var methods = {
   getDefaultVal: function (dom) {
    return encodeURI($(dom).val()、"UTF-8");
},
2 在BEAN的SET方法上改为
public void setCname(String cname){
   try {
     this.cname = URLDecoder.decode(cname,"UTF-8");
   } catch (UnsupportedEncodingException e) {
     this.cname=cname;
   }
}
凡是有中文的BEAN属性的SET方法都要改
感觉很不爽
有没有更好的方法
或能提交JSON的其他AJAX命令

问题补充:
wangqj 写道
你这种方法,是先编码,再解码的方式

还是我说的那个方法,你找到jQuery发送请求的那个函数,
$.ajax 这个函数里面有个参数,你可以找一下

那个参数啊?
网上查、书上查也没发现哪个参数象?

问题补充:
lanrenjun 写道
ajax用post的方式提交 可以避免上述问题

谢谢

相关问答

更多
  • 为什么pdf是乱码[2023-03-29]

    pdf乱码的根本原因是文件的内码丢失了,需要用龙谷的 pdf内码校正 进行校正后就可以正常拷贝复制和另存成word或txt而没有乱码了。
  • pdf为什么是乱码[2022-10-08]

    1. 什么是乱码?(即PDF文档文字符号显示原理) 计算机系统中显示出来的字符,是通过每个字符对应的唯一码(即内码),再用此字符不同字体的字模样式显示出来。如:” 国 ”字的内码是“ B9FA ”,用黑体显示就是“ 国 ”的字样,用楷体显示就是“ 国 ”的字样,但内码都是同一的“ B9FA ”。 对于PDF文档来说也一样,当打开一个PDF文件时,我们看到显示出来的字符是每个字符的字模样式,但当字模与该字符对应的内码不能对应时,将PDF文档内的字符复制黏贴出来则会出现乱码现象,即显示非对应内码的另外一个字符。 ...
  • ajax中json 是什么[2019-05-11]

    1.json是一种数据格式,比xml要简洁 2.都不算是 3.在ajax一般是json来传递数据 4.不需要什么包或者文件,只要你遵守json的数据格式即可 如 {"name":"admin","age":22} ,这个是封装一个人的信息姓名年龄
  • 方法比较简单,比如json的格式是这样的: var obj = {a:1,b:'hello word!'}; for(var a in obj){ document.write(a+"------------"+obj[a]); } 你拿js脚本运行一下这个,你就明白了。
  • Ajax 只能发送utf8格式数据,有可能你接收的那个页面使用了非utf8编码
  • 后台是什么语言,后台也要设置编码格式 另外 jquery ajax 有 一个设置编码的属性 contentType
  • 您没有正确绑定您的参数,因此您可能有一个您没有处理的PDO错误。 更改: $chec->bindParam('cp', $cpf, PDO::PARAM_STR); $chec->bindParam('pw', $passw, PDO::PARAM_STR); 至: // notice the colon : in front of var names, so it matches the placeholders! $chec->bindParam(':cp', $cpf, PDO::PARAM_STR ...
  • 不一样 Ajax是一种异步发送请求和接受数据的技术(不需要重新加载页面)。 您可以使用JSON或XML发送数据或只使用字符串。 当您执行Ajax请求时,除字符串之外的任何数据类型(如数组,对象,数字..)都将丢失其数据类型并成为字符串,因此如果要保留其类型,则必须使用数据传输格式,如JSON和XML 。 Dojo只是一个库,它有更简单的方法来执行Ajax。 你也可以使用jQuery,Angular,..甚至连JavaScript本机XMLHttpRequest。 Not the same Ajax is a ...
  • data是字符串类型。 在循环之前将字符串解析为JSON: data = JSON.parse(data); $.each(data, function() { The data is of string type. Parse the string into JSON before looping: data = JSON.parse(data); $.each(data, function() {