首页 文章

Jquery UI可排序 - 在启动事件触发之前执行操作

提问于
浏览
12

我已经搜索了STACKOVERFLOW和其他论坛以解决我的问题 - 如果我错过了一个有效的解决方案,请指出我 .

我的问题:每当在可排序列表中拖动一个元素(一个portlet div)时,我需要在实际拖动过程开始之前执行一些操作(从我在START事件被触发之前的理解) .

更具体一点:我的DIV为用户提供了扩展/折叠它的身体的可能性(就像在jquery UI页面http://jqueryui.com/demos/sortable/#portlets中的示例一样) .

每当拖动一个元素时我都想触发我的折叠方法,以便拖动的唯一可视元素是折叠的DIV .

无论何时我调用我的方法(类似这样)

$someitem.trigger("toggle.somenamespace")

它按预期工作,除了在sortable中触发start事件之前计算拖动帮助器的高度,因此帮助器具有处于未折叠状态的原始元素的高度 .

我最初的想法是:因为可分类的例如在实际拖动过程开始之前测量拖动距离的可能性(使用选项:距离)它应该可以挂钩到此流程中,例如将可排序窗口小部件的原始startDrag函数(或其任何名称)存储在临时var,使用自定义回调覆盖它,该回调首先触发我的折叠功能,然后调用原始函数以确保正确计算高度 . 但是 - 到目前为止,这种方法并没有取得多大成功......

请注意,在处理程序中为拖动或在可排序事件上设置CSS属性具有所需的效果,因为为帮助程序计算的可排序窗口小部件的高度设置为元素属性 .

或者 - 可能有人知道更好的方法来影响在拖动过程中显示的助手的高度,这只是我的观点,我的原始方法(在拖动过程之前更改元素,然后让小部件按照计算方式进行计算)它是有意的)将是一个更好的解决方案......

感谢任何帮助,马蒂亚斯

编辑:将可排序标志:forceHelperSize设置为true并在开始拖动器中设置ui.item /帮助器大小也不起作用,因为它可视地产生所需的效果(仅拖动折叠的项目,但停止元素一直拖下来(好像该项目仍然具有未折叠状态的高度)用帮助器测试:'原始'和'克隆'

2 回答

  • 14

    我已经搜索了很长时间来寻找这个“解决方案”:

    $('.handle').each(function() {
        $(this).mousedown(function() {
            $(this).parent().parent().children('ol').hide('blind', 500);
        });
    });
    

    你可以通过mousedown手柄触发一个事件并隐藏你想要的任何东西 . 然后在我的示例501中将sortable的选项延迟设置为大于隐藏动画持续时间的值 .

    它不是一个优雅的解决方案,但它的工作原理 - 至少在我的程序中 .

  • 11

    你可以做到这一点,但对于即将推出的jQuery UI版本来说,它不是未来的证据:

    var oldMouseStart = $.ui.sortable.prototype._mouseStart;
    $.ui.sortable.prototype._mouseStart = function(event, overrideHandle, noActivation) {
       this._trigger("CustomBeforeStart", event, this._uiHash());
       oldMouseStart.apply(this, [event, overrideHandle, noActivation]);
    };
    
    You can then use the new event when setting up the sortable:
    
    $(".whatever").sortable({
      "CustomBeforeStart":function(e, ui) {
      }
      ...
    });
    

相关问题