Это SSCCE говорит само за себя:
<code><!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">
Скопируйте и запустите его, нажмите кнопку Add
несколько раз. При каждом нажатии вы должны увидеть HTML-код <ul>
, который будет отображаться в <pre id="showsource">
, и ожидаемый код должен быть примерно равен:
<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>
Это работает, как и ожидалось, в FF, Chrome, Safari, Opera и IE8.
Однако IE6 / 7 не может изменить атрибут name
и выдает следующее:
<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>
Я немного погуглил и обнаружил эту очень похожую проблему , он исправил ее и выложил фрагмент кода, как это должно выглядеть. К сожалению, это именно то, что я уже сделал, поэтому я подозреваю, что он тестировал только в IE8, а не в IE6 / 7. За исключением этой конкретной темы, Google мало что раскрыл.
Есть идеи? Или мне действительно нужно вернуться к document.createElement
?
Примечание: я знаю, что могу использовать одно и то же имя для каждого элемента ввода и извлекать их в виде массива, но приведенное выше является лишь базовым примером, в действительности мне действительно нужно изменить атрибут имени, потому что он содержит не только индекс, но и другую информацию, такую как parentindex, порядок и т. д. Он используется для добавления / перестановки / удаления (под) пунктов меню.
Редактировать: это связано с этой ошибкой , JQuery (я использую 1.3.2), таким образом, похоже, не создает входные данные таким образом? Следующее действительно работает:
$('#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());
});
Но я не могу себе представить, что я единственный, кто столкнулся с этой проблемой с jQuery. Даже простой $('<input>').attr('name', 'foo')
не работает в IE6 / 7. Разве jQuery не является кроссбраузерной библиотекой, предназначенной для решения этой конкретной проблемы?