【发布时间】:2010-12-21 13:37:05
【问题描述】:
我已经注册了一个调整窗口大小的触发器。我想知道如何触发要调用的事件。例如,当隐藏一个 div 时,我希望调用我的触发函数。
我发现window.resizeTo()可以触发该功能,但有没有其他解决办法?
【问题讨论】:
标签: javascript jquery events
我已经注册了一个调整窗口大小的触发器。我想知道如何触发要调用的事件。例如,当隐藏一个 div 时,我希望调用我的触发函数。
我发现window.resizeTo()可以触发该功能,但有没有其他解决办法?
【问题讨论】:
标签: javascript jquery events
window.dispatchEvent(new Event('resize'));
【讨论】:
trigger 实际上并没有触发原生的“resize”事件。它只触发使用 jQuery 添加的事件侦听器。就我而言,第 3 方库直接监听本地“调整大小”事件,这是对我有用的解决方案。
window.fireEvent)
在可能的情况下,我更喜欢调用函数而不是调度事件。如果您可以控制要运行的代码,这将非常有效,但请参阅下文了解您不拥有代码的情况。
window.onresize = doALoadOfStuff;
function doALoadOfStuff() {
//do a load of stuff
}
在此示例中,您可以调用 doALoadOfStuff 函数而不调度事件。
在您的现代浏览器中,您可以trigger the event 使用:
window.dispatchEvent(new Event('resize'));
这在 Internet Explorer 中不起作用,您必须在其中进行速记:
var resizeEvent = window.document.createEvent('UIEvents');
resizeEvent.initUIEvent('resize', true, false, window, 0);
window.dispatchEvent(resizeEvent);
jQuery has the trigger method,其工作原理如下:
$(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')); 做到了
结合 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);
}
【讨论】:
一个也可以在 IE 上运行的纯 JS(来自@Manfred comment)
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. createEvent docs 说“许多与 createEvent 一起使用的方法,例如 initCustomEvent,都已弃用。请改用 event constructors。” This page 看起来很有希望用于 UI 事件。
new Event() 方法。我认为作为对旧浏览器的破解,您可以执行if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ } 之类的操作。当前方法是avetisk's answer。
我实际上无法让它与上述任何解决方案一起使用。一旦我用 jQuery 绑定事件,它就可以正常工作,如下所示:
$(window).bind('resize', function () {
resizeElements();
}).trigger('resize');
【讨论】:
只是
$(window).resize();
是我使用的......除非我误解了你的要求。
【讨论】:
我相信这应该适用于所有浏览器:
var event;
if (typeof (Event) === 'function') {
event = new Event('resize');
} else { /*IE*/
event = document.createEvent('Event');
event.initEvent('resize', true, true);
}
window.dispatchEvent(event);
【讨论】:
使用 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" >..
【讨论】:
window.resizeBy() 会触发窗口的 onresize 事件。这适用于Javascript 或VBScript。
window.resizeBy(xDelta, yDelta) 像 window.resizeBy(-200, -200) 一样调用以将页面缩小 200 像素 x 200 像素。
【讨论】: