Jquery ui jQuery UI Resizeable在resize事件中停止调整大小

Jquery ui jQuery UI Resizeable在resize事件中停止调整大小,jquery-ui,resize,jquery-ui-resizable,Jquery Ui,Resize,Jquery Ui Resizable,使用jQueryUIResizeable,我试图防止基于各种规则调整大小。内置的包容功能似乎无法与绝对定位的元素正常工作,无论如何,我需要更灵活的东西 有这样的东西: $( ".selector" ).resizable({ resize : function(event, ui) { /* ??? */ } }); 如何告知“ui”对象以防止调整大小 谢谢。当前版本似乎不可能。我想您可以这样做: $(Selector).css("min-hight", Size); $(

使用jQueryUIResizeable,我试图防止基于各种规则调整大小。内置的包容功能似乎无法与绝对定位的元素正常工作,无论如何,我需要更灵活的东西

有这样的东西:

$( ".selector" ).resizable({ resize : function(event, ui) { /* ??? */ } });
如何告知“ui”对象以防止调整大小


谢谢。

当前版本似乎不可能。

我想您可以这样做:

$(Selector).css("min-hight", Size);
$(Selector).css("max-hight", Size);

这很简单,看看这段代码,它是一个可调整大小的浮动“left”div列,具有固定的宽度和相互的限制

var maxWidthOffset, total2Width;
        $('#'+this.id).find('ul:not(:last)').resizable({
            handles: 'e',
            ghost: true,
            delay: 200,
            helper: "overmoused",
            minWidth: 20,
            start: function(e, ui) {
                maxWidthOffset = ui.element.next().width()-20;
                total2Width = ui.element.width()+maxWidthOffset+20;
            },
            resize: function(e, ui) {
                if (ui.size.width > (ui.originalSize.width + maxWidthOffset)) {
                    $(this).resizable('widget').trigger('mouseup');
                }
            },
            stop: function(e, ui) {
                var w;
                if (ui.originalSize.width > ui.size.width) {
                    w = ui.element.next().width()+ui.originalSize.width - ui.size.width;
                    ui.element.next().width(w>20 ? w : 20);
                } else {
                    w = ui.element.next().width()-(ui.size.width - ui.originalSize.width);
                    ui.element.next().width(w>20 ? w : 20);
                }
                ui.element.width(total2Width-ui.element.next().width());
            }
        });

只需在resize事件中直接设置UI属性。(如果愿意,您也可以在停止事件中执行此操作):

当然,你也可以在定位上做同样的事情


请参阅此提琴:

此版本没有停止调整大小的标准选项。 您可以禁用“可调整大小”选项,但它将继续调整大小,并仅在下次尝试时停止调整大小选项

$(".selector").resizable("disable");
无论如何,我发现可以直接从Resize事件使用maxWidth和maxHeight属性来限制大小调整

$(".selector").resizable({
    aspectRatio: true,
    handles: 'all',
    resize: function( event, ui ){
        if(x > y){
            (".selector").resizable("option","maxWidth",ui.size.width);
            return;
        }
    }
});

您选择的正确答案并非完全正确。这是可以实现的:

使用无用的帮助器停止在调整大小事件中发生的调整大小操作:

$( ".selector" ).resizable({
  resize: function(event, ui) { 
    // resize $(this) as you wish
  },
  helper: $("</div>")
});
$(“.selector”)。可调整大小({
调整大小:函数(事件,ui){
//根据需要调整$(此)的大小
},
助手:$(“”)
});
在“调整大小”事件中,根据需要更改可调整大小的尺寸和位置。停止事件仍有问题。就在停止事件被触发之前,jquery调整了元素的大小——这是您不想要的。您所能做的就是将对象状态重置为上次触发调整大小事件时的状态。因此,在停止事件中,您可以重置可调整大小的尺寸和位置,因为它们是您在上次触发的“调整大小”事件中设置的。为此,您需要在更高的上下文中声明一些变量,或者使用jquery的element.data()方法—您可以选择(如果您觉得更方便的话,您甚至可以创建整个对象的不可见克隆)。下面是最终代码结构的概述:

$( ".selector" ).resizable({
  resize: function(event, ui) { 
    // resize $(this) as you wish and then save the dimensions and positions to some variables declared in a higher context
  },
  helper: $("</div>"),
  stop: function(){
    // restore $(this) position and location as it was last set in the resize event
  }
});
$(“.selector”)。可调整大小({
调整大小:函数(事件,ui){
//根据需要调整$(此项),然后将尺寸和位置保存到更高上下文中声明的某些变量
},
助手:$(“”),
停止:函数(){
//将$(此)位置和位置还原为上次在调整大小事件中设置的位置
}
});

已经很久了,但是如果有人读到这篇文章,这个问题有一个解决方案

您只需在
resize
内设置
maxWidth
minWidth
(取决于您要执行的操作)即可阻止其调整大小

您可以执行以下操作:

minWidth: 300,
start: function(event, ui) {
    // get it once so we don't get it hundreds of time inside resize
    this.enforcedMinWidth = $(this).resizable("option", "minWidth");
},
resize: function(event, ui) {
    // use whatever conditions you want to stop here
    // in my original case, i was checking its width vs neighbor and
    // stops the resizing accordingly, so change it to fit your case
    if (ui.element.next().width() <= this.enforcedMinWidth) {
        $(this).resizable("option", "maxWidth", ui.size.width); 
    }
},
stop: function(event, ui) {
    // reset
    $(this).resizable("option", "maxWidth", null);
    // cleanup
    delete this.enforcedMinWidth;
}
minWidth:300,
开始:功能(事件、用户界面){
//拿一次,这样我们就不会在里面拿几百次了
this.enforcedMinWidth=$(this);
},
调整大小:函数(事件、ui){
//使用任何你想停在这里的条件
//在我最初的例子中,我检查了它的宽度和邻居的距离
//停止相应的大小调整,因此更改它以适合您的情况

如果(ui.element.next().width(),有一种笨拙的方法,即拦截
start
resize

resize: function(event, ui) {
    if (RULE) {
        $(this).resizable('widget').trigger('mouseup');
        var save = window.savePosition;
        save.width  += 4;
        save.height += 4;
        $(ui.helper).css(save);
        return;
    }
},
start: function(event, ui) {
    if (RULE) {
        window.savePosition = $.extend({ }, ui.size, ui.position);
    }
}
不幸的是,在调整大小手柄上有一个4像素的“边框”,因此您必须应用轻微的校正,以避免在中止调整大小操作时可调整大小的区域“跳过”


此解决方案会将保存还原到初始位置,前提是始终应用相同的规则。当然,您可以通过不保存初始位置和大小,而是在调整大小过程中动态重新计算来进行调整。在这种情况下,您根本不需要截取
开始

如果您不需要继续鼠标向下状态,您可以uld刚刚触发鼠标:

var resizableSettings = {
    start: function(event, element) {
        if (a > b) {
            $(this).trigger('mouseup');
        }
    }
};
但是您可能需要继续mousedown状态,例如用户拖动div

下面是一个使用前面提到的一些想法的示例

var resizableSettings = {
    start: function(event, element) {
        if (a > b) {
            $(this).resizable('option', {
                'maxWidth': element.size.width,
                'minWidth': element.size.width,
                'maxHeight': element.size.height,
                'minHeight': element.size.height
            });
            return;
        }
        $(this).resizable('option', {
            'maxWidth': false,
            'minWidth': false,
            'maxHeight': false,
            'minHeight': false
        });
    }
};

你能解决这个问题吗?我在DOM中也遇到了问题。我将包含的元素设置为相对位置。这是根据各种规则停止调整大小的最正确答案。尽管我会在调整大小事件中使用$(this),而不是$('.selector'))肯定是要走的路,而且比Alexey的回答更简单/更干净你的回答正是我想知道的:“如何在调整大小时设置大小?”。谢谢,帮我省去了一些麻烦。是的,mouseup工作得很好。我不明白为什么jqueryui团队不向api添加如此有用的功能。在使用jqueryui时,我总是需要破解一些东西。mouseup可以工作,但如果用户在mousedown状态下尝试执行其他操作(例如拖动div),mouseup将不会有用。
var resizableSettings = {
    start: function(event, element) {
        if (a > b) {
            $(this).resizable('option', {
                'maxWidth': element.size.width,
                'minWidth': element.size.width,
                'maxHeight': element.size.height,
                'minHeight': element.size.height
            });
            return;
        }
        $(this).resizable('option', {
            'maxWidth': false,
            'minWidth': false,
            'maxHeight': false,
            'minHeight': false
        });
    }
};