【问题标题】:jQuery Sortable updated data not being serializedjQuery Sortable 更新的数据没有被序列化
【发布时间】:2014-08-14 03:49:49
【问题描述】:

我正在使用jQuery Sortable plugin

查看如何序列化数据的基本示例,我有以下代码。

    <div class='span4'>
        <ol class='serialization vertical'>
            <li data-id='1' data-name='Item 1' data-status='1'>Item 1 <span class="status">toggle</span></li>
            <li data-id='2' data-name='Item 2' data-status='1'>Item 2 <span class="status">toggle</span></li>
            <li data-id='3' data-name='Item 3' data-status='1'>Item 3 <span class="status">toggle</span></li>
            <li data-id='4' data-name='Item 4' data-status='1'>Item 4 <span class="status">toggle</span></li>
            <li data-id='5' data-name='Item 5' data-status='1'>Item 5 <span class="status">toggle</span></li>
            <li data-id='6' data-name='Item 6' data-status='1'>Item 6 <span class="status">toggle</span></li>
        </ol>
    </div>

    var group = $("ol.serialization").sortable({
      group: 'serialization',
      delay: 500,
      onDrop: function (item, container, _super) {
        var data = group.sortable("serialize").get();
        var jsonString = JSON.stringify(data, null, ' ');
    console.log(jsonString);
        $('#serialize_output2').text(jsonString);
        _super(item, container)
      }
    });

我想让用户切换每个项目的状态,所以我也添加了

    jQuery(document).on("click", ".status", function (event) {
        var status = $(this).closest("li").attr("data-status");
        if(status == 1) {
            $(this).closest("li").attr( 'data-status','0');
        }
        else {
            $(this).closest("li").attr( 'data-status','1');
        }
    });

如果我在拖放列表项之前单击切换,console.log 将返回正确的状态(1 或 0)。

但是,在我拖放之后,如果我尝试单击以更新状态,然后再次拖放,console.log 将返回我的列表的正确顺序,但不是最新状态。

这里我需要做些什么来保证序列化的数据反映了drop时data属性的值?

see this fiddle.

【问题讨论】:

    标签: javascript jquery html serialization jquery-ui-sortable


    【解决方案1】:

    首先,为什么“data-status”没有更新,如下:

    1. https://github.com/johnny/jquery-sortable/blob/master/source/js/jquery-sortable.js#L118

      var result = $.extend({}, $parent.data())
      
    2. https://github.com/jquery/jquery/blob/1.9-stable/src/data.js#L244

      if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
      
    3. https://github.com/jquery/jquery/blob/1.9-stable/src/data.js#L252

      dataAttr( elem, name, data[ name ] );
      
    4. https://github.com/jquery/jquery/blob/1.9-stable/src/data.js#L291

      if ( data === undefined && elem.nodeType === 1 ) {
      

    所以原因是数据被jQuery缓存了。

    解决办法:

    var group = $("ol.serialization").sortable({
        group: 'serialization',
        delay: 500,
        onDrop: function (item, container, _super) {
            group.children().each(function(){
                jQuery._data(this, 'parsedAttrs', false);
                jQuery.removeData(this);
            });
            var data = group.sortable("serialize").get();
            var jsonString = JSON.stringify(data, null, ' ');
            console.log(jsonString);
            $('#serialize_output2').text(jsonString);
            _super(item, container)
         }
     })
    

    这个小提琴:http://jsfiddle.net/hb6hU/1/

    【讨论】:

    • 感谢您的详细回复和示例,这很有帮助
    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 2011-03-02
    • 2013-04-21
    • 2017-11-22
    • 2015-06-11
    • 2023-03-11
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多