此表http://jsfiddle.net/rp4fV/477/具有输入元素,我需要对添加数字的行进行排序并通过拖动获得结果,例如,如果我在第4行输入2,则第4行会自动起来以替换第2行和所有行得到排序取决于新的更改,是否有任何建议如何做到这一点? 我知道如何使用拖动来做到这一点,但是使用输入我却不知道如何做到这一点。
它的原因是,有很多行,有时拖动时我无法识别正确的位置。
$('td, th', '#sortFixed').each(function () {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable().disableSelection();
答案 0 :(得分:1)
您需要在操作之后将输入元素绑定到oninput
事件
// Fix the width of the cells
$('td, th', '#sortFixed').each(function() {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable().disableSelection();
$('body').on('input', 'input[type="text"]', function() {
$('tbody tr').removeClass('marker');
var currentEl = $(this);
var index = parseInt(currentEl.val());
if (index <= $('input[type="text"]').length) {
currentEl.attr('value', index)
var oldLoc = currentEl.parent().parent()
var newLoc = $('tbody tr').eq(index-1)
newLoc.addClass('marker')
var newLocHtml = newLoc.html()
newLoc.html(oldLoc.html()).hide().fadeIn(1200);
oldLoc.html(newLocHtml)
}
})
tbody tr {
cursor: move
}
.marker {
background: yellow
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-ui-dist@1.12.1/jquery-ui.min.js"></script>
<table id="sortFixed" class="grid">
<caption>Kurt Vonnegut novels</caption>
<thead>
<tr><th>Order</th><th>Year</th><th>Title</th><th>Grade</th></tr>
</thead>
<tbody>
<tr><td><input type="text" id='ordem_0' name="order"></td><td>1969</td><td>Slaughterhouse-Five</td><td>A+</td></tr>
<tr><td><input type="text" id='ordem_1' name="order"></td><td>1952</td><td>Player Piano</td><td>B</td></tr>
<tr><td><input type="text" id='ordem_2' name="order"></td><td>1963</td><td>Cat's Cradle</td><td>A+</td></tr>
<tr><td><input type="text" id='ordem_3' name="order"></td><td>1973</td><td>Breakfast of Champions</td><td>C</td></tr>
<tr><td><input type="text" id='ordem_4' name="order"></td><td>1965</td><td>God Bless You, Mr. Rosewater</td><td>A</td></tr>
</tbody>
</table>
答案 1 :(得分:0)
它可能比您想要的还要复杂,但是我希望这会有所帮助。
https://jsfiddle.net/Twisty/9aes8omr/
JavaScript
$(function() {
function showIndex(tb) {
var fields = $(tb).find("input[name='order']");
console.log(fields);
fields.each(function(ind, el) {
console.log(ind, el);
$(el).val(ind + 1);
});
}
function spliceRow(tb, r, i) {
var ind = i - 1;
var ln = $("tr", tb).length;
var rows = [];
$("tr", tb).each(function(ind, el) {
rows.push(el);
});
rows.splice(ind, 0, r);
tb.html("");
$.each(rows, function(k, v) {
tb.append(v);
});
}
// Fix the width of the cells
$('td, th', '#sortFixed').each(function() {
var cell = $(this);
cell.width(cell.width());
});
$('#sortFixed tbody').sortable({
items: "> tr",
update: function(e, ui) {
console.log("Sort Update.");
showIndex($(this));
}
}).disableSelection();
$("#sortFixed tbody").on("change", "input[name='order']", function(e) {
var me = $(this);
var orig = me.parents("tr");
var row = orig.clone();
var t = parseInt(me.val());
console.log(t, row);
orig.remove();
spliceRow($("#sortFixed tbody"), row, t);
$("#sortFixed tbody").sortable("refresh");
showIndex($("#sortFixed tbody"));
});
});
如果创建html行的数组,则可以使用.splice()
。如果要使用可排序并手动输入索引,则上面的代码会执行此操作。您可以拖动它们,然后重新排序,或者输入数字,它会更改位置(并刷新可排序的内容)。
这意味着最后,您可以根据需要使用.sortable("serialize")
或.sortable("toArray")
。
希望有帮助。