jQuery clone y sus opciones

jQuery clone  es uno de los métodos más prácticos de jQuery  y nos permite clonar un conjunto de nodos DOM. La operación en un principio es muy sencilla pero tiene algunas peculiaridades.  Vamos a empezar con lo más elemental, usar jQuery clone para copiar un bloque de nodos.

 

Para ello nos vamos a construir el siguiente bloque de código que contiene unos botones.


<html>
<head>
<style type="text/css">

#origen {
padding:10px;
border: 1px solid black;
margin:10px;
}

</style>
<script src="jquery-1.11.1.js"></script>
<script type="text/javascript">

$(document).ready(function() {
$(":button(:not('#clonar')").click(function() {

alert("has pulsado");
});

$("#origen").click(function() {

alert("pulsando zona para clonar");
});

$("#clonar").click(function() {

$("#origen").clone().appendTo("#destino");

});

});
</script>
</head>
<body>

<input type="button" value="clonar" id="clonar">
<div id="origen">

<input type="button" value="pulsar" id="botonPulsar1"/>

<div id="zona">
<p>
<input type="button" value="pulsar2" id="botonPulsar2"/>
</p>
</div>

</div>

<div id="destino">
</div>
</body>

</body>
</html>

El código nos prepara una zona para clonar elementos:

Si pulsamos sobre la zona se lanzara un evento que muestra un mensaje de alerta

 

Cuando pulsamos sobre cada uno de los botones nos mostrará el mensaje de botón pulsado  y adicionalmente el mensaje de estar en la zona para clonar.

El siguiente paso es invocar al botón de “clonar” y duplicar los elementos :

 

jQuery clone (data y eventos)

Para nuestra sorpresa la nueva zona que hemos generado no responderá a ningún evento. Esto puede parecer curioso al principio pero se trata de una optimización de jQuery a la hora de copiar el árbol DOM. Para solventar este problema deberemos pasar al método “clone” un parámetro adicional (true):

$("#origen").clone(true).appendTo("#destino");

Esto conseguirá que se copien también los eventos del nodo principal que estamos clonando. Por lo tanto al pulsar sobre la nueva zona saldrá el mensaje :

 

 

Sin embargo no ocurrirá lo mismo con los botones que seguirán sin mostrar “has pulsado”. Para conseguir que también los nodos hijos clonen todos los eventos deberemos usar:

$("#origen").clone(true,true).appendTo("#destino");

Ahora sí que todo funcionara de la forma correcta.

Conclusiones

El método clone de jQuery soporta dos parámetros. El primero si pasamos true nos clona el nodo con sus eventos y el segundo hace lo mismo con todos sus nodos hijos. Por último recordar que estos parámetros también afectan a los datos almacenados con el método data() en los diversos nodos.

Otros artículos relacionados: jQuery On/Off , JQuery data , JQuery WrappedSet