Hoje me deparei com um problema, estou enviando formulários via Ajax (bem mais rápido) via POST no PHP, com o auxílio do jQuery e em alguns métdos de chamada Ajax eu uso mais ou menos desta maneira:
$.ajax({
url: form.attr('action'),
data: form.serialize() + "&ajax=true",
type: 'post',
(...)
Notem que eu uso o método serialize() do jQuery para me retornar uma string com todos os valores concatenados (ex: nome=julio&sobrenome=vedovatto&foo=bar), método muitíssimo util.
O que eu deparei é que tem o velho problema: acentuação, o fantasma do Ajax. Nem com reza braba se resolve isso direito, sem um bom e velho escape() na string e depois um rawurldecode() no PHP (ou outra função que faça isso na sua linguagem preferida
).
O que eu resolvi fazer? Baixar um source atualizado do jQuery e modificar a função serialize(), deste modo (em torno da linha 2457 do código-fonte):
serialize: function(escape_chars) {
return jQuery.param(this.serializeArray(escape_chars || false));
},
serializeArray: function(escape_chars) {
return this.map(function(){
return jQuery.nodeName(this, "form") ?
jQuery.makeArray(this.elements) : this;
})
.filter(function(){
return this.name && !this.disabled &&
(this.checked || /select|textarea/i.test(this.nodeName) ||
/text|hidden|password/i.test(this.type));
})
.map(function(i, elem){
var val = jQuery(this).val();
return val == null ? null :
val.constructor == Array ?
jQuery.map( val, function(val, i){
return {name: elem.name, value: val};
}) :
{name: elem.name, value: (escape_chars) ? escape(val) : val};
}).get();
}
Vejam que adicionei um parâmetro na função serialize(), quando passar true, ele irá usar um escape() nos valores dos dados. Desta maneira no php eu utilizo um rawurldecode() e pronto. \o/
É só você fazer esta modificação e compilar o código-fonte com o packer, para reduzir seu tamanho (de 94kbs do original para aproximadamente 31 kbs do compacto).




Obrigado, salvas-te a minha vida! xD
Thanks!
desculpe amigo eu baixe o jquery aqui , e fui na linha que vc falou ela nao existe aqui
a minha esta assim :
serialize: function() {
return jQuery.param(this.serializeArray());
},
serializeArray: function() {
return this.map(function(){
return jQuery.nodeName(this, “form”) ?
jQuery.makeArray(this.elements) : this;
})
.filter(function(){
return this.name && !this.disabled &&
(this.checked || /select|textarea/i.test(this.nodeName) ||
/text|hidden|password/i.test(this.type));
})
.map(function(i, elem){
var val = jQuery(this).val();
return val == null ? null :
val.constructor == Array ?
jQuery.map( val, function(val, i){
return {name: elem.name, value: val};
}) :
{name: elem.name, value: val};
}).get();
}
});
pode me ajuda
É um fake, tudo errado aí…