回调不在list.js的可拖动列表中工作

时间:2017-03-15 20:41:35

标签: javascript jquery jquery-ui jquery-ui-draggable list.js

我试图用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('');

}

提前致谢

1 个答案:

答案 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();

示例:https://jsfiddle.net/Twisty/q7LhmaLb/18/