提问人:zhongshu 提问时间:11/30/2009 最后编辑:Shaun Roseltzhongshu 更新时间:11/10/2023 访问量:579883
如何在JavaScript中触发窗口调整大小事件?
How to trigger the window resize event in JavaScript?
问:
我已经注册了窗口大小调整的触发器。我想知道如何触发要调用的事件。例如,当隐藏一个 div 时,我希望调用我的触发器函数。
我发现可以触发该功能,但还有其他解决方案吗?window.resizeTo()
答:
在可能的情况下,我更喜欢调用函数而不是调度事件。如果您可以控制要运行的代码,则此方法非常有效,但有关您不拥有代码的情况,请参阅下文。
window.onresize = doALoadOfStuff;
function doALoadOfStuff() {
//do a load of stuff
}
在此示例中,可以在不调度事件的情况下调用该函数。doALoadOfStuff
在现代浏览器中,您可以使用以下命令触发事件:
window.dispatchEvent(new Event('resize'));
这在 Internet Explorer 中不起作用,您必须在 Internet Explorer 中执行长手操作:
var resizeEvent = window.document.createEvent('UIEvents');
resizeEvent.initUIEvent('resize', true, false, window, 0);
window.dispatchEvent(resizeEvent);
jQuery有触发器
方法,其工作原理如下:
$(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);
}
评论
使用 jQuery,您可以尝试调用 trigger:
$(window).trigger('resize');
评论
window.dispatchEvent(new Event('resize'));
window.dispatchEvent(new Event('resize'));
评论
trigger
window.fireEvent
)
window.resizeBy()
将触发窗口的 onresize 事件。这适用于 Javascript 或 VBScript。
window.resizeBy(xDelta, yDelta)
调用 Like 将页面缩小 200px 200px。window.resizeBy(-200, -200)
评论
我实际上无法将其与上述任何解决方案一起使用。一旦我用jQuery绑定了事件,它就可以正常工作,如下所示:
$(window).bind('resize', function () {
resizeElements();
}).trigger('resize');
评论
只
$(window).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.
new Event()
if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }
结合 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);
}
评论
使用 RxJS 的响应
在 Angular 中说像什么
size$: Observable<number> = fromEvent(window, 'resize').pipe(
debounceTime(250),
throttleTime(300),
mergeMap(() => of(document.body.clientHeight)),
distinctUntilChanged(),
startWith(document.body.clientHeight),
);
如果需要手动订阅(或不需要 Angular)
this.size$.subscribe((g) => {
console.log('clientHeight', g);
})
由于我的初始 startWith 值可能不正确(发送更正)
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);
评论