Как вызвать событие изменения размера окна в JavaScript?

327

Я зарегистрировал триггер на изменение размера окна. Я хочу знать, как я могу вызвать событие, которое будет вызвано. Например, когда я скрываю div, я хочу, чтобы вызывалась моя триггерная функция.

Я нашел, window.resizeTo()может вызвать функцию, но есть ли другое решение?

Чжуншу
источник

Ответы:

382

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

window.onresize = doALoadOfStuff;

function doALoadOfStuff() {
    //do a load of stuff
}

В этом примере вы можете вызвать doALoadOfStuffфункцию, не отправляя событие.

В ваших современных браузерах вы можете вызвать событие, используя:

window.dispatchEvent(new Event('resize'));

Это не работает в Internet Explorer, где вам придется сделать условное обозначение:

var resizeEvent = window.document.createEvent('UIEvents'); 
resizeEvent.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(resizeEvent);

У jQuery есть triggerметод , который работает так:

$(window).trigger('resize');

И имеет оговорку:

Хотя .trigger () имитирует активацию события, в комплекте с синтезированным объектом события, она не идеально воспроизводит естественное событие.

Вы также можете моделировать события на конкретном элементе ...

function simulateClick(id) {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}
Фентон
источник
6
Ваша анонимная функция не нужна. window.onresize = doALoadOfStuff; Кроме того, это не отвечает на вопрос, правильный ответ Пинушон ниже.
Деннис Плуциник,
42
Для Google r: посмотрите ответ @ avetisk.
Фабиан Лауэр
1
Хорошая идея отделить, но в моем случае это не работает. Просто вызов метода resize не работает, потому что, если изменение размера окна не вызвано, у других других div / контейнеров не будет установлена ​​правильная высота.
PandaWood
@PandaWood - тогда мой последний пример лучше в вашем случае.
Фентон
Спасибо @ user75525
Бондсмит
676
window.dispatchEvent(new Event('resize'));
avetisk
источник
11
кажется, работает с Chrome, FF, Safari, но не: IE!
Дэйвем М
14
JQuery triggerфактически не запускает собственное событие «изменения размера». Он только запускает прослушиватели событий, которые были добавлены с использованием jQuery. В моем случае сторонняя библиотека напрямую слушала нативное событие «resize», и это решение мне помогло.
chowey
2
Отличное и простое решение. Хотя, я думаю, вы должны добавить некоторый код для совместимости с IE (насколько я вижу, для IE, мы должны использовать window.fireEvent)
Виктор
35
это не работает на всех устройствах для меня. Мне нужно было вызвать событие, как это: var evt = document.createEvent ('UIEvents'); evt.initUIEvent ('resize', true, false, window, 0); window.dispatchEvent (EVT);
Манфред
19
Это терпит неудачу с "Объект не поддерживает это действие" в моем IE11
pomber
156

С помощью jQuery вы можете попробовать вызвать триггер :

$(window).trigger('resize');
Бенджамин Крузье
источник
3
Примером использования этого является случай, когда плагин jQuery использует события изменения размера окна, чтобы реагировать, но у вас есть сворачивающаяся боковая панель. Размер контейнера плагина изменяется, а окно - нет.
Ишервуд
4
Нет необходимости в JQuery, но я предпочитаю решение JQuery, так как мой продукт широко использует JQuery.
Шри
Куда бы это добавить, чтобы изменить размер страницы WordPress после ее загрузки?
SAHM
Это не работает для меня в последнем Chrome, этот ответ делает: stackoverflow.com/a/22638332/1296209
webaholik
1
это то, что я сначала попробовал - это не сработало, но window.dispatchEvent(new Event('resize'));сделало
user2682863
54

Чистый JS, который также работает на IE (из комментария @Manfred )

var evt = window.document.createEvent('UIEvents'); 
evt.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(evt);

