我试图用list.js创建一个可拖动的列表,但是当我尝试编辑,添加或删除项目时没有任何反应,我想这是回调,但我找不到解决方案。
这是我的HTML:
<script src="http://listjs.com/assets/javascripts/list.min.js"></script>
<div id="contacts">
<ul id="sortable">
<li class="id">
<img src="http://lorempixum.com/100/100/nature/1" class="img" >
<h3>The Grasslands</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. .</p>
<td class="edit"><button class="edit-item-btn">Edit</button></td>
<td class="remove"><button class="remove-item-btn">Remove</button> </td>
</li>
<li class="id">
<img src="http://lorempixum.com/100/100/nature/2" class="img" >
<h3>Paradise Found</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<td class="edit"><button class="edit-item-btn">Edit</button></td>
<td class="remove"><button class="remove-item-btn">Remove</button></td>
</li>
<li class="id">
<img src="http://lorempixum.com/100/100/nature/3" class="img" >
<h3 >Smoke On The Water</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<td class="edit"><button class="edit-item-btn">Edit</button></td>
<td class="remove"><button class="remove-item-btn">Remove</button></td>
</li>
<li class="id">
<img src="http://lorempixum.com/100/100/nature/4" class="img" >
<h3>Headline</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<td class="edit"><button class="edit-item-btn">Edit</button></td>
<td class="remove"><button class="remove-item-btn">Remove</button></td>
</li>
</ul>
<table>
<td class="img">
<input type="hidden" id="id-field" />
<input type="text" id="img-field" placeholder="Img" />
</td>
<td class="description">
<input type="text" id="description-field" placeholder="Description" />
</td>
<td class="add">
<button id="add-btn">Add</button>
<button id="edit-btn">Edit</button>
</td>
</table>
</div>
这是我的js代码:
/*sortable */
$(function() {
$( "#sortable" ).sortable();
$( "#sortable" ).disableSelection();
});
/* listjs */
var options = {
valueNames: [ 'id', 'description', 'img', ]
};
// Init list
var contactList = new Sortable('contacts', options);
var idField = $('#id-field'),
descriptionField = $('#description-field'),
imgField = $('#img-field'),
addBtn = $('#add-btn'),
editBtn = $('#edit-btn').hide(),
removeBtns = $('.remove-item-btn'),
editBtns = $('.edit-item-btn');
// Sets callbacks to the buttons in the list
refreshCallbacks();
addBtn.click(function() {
contactList.add({
id: Math.floor(Math.random()*110000),
description: descriptionField.val(),
img: imgField.val(),
});
clearFields();
refreshCallbacks();
});
editBtn.click(function() {
var item = contactList.get('id', idField.val())[0];
item.values({
id:idField.val(),
description: descriptionField.val(),
img: imgField.val(),
});
clearFields();
editBtn.hide();
addBtn.show();
});
function refreshCallbacks() {
// Needed to add new buttons to jQuery-extended object
removeBtns = $(removeBtns.selector);
editBtns = $(editBtns.selector);
removeBtns.click(function() {
var itemId = $(this).closest('li').find('.id').text();
contactList.remove('id', itemId);
});
editBtns.click(function() {
var itemId = $(this).closest('li').find('.id').text();
var itemValues = contactList.get('id', itemId)[0].values();
idField.val(itemValues.id);
descriptionField.val(itemValues.description);
imgField.val(itemValues.img);
editBtn.show();
addBtn.hide();
});
}
function clearFields() {
descriptionField.val('');
imgField.val('');
}
提前致谢
答案 0 :(得分:0)
我没有使用过listjs,所以我不知道这是不是你要做的。我找到了以下内容:http://listjs.com/examples/add-get-remove/
从那个和你的例子中,我构建了这个:https://jsfiddle.net/Twisty/q7LhmaLb/6/
<强> HTML 强>
<div id="contacts">
<ul id="sortable" class="list">
<li class="id">
<img src="https://lorempixel.com/100/100/nature/1/" class="img">
<h3 class="title">The Grasslands</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit. .</p>
<td class="edit">
<button class="edit-item-btn">Edit</button>
</td>
<td class="remove">
<button class="remove-item-btn">Remove</button>
</td>
</li>
<li class="id">
<img src="https://lorempixel.com/100/100/nature/2/" class="img">
<h3 class="title">Paradise Found</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<td class="edit">
<button class="edit-item-btn">Edit</button>
</td>
<td class="remove">
<button class="remove-item-btn">Remove</button>
</td>
</li>
<li class="id">
<img src="https://lorempixel.com/100/100/nature/3/" class="img">
<h3 class="title">Smoke On The Water</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<td class="edit">
<button class="edit-item-btn">Edit</button>
</td>
<td class="remove">
<button class="remove-item-btn">Remove</button>
</td>
</li>
<li class="id">
<img src="https://lorempixel.com/100/100/nature/4/" class="img">
<h3 class="title">Headline</h3>
<p class="description">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<td class="edit">
<button class="edit-item-btn">Edit</button>
</td>
<td class="remove">
<button class="remove-item-btn">Remove</button>
</td>
</li>
</ul>
<table>
<td class="img">
<input type="hidden" id="id-field" />
<input type="text" id="img-field" placeholder="Img" />
</td>
<td class="">
<input type="text" id="title-field" placeholder="Title" />
</td>
<td class="description">
<input type="text" id="description-field" placeholder="Description" />
</td>
<td class="add">
<button id="add-btn">Add</button>
<button id="edit-btn">Edit</button>
</td>
</table>
</div>
<强> CSS 强>
body {
font-family: sans-serif;
}
.list {
list-style: none;
padding: 0;
margin: 0;
}
.list li {
border: 1px solid #ccc;
border-radius: 6px;
padding: 10px;
margin-bottom: 10px;
}
.list li:after {
content: "";
display: table;
clear: both;
}
.list .img {
display: inline-block;
float: left;
margin-right: 5px;
}
.list .title {
display: inline-block;
padding: 0;
margin: 0;
}
.list .description {
font-size: 0.65em;
padding: 0;
margin:0;
}
<强>的JavaScript 强>
/*sortable */
$(function() {
$("#sortable").sortable().disableSelection();
});
/* listjs */
var options = {
valueNames: ['id', 'title', 'description', 'img', ]
};
// Init list
var contactList = new List('contacts', options);
var idField = $('#id-field'),
titleField = $("#titleField"),
descriptionField = $('#description-field'),
imgField = $('#img-field'),
addBtn = $('#add-btn'),
editBtn = $('#edit-btn').hide(),
removeBtns = $('.remove-item-btn'),
editBtns = $('.edit-item-btn'),
sortList = $("#sortable");
// Sets callbacks to the buttons in the list
refreshCallbacks();
addBtn.click(function() {
contactList.add({
id: Math.floor(Math.random() * 110000),
description: descriptionField.val(),
img: imgField.val(),
});
clearFields();
refreshCallbacks();
sortList.sortable("refresh");
});
editBtn.click(function() {
var item = contactList.get('id', idField.val())[0];
item.values({
id: idField.val(),
description: descriptionField.val(),
img: imgField.val(),
});
clearFields();
editBtn.hide();
addBtn.show();
});
function refreshCallbacks() {
// Needed to add new buttons to jQuery-extended object
removeBtns = $(removeBtns.selector);
editBtns = $(editBtns.selector);
removeBtns.click(function() {
var itemId = $(this).closest('li').find('.id').text();
contactList.remove('id', itemId);
});
editBtns.click(function() {
var itemId = $(this).closest('li').find('.id').text();
var itemValues = contactList.get('id', itemId)[0].values();
idField.val(itemValues.id);
descriptionField.val(itemValues.description);
imgField.val(itemValues.img);
editBtn.show();
addBtn.hide();
});
}
function clearFields() {
descriptionField.val('');
imgField.val('');
}
它允许您对列表进行排序并添加项目。由于项目是动态添加的,因此在添加项目时应调用$("#sortable").sortable("refresh");
。
希望有所帮助。
更新1
我发现了一些小问题,并且更多地为jQuery UI添加了样式。在这里玩:https://jsfiddle.net/Twisty/q7LhmaLb/11/
<强>的JavaScript 强>
/* listjs */
var options = {
valueNames: ['id', {
attr: 'src',
name: 'img'
}, 'title', 'description']
};
// Init list
var contactList = new List('contacts', options);
var idField = $('#id-field'),
titleField = $("#title-field"),
descriptionField = $('#description-field'),
imgField = $('#img-field'),
addBtn = $('#add-btn'),
editBtn = $('#edit-btn').hide(),
removeBtns = $('.remove-item-btn'),
editBtns = $('.edit-item-btn'),
sortList = $("#sortable");
// Sets callbacks to the buttons in the list
refreshCallbacks();
addBtn.click(function() {
contactList.add({
id: Math.floor(Math.random() * 110000),
title: titleField.val(),
description: descriptionField.val(),
img: imgField.val()
});
clearFields();
refreshCallbacks();
sortList.sortable("refresh");
});
editBtn.click(function() {
var item = contactList.get('id', idField.val())[0];
item.values({
id: idField.val(),
title: titleField.val(),
description: descriptionField.val(),
img: imgField.val(),
});
clearFields();
editBtn.hide();
addBtn.show();
});
function refreshCallbacks() {
// Needed to add new buttons to jQuery-extended object
console.log("Callback selectors: ", removeBtns.attr("class"), editBtns.attr("class"));
removeBtns = $("." + removeBtns.attr("class"));
editBtns = $("." + editBtns.attr("class"));
removeBtns.click(function(e) {
console.log(e);
var itemId = $(this).closest('li').find('.id').text();
contactList.remove('id', itemId);
});
editBtns.click(function(e) {
console.log(e);
var itemId = $(this).closest('li').find('.id').text();
var itemValues = contactList.get('id', itemId)[0].values();
idField.val(itemValues.id);
titleField.val(itemValues.title);
descriptionField.val(itemValues.description);
imgField.val(itemValues.img);
editBtn.show();
addBtn.hide();
});
}
function clearFields() {
titleField.val("");
descriptionField.val("");
imgField.val("");
}
/*sortable */
$(function() {
$("#sortable").sortable().disableSelection();
$(".edit-item-btn").button({
icon: "ui-icon-comment",
showLabel: false
});
$(".remove-item-btn").button({
icon: "ui-icon-close",
showLabel: false
});
$(".buttons").controlgroup();
$('#search-field').on('keyup', function() {
var searchString = $(this).val();
contactList.search(searchString);
});
});
我做了很多小事,你可以看到,一个是修复.selector
的使用。我切换到.attr("class")
获取类名并将其用作类选择器。这是有效的,因为元素只定义了1个类。可能会四处寻找,看看是否有更好的解决方案。
这在refreshCallbacks()
中使用如下:
// Needed to add new buttons to jQuery-extended object
removeBtns = $("." + removeBtns.attr("class"));
editBtns = $("." + editBtns.attr("class"));
此函数只是将所有元素(如果已创建任何新元素)重新分配回变量。这解决了“编辑”和“删除”按钮的问题。我注意到编辑没有捕获图像源URL。我在这里发现:http://listjs.com/examples/data-attributes-custom-attributes/所以要在你的项目中修复它,我们这样做:
var options = {
valueNames: ['id', {
attr: 'src',
name: 'img'
}, 'title', 'description']
};
我认为你会做得很好。
更新2
我说得太快了。
https://jsfiddle.net/Twisty/q7LhmaLb/12/
id
未被阅读,因此编辑将始终提取第一项。通过使用li
属性更新data-id
来解决此问题。我不得不进入并修复一些jQuery来与之对齐。
更新3
发现另一个添加,在排序时,订单被更改。发生这种情况时,需要更新列表索引。简单修复:
$("#sortable").sortable({
update: function(e, ui) {
contactList.reIndex();
}
}).disableSelection();