jQuery – codificar valores (escape()) com o serialize()

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. :D

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 :P ).

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

3 Respostas para “jQuery – codificar valores (escape()) com o serialize()”


  1. 1 Mashashi 06/06/2008 às 20:15

    Obrigado, salvas-te a minha vida! xD

    Thanks!

  2. 2 kakaroto 05/12/2008 às 16:43

    desculpe amigo eu baixe o jquery aqui , e fui na linha que vc falou ela nao existe aqui :D

    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 :D

  3. 3 Rodrigo Alvarez 07/01/2009 às 14:27

    É um fake, tudo errado aí…


Deixe um comentário




Fotos

In the class

Drinking Chimarrão

Mateira *.*

Mateira *.*

More Photos

Super Favoritos