Diese SSCCE sagt alles:Ändern Namen attr geklonter Eingabeelement in jQuery funktioniert nicht in 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 es, klicken Sie auf die Add
mehrmals Taste . Auf jedem Klick sollten Sie den HTML-Code der <ul>
zu zeigen, bis in den <pre id="showsource">
und der erwarteten Code sollte etwa sein sehen:
<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>
Dies funktioniert wie in FF, Chrome, Safari, Opera und IE8 erwartet.
jedoch IE6/7 versagt bei der Veränderung der name
Attribut und produziert wie:
<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>
ich googled ein wenig und fand this very similar problem, fixiert er es und veröffentlicht ein Code-Schnipsel, wie es aussehen sollte. Leider habe ich das schon gemacht, also vermute ich, dass er nur im IE8 getestet hat, nicht im IE6/7. Abgesehen von diesem speziellen Thema hat Google nicht viel verraten.
Irgendwelche Einsichten? Oder muss ich wirklich zurück zu document.createElement
greifen?
Hinweis: Ich weiß, dass ich nur den gleichen Namen für jedes Eingabeelement verwenden und sie als ein Array abrufen kann, aber das obige ist nur ein einfaches Beispiel, in Wirklichkeit muss ich das Namensattribut ändern, weil Es enthält nicht nur den Index, sondern auch weitere Informationen wie Parentindex, Sortierung usw. Es wurde verwendet, um (Unter-) Menüpunkte hinzuzufügen/neu anzuordnen/zu entfernen.
Edit: dies this bug verwandt ist, die jQuery (Ich bin mit 1.3.2) scheint somit nicht Eingänge zu schaffen, die Art und Weise? Die folgende funktioniert einfach:
$('#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());
});
Aber ich kann mir nicht vorstellen, dass ich der einzige bin, die dieses Problem mit jQuery begegnet. Selbst eine einfache $('<input>').attr('name', 'foo')
funktioniert nicht in IE6/7. Ist jQuery nicht als eine Crossbrowser-Bibliothek gedacht, die dieses spezielle Thema unter den Hauben behandeln soll?
Ich stieß auf das gleiche Problem und konnte eine Lösung finden: http://stackoverflow.com/questions/2773308/jquery-clone-problem – jantimon