Как запускать jquery Изменчивое изменение размера программно?

У меня есть элемент div, который сделан jquery Resizable. Он также имеет опцию setResize, поэтому другие элементы изменяются одновременно.

То, что я хочу сделать, - это установить размер этого Resizable div-элемента программно таким образом, чтобы была вызвана вся Resizable-логика (особенно это учитывается и опция Resize).

Как я могу это достичь?

Ответы

Ответ 1

Обновление: Похоже, что внутренности пользовательского интерфейса jQuery сильно изменились, так как я ответил на это, и запуск события больше не работает.

Нет никакого прямого способа запустить событие больше, потому что измененный плагин существенно изменился. Изменяется, поскольку мышь перетаскивается, а не синхронизирует элементы в конце. Это происходит при прослушивании внутреннего события распространения resize для изменяемых размеров плагинов, который теперь запускается обработчиком _mouseDrag. Но это зависит от переменных, установленных на этом пути, поэтому просто стрельба, которая даже внутренне не поможет.

Это означает, что даже переопределение в лучшем случае бесполезно. Я бы рекомендовал просто вручную изменить размер элементов alsoResize напрямую, независимо от виджета пользовательского интерфейса, если это возможно.

Но для удовольствия пусть говорят, что это не так. Проблема в том, что внутренности плагина задают различные свойства, относящиеся к предыдущей и текущей позиции мыши, чтобы знать, сколько нужно изменить размер. Мы можем злоупотреблять использовать это, чтобы добавить метод к виджету, например:

$.widget("ui.resizable", $.ui.resizable, {
    resizeTo: function(newSize) {
        var start = new $.Event("mousedown", { pageX: 0, pageY: 0 });
        this._mouseStart(start);
        this.axis = 'se';
        var end = new $.Event("mouseup", {
            pageX: newSize.width - this.originalSize.width,
            pageY: newSize.height - this.originalSize.height
        });
        this._mouseDrag(end);
        this._mouseStop(end);
    }
});

Это просто создает события мыши, которые ищет виджет resizable и запускает их. Если вы хотели сделать что-то вроде resizeBy, это было бы еще проще, так как все, о чем мы заботимся, это delta:

var end = $.Event("mouseup", { pageX: newSize.width, pageY: newSize.height });

Вы вызываете метод $.widget() после пользовательского интерфейса jQuery и перед созданием экземпляров .resizable(), и все они будут иметь метод resizeTo. Эта часть не изменяется, это просто:

$(".selector").resizable({ alsoResize: ".other-selector" });

Затем для изменения размера вы вызовете этот новый метод resizeTo следующим образом:

$(".selector").resizable("resizeTo", { height: 100, width: 200 });

Это будет действовать так, как если бы вы мгновенно перетащили его в этот размер. Здесь, конечно, есть несколько ошибок:

  • Ось "se" предполагает, что вы хотите изменить размер в правом нижнем углу - я выбрал это, потому что это, безусловно, самый распространенный сценарий, но вы можете просто сделать его параметром.
  • Мы немного подключаемся к внутренним событиям, но я намеренно использую как можно меньше внутренних деталей реализации, так что это менее вероятно, что в будущем это произойдет.
  • В будущих версиях пользовательского интерфейса jQuery он мог бы полностью нарушиться, я только попытался свести к минимуму вероятность этого.

Вы можете играть с ним в действии с скрипкой здесь и resizeBy здесь.


Оригинальный ответ:

Вы можете сделать это:

$(".selector").trigger("resize");

alsoResize внутренне настраивает обработчик события resize, поэтому вам просто нужно вызвать это:)

Ответ 2

Вы можете программно запускать бары. Например, чтобы запустить событие изменения размера восток-запад:

var elem =... // Your ui-resizable element
var eastbar = elem.find(".ui-resizable-handle.ui-resizable-e").first();
var pageX = eastbar.offset().left;
var pageY = eastbar.offset().top;

(eastbar.trigger("mouseover")
        .trigger({ type: "mousedown", which: 1, pageX: pageX, pageY: pageY })
        .trigger({ type: "mousemove", which: 1, pageX: pageX - 1, pageY: pageY })
        .trigger({ type: "mousemove", which: 1, pageX: pageX, pageY: pageY })
        .trigger({ type: "mouseup", which: 1, pageX: pageX, pageY: pageY }));

Я делаю 1px left, а затем 1px правое движение на рукоятке с восточным баром. Чтобы выполнить полный размер, вы можете настроить таргетинг .ui-resizable-handle.ui-resizable-se, если у вас есть полосы изменения по восточному и южному размерам.

Ответ 3

Мне нужно было то же самое для тестов. Аналогично questions есть только один многообещающий ответ fooobar.com/questions/299174/..., но для этого требуется дополнительная настройка, поэтому я закончил свое собственное решение.

У меня есть элемент с изменяемым правым краем

$nameHeader.resizable({handles: 'e', ... });

и мне нужно было вызвать все обратные вызовы во время теста, чтобы правильно изменить все элементы. Ключевая часть тестового кода:

var $nameHeader = $list.find('.list-header .name'),
    $nameCell = $list.find('.list-body .name');
ok($nameHeader.hasClass('ui-resizable'), 'Name header should be resizable');
equal($nameCell.outerWidth(), 300, 'Initial width of Name column');

// retrieve instance of resizable widget
var instance = $nameHeader.data('ui-resizable'),
    position = $nameHeader.position(),
    width = $nameHeader.outerWidth();
ok(instance, 'Instance of resizable widget should exist');

// mouseover initializes instance.axis to 'e'
instance._handles.trigger('mouseover');
// start dragging, fires `start` callback
instance._mouseStart({pageX: position.left + width, pageY: position.top});
// drag 50px to the right, fires `resize` callback
instance._mouseDrag({pageX: position.left + width + 50, pageY: position.top});
// stop dragging, fires `stop` callback
instance._mouseStop({pageX: position.left + width + 50, pageY: position.top});

// ensure width of linked element is changed after resizing
equal($nameCell.outerWidth(), 350, 'Name column width should change');

Конечно, этот код является хрупким и может прерываться при изменении виджета.

Ответ 4

Hack Disclaimer (проверено на jQuery 1.12.4):

Это в основном ждет открытия диалогового окна, а затем увеличивается на 1px (что заставляет событие resize()), а затем уменьшается на 1px (чтобы восстановить размер original)

просто скажите это в диалоговом обработчике событий open:

 $(this)
.dialog("option","width",$(this).dialog("option","width")+1)
.dialog("option","width",$(this).dialog("option","width")-1);

Примечание:

Это может не работать с эффектами show (например, fadeIn,slideDown и т.д.), так как код "resizer" выполняется до полного отображения диалога.

Ответ 5

$(".yourWindow").each(function(e) {
    $(this).height($(this).find(".yourContent").height());
});

И то же самое с шириной.