IE7 jQuery .clone y .serialize

Tengo un error extraño, este es mi código.

var form = $("form").clone();
hiddenNodes.clone().appendTo(form);
parameters = form.serialize();

Tengo algunas casillas de verificación en este formulario y algunas otras entradas. Si una casilla de verificación no está marcada y la selecciono, la cadena de parámetros contendrá el valor correcto para esa casilla de verificación. Sin embargo, si quiero desmarcar la casilla de verificación, la cadena de parámetros siempre será verdadera (el valor que la casilla de verificación tenía inicialmente de respuesta) ... Funciona en Firefox ...

editar: Rhe a continuación no es relevante, pero lo guardo para la historia

Yo uso MVC3 y MVC3 presenta dos entradas para casillas de verificación, una casilla de verificación y otra oculta, esto se debe a que cuando envía un formulario, solo envía las casillas marcadas. El campo oculto siempre tiene valor falso, por lo que cuando marque la casilla de verificación obtendrá dos entradas con el mismo nombre (la primera con valor verdadero y la otra con valor falso) pero el enlazador de modelos MVC solo toma la primera. Cuando la casilla de verificación no está marcada, solo enviará el campo oculto con el valor falso y la carpeta se vinculará a eso.

Pero esto es cuando está haciendo envíos completos, estoy haciendo una publicación ajax, para obtener los datos del formulario, hago un formulario de serialización de jquery, en Firefox serialize toma la primera aparición de cada entrada y es por eso que funciona en Firefox. IE7 incluye ambos, y dado que el valor de la casilla de verificación es verdadero, el encuadernador de modelos se vinculará a eso. ¿Hay alguna solución limpia alrededor de esto? Podría eliminar todas las casillas de verificación no marcadas antes de serializar, es la mejor manera

edit2: Leer desde aquí

form.clone () en IE7 siempre devolverá el HTML como se veía cuando vino del servidor, por lo que si la casilla de verificación se marcó desde el servidor, se marcará cuando lo haga form.clone (). Necesito clonarlo porque uso ajax y no puedo destruir el marcado ...

edit3: Esto se vuelve más loco El edit2 solo es cierto cuando la casilla de verificación está marcada desde el servidor, en este caso, el clon siempre estará marcado, no importa si lo ha desmarcado ... Pero si la casilla de verificación no estaba marcada en el servidor y la marca, obtendrá una casilla marcada en la forma clonada.

editar: Esto soluciona el problema

Después de cloneNode, necesito tener estas líneas para agregar el viejo innerHtml al nodo
if (jQuery.browser.msie && (jQuery.browser.version <= 7)) clone.innerHTML = elem.innerHTML;

El problema es que cambiar la API del núcleo de jQuery nunca es una buena solución, es una solución conocida, por lo que, por alguna razón, el equipo de jQuery no quiere solucionarlo. Traté de anular el método cloneNode en el Elemento y agregar el código allí, trabajé en FF pero no en IE, también intenté anular el método de clonación en jQuery, esa parte funcionó, pero el código de clonación subyacente usa métodos que no puedo encontrar una forma de acceder fuera de jQuery ....

Si alguien tiene una buena manera de agregar las líneas de código anteriores a jQuery sin cambiar la API real, hágamelo saber

preguntado el 08 de noviembre de 11 a las 10:11

¿Puedes publicar el código html? Creo que es posible que hayas cometido un error allí. -

¿Ha comprobado en las herramientas de desarrollo de IE lo que sucede? Encontré que las versiones anteriores de IE son muy quisquillosas al insertar elementos creados por jQuery en el DOM, ya que cree que "no son válidos". -

1 Respuestas

http://bugs.jquery.com/ticket/6486 muestra información sobre un informe de error sobre el tema.

También puede intentar agregar el siguiente código y asegurarse de que se ejecute antes de aplicar el .clone:

document.getElementById('id').onclick = function() { 
  var broken = document.getElementById('id'); 
  if (broken.checked) broken.setAttribute('checked','checked'); 
  else broken.removeAttribute('checked'); 
};

Podría funcionar ya que IE tiene algunos problemas conocidos con inner- / outsideHTML.

respondido 08 nov., 11:20

Sí, encontré ese ayer pero la identificación no ayudó, tuve que cambiar el núcleo de jQuery para que funcionara, pero esa no es una solución responsable, así que tengo que encontrar algo más, traté de sobrescribir el método cloneNode en el nivel de elemento, no funcionó. Ver mi edición para el código - Anders

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.