Или для угловых:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});
pomber
источник
4
К сожалению, документация UIEvent.initUIEvent () говорит Do not use this method anymore as it is deprecated.The CreateEvent документы говорят «Многие методы , используемые с CreateEvent, такие как initCustomEvent, являются устаревшими. Используйте конструкторы событий вместо этого.» Эта страница выглядит многообещающе для событий пользовательского интерфейса.
Гонки Головастик
9
Правда, но IE11 не поддерживает new Event()метод. Я думаю, что взломать старые браузеры вы могли бы сделать что-то вроде if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }. Где текущий метод является ответом avetisk .
BrianS
@pomber Спасибо за решение, На самом деле я пытался вызвать пользовательское событие для изменения размера окна, чтобы изменить размер моего графика ... Ваше решение спасло мой день
Динеш Гопал Чанд
49

Объединение ответов pomber и avetisk для всех браузеров без предупреждения:

if (typeof(Event) === 'function') {
  // modern browsers
  window.dispatchEvent(new Event('resize'));
} else {
  // for IE and other old browsers
  // causes deprecation warning on modern browsers
  var evt = window.document.createEvent('UIEvents'); 
  evt.initUIEvent('resize', true, false, window, 0); 
  window.dispatchEvent(evt);
}
pfirpfel
источник
1
Это хороший способ сделать это в разных браузерах без использования jQuery.
кгс
не знаю, почему это не лучший ответ ...... это лучше, чем ответы "или" или ", которые принимаются ...
SPillai
14

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

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');
BBQ Singular
источник
Работает в Chrome сегодня.
вебахолик
9

просто

$(window).resize();

это то, что я использую ... если я не понимаю, что вы просите.

Мэтт Сич
источник
3
И даже если у вас есть jQuery, он запускает только события, связанные с jQuery.
adamdport
0

Ответ с RxJS

Скажи что-нибудь в Angular

size$: Observable<number> = fromEvent(window, 'resize').pipe(
            debounceTime(250),
            throttleTime(300),
            mergeMap(() => of(document.body.clientHeight)),
            distinctUntilChanged(),
            startWith(document.body.clientHeight),
          );

Если требуется ручная подписка (или не угловая)

this.size$.subscribe((g) => {
      console.log('clientHeight', g);
    })

Так как мой начальный startWith Value может быть неправильным (отправка для исправления)

window.dispatchEvent(new Event('resize'));

В скажем Angular (я мог ..)

<div class="iframe-container"  [style.height.px]="size$ | async" >..
Серхио Уилсон
источник
0

Я считаю, что это должно работать для всех браузеров:

var event;
if (typeof (Event) === 'function') {
    event = new Event('resize');
} else { /*IE*/
    event = document.createEvent('Event');
    event.initEvent('resize', true, true);
}
window.dispatchEvent(event);
webaholik
источник
Прекрасно работает в Chrome и FF, но не работает в IE11
Коллинз
@Collins - спасибо за обновление, думал, что я проверил это на IE11 ... Я постараюсь потратить некоторое время на обновление, спасибо за отзыв.
вебахолик
0

Вы можете сделать это с этой библиотекой. https://github.com/itmor/events-js

const events = new Events();

events.add({  
  blockIsHidden: () =>  {
    if ($('div').css('display') === 'none') return true;
  }
});

function printText () {
  console.log('The block has become hidden!');
}

events.on('blockIsHidden', printText);
Это мор
источник
-3

window.resizeBy()вызовет событие onresize окна. Это работает как в Javascript, так и в VBScript .

window.resizeBy(xDelta, yDelta)называется как window.resizeBy(-200, -200)уменьшить страницу 200px на 200px.

К
источник
2
Почему это уценено? Это неверно? Это зависит от браузера?
Питер Воне
2
Это не работает ни в одном браузере: Chrome, Firefox, IE, Firefox протестированы.
Фреганте
1
Firefox 7+ и, возможно, другие современные браузеры больше не позволяют вызывать этот метод в большинстве случаев. Кроме того, нежелательно изменять размер окна, чтобы вызвать событие.
user247702
И resizeBy (), и resizeTo () работают нормально в последней стабильной версии Chrome. 76,0
ВанагаС