如何在JavaScript中触发窗口调整大小事件?

zho*_*shu 302 javascript jquery events

我在窗口调整大小时注册了一个触发器.我想知道如何触发要调用的事件.例如,当隐藏div时,我希望调用我的触发器函数.

我发现window.resizeTo()可以触发该功能,但还有其他解决方案吗?

ave*_*isk 648

window.dispatchEvent(new Event('resize'));
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说并不适用于所有设备.我不得不像这样触发事件:var evt = document.createEvent('UIEvents'); evt.initUIEvent('resize',true,false,window,0); window.dispatchEvent(EVT); (35认同)
  • 在我的IE11中,它失败并显示"对象不支持此操作" (18认同)
  • jQuery的`trigger`实际上并没有触发原生的"resize"事件.它只触发使用jQuery添加的事件侦听器.就我而言,第三方库直接监听本地"resize"事件,这是对我有用的解决方案. (12认同)
  • 似乎适用于Chrome,FF,Safari,但不是:IE! (11认同)
  • 简单明了的解决方案.虽然,我认为你应该为IE兼容性添加一些代码(据我所知,对于IE,我们必须使用`window.fireEvent`) (2认同)

Fen*_*ton 340

在可能的情况下,我更喜欢调用函数而不是调度事件.如果您可以控制要运行的代码,则此方法很有效,但请参阅下面有关您不拥有代码的情况.

window.onresize = doALoadOfStuff;

function doALoadOfStuff() {
    //do a load of stuff
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,您可以在doALoadOfStuff不调度事件的情况下调用该函数.

在现代浏览器中,您可以使用以下命令触发事件:

window.dispatchEvent(new Event('resize'));
Run Code Online (Sandbox Code Playgroud)

这在Internet Explorer中不起作用,您必须在其中进行缩写:

var resizeEvent = window.document.createEvent('UIEvents'); 
resizeEvent.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(resizeEvent);
Run Code Online (Sandbox Code Playgroud)

jQuery有这个trigger方法,它的工作方式如下:

$(window).trigger('resize');
Run Code Online (Sandbox Code Playgroud)

并有警告:

虽然.trigger()模拟事件激活,但是使用合成的事件对象,它并不能完美地复制自然发生的事件.

您还可以模拟特定元素上的事件......

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

  var elem = document.getElementById(id); 

  return elem.dispatchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

  • 要**Google**r:看看@ avetisk的答案. (41认同)
  • 您的匿名功能是不必要的.window.onresize = doALoadOfStuff; 此外,这不回答问题,pinouchon的答案是正确的答案. (6认同)

Ben*_*ier 154

使用jQuery,您可以尝试调用trigger:

$(window).trigger('resize');
Run Code Online (Sandbox Code Playgroud)

  • 确实不需要JQuery,但我更喜欢JQuery解决方案,因为我的产品广泛使用JQuery. (4认同)
  • 一个用例就是当jQuery插件使用窗口调整大小事件来响应时,但是你有一个折叠侧边栏.插件的容器调整大小,但窗口没有. (3认同)
  • 这是我最初尝试过的 - 它不起作用,但是 `window.dispatchEvent(new Event('resize'));` 做到了 (3认同)

pom*_*ber 52

一个也适用于IE的纯JS(来自@Manfred评论)

var evt = window.document.createEvent('UIEvents'); 
evt.initUIEvent('resize', true, false, window, 0); 
window.dispatchEvent(evt);
Run Code Online (Sandbox Code Playgroud)

或角度:

$timeout(function() {
    var evt = $window.document.createEvent('UIEvents'); 
    evt.initUIEvent('resize', true, false, $window, 0); 
    $window.dispatchEvent(evt);
});
Run Code Online (Sandbox Code Playgroud)

  • 没错,但IE11不支持`new Event()`方法.我认为,作为针对旧版浏览器的黑客,你可以做一些像`if(Event.prototype.initEvent){/*不赞成方法*/} else {/*current method*/}`.当前的方法是[avetisk的答案](http://stackoverflow.com/a/18693617/264628). (9认同)
  • 不幸的是,[UIEvent.initUIEvent()](https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/initUIEvent)的文档说"不要再使用这种方法,因为它已被弃用". [createEvent docs](https://developer.mozilla.org/en-US/docs/Web/API/Document/createEvent#Notes)说"不推荐使用许多与createEvent一起使用的方法,例如initCustomEvent.使用[event构造函数](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)." [此页](https://developer.mozilla.org/en-US/docs/Web/API/UIEvent)看起来很有希望用于UI事件. (4认同)

pfi*_*fel 42

将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);
}
Run Code Online (Sandbox Code Playgroud)


BBQ*_*lar 13

我实际上无法使用上述任何解决方案.一旦我用jQuery绑定事件,它就可以正常工作如下:

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');
Run Code Online (Sandbox Code Playgroud)


Mat*_*ich 6

只是

$(window).resize();
Run Code Online (Sandbox Code Playgroud)

是我用的......除非我误解你所要求的.

  • 即使你有jQuery,它也只会触发与jQuery绑定的事件. (3认同)