Как вызвать изменение размера jquery Resizable программно? - PullRequest
20 голосов
/ 26 марта 2010

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

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

Как мне этого добиться?

Ответы [ 5 ]

25 голосов
/ 26 марта 2010

Обновление: Похоже, что внутренняя часть пользовательского интерфейса 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, это был бы еще более простой конец, так как все, что нас волнует, это дельта:

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

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

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

Затем, чтобы изменить размер, вы бы вызвали этот новый resizeTo метод, подобный этому:

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

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

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

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


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

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

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

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

4 голосов
/ 12 ноября 2014

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

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 влево, затем 1px вправо на ручке восточного бара. Чтобы выполнить полный размер, вы можете нацелиться на .ui-resizable-handle.ui-resizable-se, если у вас есть восточные и южные бары изменения размера.

1 голос
/ 19 февраля 2014

Мне нужно было то же самое для тестов. Подобные вопросы имеют только один многообещающий ответ https://stackoverflow.com/a/17099382/1235394,, но это требует дополнительной настройки, поэтому я закончил с собственным решением.

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

$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');

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

0 голосов
/ 23 февраля 2017

Отказ от ответственности (проверено на 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);

примечание:

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

0 голосов
/ 25 апреля 2013
$(".yourWindow").each(function(e) {
    $(this).height($(this).find(".yourContent").height());
});

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

...