Как вызвать изменение размера jQuery программным способом?

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

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

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

5 ответов


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

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

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

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

$.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 });

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

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

вы можете играть с ним в действии со скрипкой здесь и the resizeBy версия вот!--26-->.


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

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

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

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


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

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 если у вас есть Восток и юг изменить размер баров.


мне нужно то же самое для тестов. как вопросы есть только один многообещающий ответ 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');

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


Hack отказ от ответственности (проверено на 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 etc) как код" resizer" выполняется до полного отображения диалога.


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

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