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; 또한 이것은 질문에 대한 답변이 아니며 아래의 pinouchon의 답변이 정답입니다.
Dennis Plucinik

42
구글 R의 : @ avetisk의 대답에서보세요.
Fabian Lauer

1
분리하는 것이 좋지만,이 경우에는 작동하지 않습니다. 창 크기 조정이 트리거되지 않으면 다른 여러 div / 컨테이너에 적절한 높이가 설정되어 있지 않으므로 resize 메소드를 호출하면 작동하지 않습니다.
PandaWood

@ 팬더 우드-내 마지막 예가 귀하의 경우에 더 좋습니다.
Fenton

감사합니다 @ user75525
Bondsmith

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

11
Chrome, FF, Safari에서는 작동하지만 IE에서는 작동하지 않는 것 같습니다!
Davem M

14
jQuery trigger는 실제로 기본 "크기 조정"이벤트를 트리거하지 않습니다. jQuery를 사용하여 추가 된 이벤트 리스너 만 트리거합니다. 필자의 경우 타사 라이브러리는 기본 "크기 조정"이벤트를 직접 듣고 있었고 이것이 나를 위해 일한 솔루션입니다.
chowey 2016 년

2
위대하고 간단한 해결책. 비록 IE 호환성을 위해 약간의 코드를 추가해야한다고 생각합니다 (IE의 경우에는을 사용해야합니다 window.fireEvent)
Victor

35
이것은 모든 장치에서 작동하지 않았습니다. 다음과 같이 이벤트를 트리거해야했습니다. var evt = document.createEvent ( 'UIEvents'); evt.initUIEvent ( 'resize', 참, 거짓, 창, 0); window.dispatchEvent (evt);
Manfred

19
IE11에서 "개체가이 작업을 지원하지 않습니다"라는 메시지가 표시되지 않음
pomber

156

jQuery를 사용하면 트리거 를 호출 할 수 있습니다 .

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

3
이에 대한 사용 사례는 jQuery 플러그인이 창 크기 조정 이벤트를 사용하여 응답하지만 접는 사이드 바가있는 경우입니다. 플러그인 컨테이너의 크기가 조정되지만 창 크기는 다릅니다.
isherwood

4
실제로 JQuery가 필요하지 않지만 제품에서 JQuery를 광범위하게 사용하므로 JQuery 솔루션을 선호합니다.
Sri

워드 프레스 페이지가로드 된 후 크기를 조정하기 위해 어디에 추가됩니까?
SAHM

이것은 최신 Chrome에서 작동하지 않습니다.이 답변은 다음과 같습니다. stackoverflow.com/a/22638332/1296209
webaholik

1
이것은 내가 처음에 작동하지 않았다 점프는 - 시도하지만, 무엇인가 window.dispatchEvent(new Event('resize'));
user2682863

54

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);
});

4
불행하게도 설명서 UIEvent.initUIEvent ()는 말한다 CreateEvent에 워드 프로세서 말을 "사용되지 않으며, 같은 initCustomEvent 같은 CreateEvent에 사용 많은 방법. 사용 이벤트 생성자 대신." 이 페이지 는 UI 이벤트에 유망한 것으로 보입니다. Do not use this method anymore as it is deprecated.
레이싱 올챙이

9
그러나 IE11은이 new Event()방법을 지원하지 않습니다 . 구형 브라우저에 대한 해킹으로 생각할 수 if (Event.prototype.initEvent) { /* deprecated method */ } else { /* current method */ }있습니다. 현재 방법이 avetisk 's answer 입니다.
BrianS 2016 년

@pomber 솔루션에 감사드립니다. 실제로 차트 크기를 조정하기 위해 창 크기 조정에 대한 사용자 정의 이벤트를 트리거하려고했습니다 ... 솔루션이 하루를 저장합니다
Dinesh Gopal Chand

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);
}

1
이것은 jQuery를 사용하지 않고 브라우저에서 수행하는 좋은 방법입니다.
kgx

왜 이것이 최고 답변이 아닌지 모르겠다. .. 이것이 받아 들여지는 "또는"대답보다 낫다 ....
SPillai

14

실제로 위의 솔루션 으로이 작업을 수행 할 수 없었습니다. jQuery로 이벤트를 바인딩하면 다음과 같이 정상적으로 작동합니다.

$(window).bind('resize', function () {
    resizeElements();
}).trigger('resize');

오늘날 Chrome에서 작동합니다.
webaholik

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);
    })

초기 시작 값이 올바르지 않을 수 있으므로 (수정을 위해 디스패치)

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

각도라고하면 (나는 할 수 ..)

<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);

Chrome 및 FF에서는 잘 작동하지만 IE11에서는 작동하지 않았습니다
Collins

@ Collins-업데이트 주셔서 감사합니다. IE11에서 이것을 확인했다고 생각했습니다 ... 피드백을 주셔서 감사합니다.
webaholik

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 이벤트를 트리거합니다. 이것은 자바 스크립트 또는 VBScript 모두에서 작동합니다 .

window.resizeBy(xDelta, yDelta)window.resizeBy(-200, -200)200px x 200px 페이지를 축소하는 것과 같습니다 .


2
이것이 왜 표시되어 있습니까? 맞지 않습니까? 브라우저에 따라 다릅니 까?
Peter Wone

2
이 작동하지 않습니다 어떤 브라우저 : 크롬, 파이어 폭스, IE를 파이어 폭스는 시험했다.
fregante

1
Firefox 7 이상 및 다른 최신 브라우저는 더 이상 대부분의 경우이 메소드 호출을 허용하지 않습니다. 또한 이벤트를 트리거하기 위해 실제로 창 크기를 조정하는 것은 바람직하지 않습니다.
user247702

resizeBy () 및 resizeTo ()는 최신 안정적인 Chrome 버전에서 정상적으로 작동합니다. 76.0
VanagaS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.