从拖动的元素中获取HTML5自定义数据属性

时间:2015-01-15 07:45:48

标签: javascript jquery html5

我有两个列表:一个用于获取元素(商店列表)并将它们拖到另一个列表(购物车)中。

购物车列表存储了每种类型的一个elemenet,如果拖动了同一类型的多个elemenet,我希望Twitter Bootstrap徽章增加,并避免新的重复条目存储。

HTML:

<div class="panel panel-primary">
    <div class="panel-heading">Fruit store</div>
    <div class="panel-body">
        <ul id="fruit-list" class="list-group">
            <li href="#" class="list-group-item" data-type="apple">Apple</li>
            <li href="#" class="list-group-item" data-type="pear">Pear</li>
            <li href="#" class="list-group-item" data-type="banana">Banana</li>
            <li href="#" class="list-group-item" data-type="watermellon">Watermellon</li>
        </ul>
    </div>
</div>
<div class="panel panel-primary">
    <div class="panel-heading">Shopping cart</div>
    <div class="panel-body">
        <ul id="cart-list" class="list-group">
            <li href="#" class="list-group-item" data-type="banana">Banana
                <div class="pull-right">
                    <span id="badge" class="badge">5</span>
                </div>
            </li>
            <li href="#" class="list-group-item" data-type="pear">Pear
                <div class="pull-right">
                    <span id="badge" class="badge">2</span>
                </div>
            </li>
        </ul>
    </div>
</div>

JS:

// Create fruit store list
var list_element = document.getElementById("fruit-list");
var fruit_list = new Sortable(list_element, {
    group: {
        name: "fruit_group",
        pull: 'clone',
        put: false
    },
    sort: false,
    ghostClass: "droppable-area",
});

// Create shopping cart list

    var cart_list_element = document.getElementById("cart-list");
    var cart_list = new Sortable(cart_list_element, {
        group: {
            name: "fruit_group",
            pull: true,
            put: true
        },
        // Element is dropped into the list from another list
        onAdd: function (event) {
            console.log(event.item)
            // First check if there is an equal fruit at the list already. In that case, increment badge number
            var draggedElement = event.item;
            var type = draggedElement.data('type');

            // Iterate existing elements
            $("#cart-list li").each(function () {
                var existingType = $(this).data('type');

                if (existingType == type){
                    var numberOfFruits = event.item.closest('span').innerHTML;
                    console.log(numberOfFruits + ' ' + type + ' already at the list, updating badges');
                    // Increment number of this fruit
                    (event.item.closest('span').innerHTML)++;
                    return false; //break statement
                } else {
                    console.log('New fruit inserted to cart list');
                }
            });
        },
    });

它不起作用,根据Firebug的问题是读取HTML5自定义数据字段data-type。我需要将此data-type字段与已在列表中的字段进行比较以检测重复项(这是一个较大的应用程序的小型可执行示例,我需要比较多个自定义数据字段,因此比较文本列表条目对我来说是不够的;它必须是自定义数据字段。)

正如您所看到的,我尝试从onAdd函数事件中读取已删除的项目(并且根据FireBug,包含在事件中的项目是带有自定义数据字段的已删除项目,所以这一定是好的),我试图用.data()检索数据字段。我已经读过.data()确实创建了一个值的副本,所以在修改值时使用.attr()是个更好的主意,但是这个例子非常虚拟,不需要修改自定义数据字段,所以它应该足够了。

Here is my JsFiddle。知道什么是错的吗?

1 个答案:

答案 0 :(得分:2)

我找到了答案:我使用的是Jquery,我应该使用纯JavaScript:

var type = event.item.getAttribute("data-type");