#jquery #html-table #row
#jquery #html-таблица #строка
Вопрос:
У меня есть скрипт, который преобразует список выбора в таблицу флажков;
$('#edit-taxonomy-1').parent().append('<table id="checkboxes"><tbody><tr></tr></tbody></table>');
$('#edit-taxonomy-1 option').each(function() {
var label = $(this).html();
var value = $(this).attr('value');
var ind = $(this).index();
if (ind % 3 === 0 ) {
$('#checkboxes tbody').append('</tr><tr><td><input type="checkbox" value="amp;#039; value amp;#039;">' label '</td>');
}
else {
$('#checkboxes tbody').append('<td><input type="checkbox" value="amp;#039; value amp;#039;">' label '</td>');
}
});
$('#edit-taxonomy-1').replaceWith($("#checkboxes"));
Однако я не могу заставить каждый третий элемент отображаться в новой строке красиво.
Вот пример:http://jsfiddle.net/cxVhz
Он показывает, что у меня есть и чего я хочу
Комментарии:
1. На случай, если вы не получили предупреждение о комментарии, вот как я бы это сделал: jsfiddle.net/cxVhz/38
Ответ №1:
Я думаю, append()
делает что-то за кулисами, что может быть «исправлением» вашего html для вас, прежде чем он добавит его.
Попробуйте этот аналогичный подход:
var tr = "";
$('#edit-taxonomy-1 option').each(function() {
var label = $(this).html();
var value = $(this).attr('value');
var ind = $(this).index() 1;
// continually build your checkbox and label
var checkbox = '<input type="checkbox" value="amp;#039;' value 'amp;#039;" />'
label;
// keep adding to your tr
tr = "<td>" checkbox "</td>";
if (ind % 3 == 0) {
// append the tr and clear its value
$('#checkboxes tbody').append('<tr>' tr '</tr>');
tr = "";
}
});
// if ind % 3 was never hit above, output what is within tr
if (tr != "")
{
$('#checkboxes tbody').append('<tr>' tr '</tr>');
}
рабочий пример: http://jsfiddle.net/cxVhz/18
супер обновленное решение:
$('#edit-taxonomy-1').parent().append('<table id="checkboxes"><tbody></tbody></table>');
$('#edit-taxonomy-1 option').each(function(index) {
var $this = $(this);
if (index % 3 === 0 ) {
$('#checkboxes tbody').append('<tr></tr>');
}
$('#checkboxes tbody tr:last').append('<td><input type="checkbox" value="amp;#039;' $this.val() 'amp;#039;" />' $this.html() '</td>');
});
$('#edit-taxonomy-1').replaceWith($("#checkboxes"));
рабочий пример: http://jsfiddle.net/cxVhz/40
Комментарии:
1. это правильный ответ. Я делал то же самое в jsfiddle. Вот мое решение… 1 за то, что сделал это быстрее меня 🙂 jsfiddle.net/cxVhz/24
2. Да, вам нужно вставить туда правильный HTML, иначе браузер может сделать странные вещи, чтобы исправить это. Вы должны думать о DOM как о DOM, а не как о HTML. (ie. Вы не можете просто вставить туда открывающий и закрывающий теги, вы должны добавить элементы к родительскому элементу.) Вот мое решение с jQuery и некоторыми другими дополнениями: jsfiddle.net/cxVhz/27
3. Я тоже так думал, пока не увидел ответ suhairs, который является наиболее правильным ответом
4. @Drackir также отличное решение, еще более элегантное и прямое
5. Спасибо. 🙂 На самом деле существует множество способов улучшения кода OPs, но я полагаю, что это выходит за рамки вопроса. 😛
Ответ №2:
Вот быстрое и просто рабочее обновление без рефакторинга кода. http://jsfiddle.net/cxVhz/22 Редактировать: tr внутри объявления таблицы не требуется. Замените его на
$('#edit-taxonomy-1').parent().append('<table id="checkboxes"><tbody></tbody></table>');
обновленная ссылка: http://jsfiddle.net/cxVhz/34
Комментарии:
1. Мне больше всего нравится этот ответ. Хорошее использование
:last
и более логичное. 12. обязательно удалите лишний пустой TR в начале
Ответ №3:
В предыдущих примерах были дополнительные TR, поэтому я подумал, что вы, возможно, захотите увидеть это решение. Удачи:http://jsfiddle.net/cxVhz/23
Ответ №4:
Похоже, что вы добавляете TD непосредственно к телу таблицы, а не к строке таблицы:
$('#checkboxes tbody').append('<td><input type="checkbox" value="amp;#039; value amp;#039;">' label '</td>');
Редактировать:
var row = $('<tr></tr>');
$('#edit-taxonomy-1 option').each(function() {
var label = $(this).html();
var value = $(this).attr('value');
var ind = $(this).index();
if (ind % 3 === 0 ) {
$('#checkboxes tbody').append(row);
row = $('<tr></tr>');
var td = $('<td><input type="checkbox" value="amp;#039; value amp;#039;">' label '</td>');
row.append(td);
}
else {
$('<td><input type="checkbox" value="amp;#039; value amp;#039;">' label '</td>').appendTo(row);
}
});
if(row.html().length>0){
$('#checkboxes tbody').append(row);
}
Комментарии:
1. да, я знаю, но если я это сделаю
$('#checkboxes tbody tr')
, это дублирует записи
Ответ №5:
Этот JS работает.
$('#edit-taxonomy-1 option').each(function() {
var label = $(this).html();
var value = $(this).attr('value');
var ind = $(this).index();
if (ind % 3 === 0) {
$('#checkboxes tbody').append('<tr></tr>');
}
$('#checkboxes tbody tr:last-child').append('<td><input type="checkbox" value="amp;#039; value amp;#039;">' label '</td>');
});