Ответы:
Где возможно, я предпочитаю вызывать функцию, а не отправлять событие. Это хорошо работает, если у вас есть контроль над кодом, который вы хотите запустить, но смотрите ниже случаи, когда вы не являетесь владельцем кода.
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);
}
window.dispatchEvent(new Event('resize'));
trigger
фактически не запускает собственное событие «изменения размера». Он только запускает прослушиватели событий, которые были добавлены с использованием jQuery. В моем случае сторонняя библиотека напрямую слушала нативное событие «resize», и это решение мне помогло.
window.fireEvent
)
С помощью jQuery вы можете попробовать вызвать триггер :
$(window).trigger('resize');
window.dispatchEvent(new Event('resize'));
сделало
Чистый 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);
});
Do not use this method anymore as it is deprecated.
The CreateEvent документы говорят «Многие методы , используемые с CreateEvent, такие как initCustomEvent, являются устаревшими. Используйте конструкторы событий вместо этого.» Эта страница выглядит многообещающе для событий пользовательского интерфейса.
new Event()
метод. Я думаю, что взломать старые браузеры вы могли бы сделать что-то вроде if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }
. Где текущий метод является ответом avetisk .
Объединение ответов 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);
}
Я не смог заставить это работать с любым из вышеперечисленных решений. Как только я связал событие с jQuery, оно работало нормально, как показано ниже:
$(window).bind('resize', function () {
resizeElements();
}).trigger('resize');
Ответ с 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" >..
Я считаю, что это должно работать для всех браузеров:
var event;
if (typeof (Event) === 'function') {
event = new Event('resize');
} else { /*IE*/
event = document.createEvent('Event');
event.initEvent('resize', true, true);
}
window.dispatchEvent(event);
Вы можете сделать это с этой библиотекой. 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);
window.resizeBy()
вызовет событие onresize окна. Это работает как в Javascript, так и в VBScript .
window.resizeBy(xDelta, yDelta)
называется как window.resizeBy(-200, -200)
уменьшить страницу 200px на 200px.