【问题标题】:How do I control the style of the clone of a draggable div when moved to a sortable container?移动到可排序容器时,如何控制可拖动 div 的克隆样式?
【发布时间】:2023-04-10 15:11:02
【问题描述】:

我想做的是结合两个项目:

现在我可以毫无问题地将编辑类附加到第一个链接中的现有列表项。当我去创建一个新的可拖动项目(克隆)并将其移动到可排序列表时,我希望它采用旧项目的 css 类。我尝试将代码添加到可拖动的停止事件和可排序的接收事件中,但没有成功。改变的是原版的风格,而不是克隆版的。

                receive: function(event, ui) {
                alert("dropped item ID: " + ui.item.attr('id'));
                $("#draggable").attr('class', 'edit');
                }

stop: function() {
                    if ( !$( "#draggable" ).hasClass( "ui-state-hover" ) ) {
                        $( "#draggable" ).removeClass( "ui-state-highlight" );
                        $( "#draggable" ).addClass( "ui-state-default" );
                        $( "#draggable" ).addClass( "edit" );
                    }
                }

我怎样才能做到这一点?

JSFiddle is here

【问题讨论】:

    标签: javascript jquery draggable jquery-ui-sortable jeditable


    【解决方案1】:

    您实际上可以在可排序事件stop 中使用ui。以下是它们的简短定义:

    ui.
    helper: The jQuery object representing the helper being sorted
    item: The jQuery object representing the current dragged element
    offset: The current absolute position of the helper represented as { top, left }
    position: The current position of the helper represented as { top, left }
    originalPosition: The original position of the element represented as { top, left }
    sender: The sortable that the item comes from if moving from one sortable to another
    

    所以你需要使用停止事件并像这样更改ui.item 样式:

    $(ui.item).attr('class', 'ui-state-default edit');
    

    你必须像这样重新启动可编辑:

    $(document).ready(function() {
        initEditable();
    });
    
    function initEditable(){
        $('.edit').editable('http://www.example.com/save.php', {
            indicator : 'Saving...',
            tooltip   : 'Click to edit...'
        });
        $('.edit_area').editable('http://www.example.com/save.php', { 
            type      : 'textarea',
            cancel    : 'Cancel',
            submit    : 'OK',
            indicator : '<img src="img/indicator.gif">',
            tooltip   : 'Click to edit...'
        });
    }
    
    
    $(function() {
        $( "#sortable" ).sortable({
            revert: true,
            update: function() {
                var orders = [];
                $.each($(this).children(), function(i, item) {
                    orders.push($(item).data("x"));
                });
                $("#info").text("Order: " + orders.join(","));
            },
            stop: function(event, ui) {
                $(ui.item).attr('class', 'ui-state-default edit');
                initEditable();
            }
        });
    });
    

    在此处查看修改后的代码:http://jsfiddle.net/xvsMh/1/

    【讨论】:

    • 解释得很好,JSFiddle 按预期工作。谢谢,SubRed
    • 其实我刚刚注意到了。看起来当您尝试重新排列可排序中的项目时,就在您放开它们(停止事件)之前,它变成了一个编辑框。有没有办法解决这个问题?
    • @Freakishly 在这里看到修改过的小提琴jsfiddle.net/xvsMh/2。最简单的方法之一 :) 您可以简单地将单击事件取消绑定到拖动的项目。希望对您有所帮助。
    • 谢谢,我会将您的答案标记为正确答案。在这里查看我更新的小提琴:jsfiddle.net/parikramatic/eWwPk/10 接下来我试图通过在悬停时显示图像来删除列表项,但它附加到
    • 并且在编辑时看起来很糟糕。请看一下,否则我可能最终会问另一个问题。感谢所有的帮助! :)
  • @Freakishly 欢迎您。我看过你的小提琴,但你能更清楚你接下来要做什么吗?
  • 【解决方案2】:

    您的事件是正确的,但正如您所意识到的,#draggable 是原始项目,而不是克隆项目。获取克隆项目的一种方法是在可排序列表中搜索具有相同类的项目。所以不要使用:

    $("#draggable").attr('class', 'edit');
    

    你使用:

    $('#sortable .ui-draggable')
      .removeClass('ui-state-highlight ui-draggable')
      .addClass('ui-state-default edit');
    

    Demo at JSFiddle

    【讨论】:

    • 感谢您的回复,泰伦。我尝试了演示,虽然粘贴的项目具有新的视觉类,但未应用“编辑”类。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签