Estoy tratando de enviar mi formulario en AJAX, así que tengo que serializar () los datos. Pero estoy usando fckEditor
y jQuery no sabe cómo manejarlo, así que después de la serialización, intento modificar manualmente el valor, pero hasta ahora no he tenido suerte... alguna idea
if(content_val!=""){ var values = $("#frmblog").serialize(); values.content = content_val; //content_val is the manually fetched data which I am trying to insert into the serialized content. alert(content_val); alert(values); }
serialize
devuelve una cadena codificada en URL que contiene los campos del formulario. Si necesita agregarlo, hágalo utilizando las reglas estándar de cadenas codificadas en URL, por ejemplo:
var values = $("#frmblog").serialize(); values += "&content=" + encodeURIComponent(content_val);
(Lo anterior supone que siempre habrá un valor en los values
después de la llamada de serialize
; si eso no es necesariamente cierto, determine si usar &
en función de si los values
están vacíos antes de agregarlo).
Alternativamente, si lo desea, puede usar serializeArray
y luego agregar a la matriz y usar jQuery.param
para convertir el resultado en una cadena de consulta, pero eso parece un largo camino:
// You can also do this, but it seems a long way 'round var values = $("#frmblog").serializeArray(); values.push({ name: "content", value: content_val }); values = jQuery.param(values);
Actualización : en un comentario agregado más tarde dijiste:
El problema es que se están configurando algunos valores predeterminados en la clave de 'contenido' durante el proceso de serialización, por lo que no puedo simplemente adjuntar un nuevo valor, tengo que actualizar el que ya está".
Eso cambia las cosas. Es un fastidio buscar content
dentro de la cadena codificada en URL, así que iría con la matriz:
var values, index; // Get the parameters as an array values = $("#frmblog").serializeArray(); // Find and replace `content` if there for (index = 0; index < values.length; ++index) { if (values[index].name == "content") { values[index].value = content_val; break; } } // Add it if it wasn't there if (index >= values.length) { values.push({ name: "content", value: content_val }); } // Convert to URL-encoded string values = jQuery.param(values);
Probablemente querrá hacer de esta una función reutilizable.
Con ES15 ahora. Puede usar este en su lugar para editar el valor enviado actual (el más corto)
var values = $("#frmblog").serializeArray(); values.find(input => input.name == 'content').value = content_val; console.log(values);
o función nativa
var values = $("#frmblog").serializeArray(); values.find(function(input) { return input.name == 'content'; }).value = content_val; console.log(values);
Aquí hay un complemento jquery completo basado en la respuesta de @TJ. Puedes llamar
$('form#myForm').awesomeFormSerializer({ foo: 'bar', })
Que reemplazará o agregará el parámetro 'foo' con el valor 'bar' (o cualquier otro parámetro que agregue en el objeto)
Complemento jQuery:
// Not builtin http://stackoverflow.com/a/5075798/2832282 (function ( $ ) { // Pass an object of key/vals to override $.fn.awesomeFormSerializer = function(overrides) { // Get the parameters as an array var newParams = this.serializeArray(); for(var key in overrides) { var newVal = overrides[key] // Find and replace `content` if there for (index = 0; index < newParams.length; ++index) { if (newParams[index].name == key) { newParams[index].value = newVal; break; } } // Add it if it wasn't there if (index >= newParams.length) { newParams.push({ name: key, value: newVal }); } } // Convert to URL-encoded string return $.param(newParams); } }( jQuery ));