在我开发的一个Web应用程序中,我需要序列化表单,然后将查询字符串分成键值对,如下所述。
var frmSerialized=$(frm).serialize().replace(/\+/g,'%20'); //The jquery libraries upto version 2.0 converts spaces to plus
var frmKeyPair=decodeURIComponent(frmSerialized).split("&");
一切正常,直到发现以下两种情况为止:
当表单元素之一的值包含“&”时。例如
<input name="fName" value="Sons & Co" type="hidden">
当表单元素之一的值包含“?”时。例如
<input type="hidden" name="Questions" value = "A?b.=c">
在这些情况下,窗体序列化和拆分过程失败。在序列化然后拆分查询字符串时,有什么更好的选择?
编辑:此操作的主要目的是对参数进行加密,以防止Web参数被篡改。所以我实际上要做的是:
for(var j=0;j<frmKeyPair.length;j++){
var mapInput;
var element=frmKeyPair[j].split("=");
var elemName=decodeURIComponent(element[0]);
var eleValue=decodeURIComponent(element[1]);
mapInput = document.createElement("input");
mapInput.type = "hidden";
mapInput.name = aesUtil.encrypt(salt, iv, passPhrase, elemName);
mapInput.value = eleValue==null?"":aesUtil.encrypt(salt, iv, passPhrase, eleValue);
mapForm.appendChild(mapInput);
}
在这里,我使用GitHub中可用的CryptoJS库。 MapForm是一个动态创建的新HTML表单。加密完成后,我使用
提交mapForm.submit();
答案 0 :(得分:0)
您可以用&分割以获取它们的键值对,然后在解码值之前用'='分割它们。
var x = $( 'form' ).serialize().replace(/\+/g,'%20');
console.log( x );
x.split( '&' ).forEach(function(keyValue){
var [ key, value ] = keyValue.split( '=' );
console.log( key, ' = ', decodeURIComponent( value ) );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
<input name="fName" value="Sons & Co" type="hidden">
<input type="hidden" name="Questions" value = "A?b.=c">
</form>