一直以来遇到gbk编码,都是要求两次encodeURIComponent去实现的。
这次的实现是才用模拟表单提交的方式去获取。具体如下代码:
/*
* add by yansong
* for 在gbk页面里实现字符转换成gbk编码提交到后端
* add 传统的做法是进行两次encodeURIComponent后提交,而这个则是直接变成gbk编码,其他是页面编码必须是gbk
*/
(function(win, undefined){
var iframeId = 'iframe_gbk', formId = 'form_gbk', inputName = 'gbk',
doc = document,
bd = doc.body,
createElement = doc.createElement,
$ = doc.getElementById;
win.encodeToGBK = function(str, callback){
createIframe(callback);
createForm(str).submit();
}
function createIframe(callback){
var iframe = $(iframeId);
if(iframe)bd.removeChild(iframe);
iframe = createElement('iframe');
iframe.id = iframeId;
iframe.name = iframeId;
//iframe.src = 'about:blank';
iframe.style.display = 'none';
bd.appendChild(iframe);
if(iframe.attachEvent){
iframe.attachEvent('onload', load);
}else{
iframe.onload = load;
}
// hack for IE 6&7
if(!-[,1]){// also can replace by window.ActiveXObject&&document.documentMode
win.frames[iframeId].name = iframeId;
}
function load(){
callback(iframe.contentWindow.location.search.split('=')[1]);
}
}
function createForm(val){
var form = $(formId), input;
if(form){
form[inputName].value = val;
return form;
}
form = createElement('form');
form.method = 'get';
//form.action = '404.html'; 或者加上这个,但是其值必须要存在才可。
form.target = iframeId;
form.style.display = 'none';
input = createElement('input');
input.type = 'text';
input.name = inputName;
input.value = val;
form.appendChild(input);
bd.appendChild(form);
return form;
}
})(window);
测试代码:
<input type="text" name="aa" value="中国" /><button type="button" id="gg" οnclick="encodeToGBK(this.previousSibling.value, function(s){alert(s)})">点击查看gbk编码</button>