Este SSCCE lo dice todo:nombre Cambio de attr elemento de entrada clonado en jQuery no funciona en IE6/7
<!doctype html>
<html lang="en">
<head>
<title>Test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#add').click(function() {
var ul = $('#ul');
var liclone = ul.find('li:last').clone(true);
var input = liclone.find('input');
input.attr('name', input.attr('name').replace(/(foo\[)(\d+)(\])/, function(f, p1, p2, p3) {
return p1 + (parseInt(p2) + 1) + p3;
}));
liclone.appendTo(ul);
$('#showsource').text(ul.html());
});
});
</script>
</head>
<body>
<ul id="ul">
<li><input type="text" name="foo[0]"></li>
</ul>
<button id="add">Add</button>
<pre id="showsource"></pre>
</body>
</html>
Copy'n'paste'n'run, haga clic en el botón varias veces Add
. En cada clic que debe ver el código HTML de la <ul>
a aparecer en el <pre id="showsource">
y el código esperado debería ser aproximadamente:
<li><input name="foo[0]" type="text"></li>
<li><input name="foo[1]" type="text"></li>
<li><input name="foo[2]" type="text"></li>
<li><input name="foo[3]" type="text"></li>
Esto funciona como se esperaba en FF, Chrome, Safari, Opera y IE8.
Sin embargo, Internet Explorer 6/7 fracasa en cambiar el atributo name
y produce productos similares:
<li><input name="foo[0]" type="text">
<li><input name="foo[0]" type="text">
<li><input name="foo[0]" type="text">
<li><input name="foo[0]" type="text"></li>
I googled un poco y encontró this very similar problem, lo arregló y publicó un fragmento de código como debe tener apariencia similares. Desafortunadamente esto es exactamente lo que ya hice, así que sospecho que solo estaba probando en IE8, no en IE6/7. Aparte de ese tema en particular, Google no reveló mucho.
¿Algún conocimiento? ¿O realmente tengo que volver al document.createElement
?
Nota: Sé que puedo usar el mismo nombre para cada elemento de entrada y recuperarlos como una matriz, pero lo anterior es solo un ejemplo básico, en realidad necesito cambiar el nombre del atributo, porque no solo contiene el índice, sino también otra información como parentindex, pedidos, etc. Se ha usado para agregar/reorganizar/eliminar elementos (sub) del menú.
Editar: esto está relacionado con this bug, no parece lo tanto, el jQuery (estoy usando 1.3.2) para crear entradas de esa manera? El siguiente no sólo el trabajo:
$('#add').click(function() {
var ul = $('#ul');
var liclone = ul.find('li:last').clone(true);
var oldinput = liclone.find('input');
var name = oldinput.attr('name').replace(/(foo\[)(\d+)(\])/, function(f, p1, p2, p3) {
return p1 + (parseInt(p2) + 1) + p3;
});
var newinput = $('<input name="' + name + '">');
oldinput.replaceWith(newinput);
liclone.appendTo(ul);
$('#showsource').text(ul.html());
});
Pero no puedo imaginar que yo soy el único que se encontró con este problema con jQuery. Incluso un simple $('<input>').attr('name', 'foo')
no funciona en IE6/7. ¿No se supone que jQuery es una biblioteca de navegador cruzado que cubre este tema en particular bajo los capós?
Me encontré con el mismo problema y pude encontrar una solución: http://stackoverflow.com/questions/2773308/jquery-clone-problem – jantimon