크로스 브라우저 창 크기 조정 이벤트-JavaScript / jQuery


240

Firefox, WebKit 및 Internet Explorer 에서 작동하는 창 크기 조정 이벤트를 사용하는 올바른 (현대) 방법은 무엇입니까 ?

두 스크롤바를 모두 켜거나 끌 수 있습니까?


나는 또한 이것을 조사하고있다. 여기에 제공된 솔루션을 적용하려고하지만 $ (window) 구문을 이해하지 못합니다. 그게 jquery에 특정한 것입니까?
Byff

1
Byff, 그렇습니다. $ (window)는 jQuery 구문입니다. window.onresize는 원시 JavaScript와 동일합니다.
앤드류 헤지스

이 데모는 누구나 모든 브라우저에서 테스트하는 데 도움이 될 수 있습니다. jsfiddle.net/subodhghulaxe/bHQV5/2
Subodh Ghulaxe

window.dispatchEvent(new Event('resize')); stackoverflow.com/questions/1818474/…
Dylan Valade

모바일의 Opera에서는 상단 표시 줄 (브라우저 UI)이 표시되거나 숨겨 질 때마다 트리거됩니다.
psur

답변:


367

jQuery에는이를위한 내장 메소드 가 있습니다.

$(window).resize(function () { /* do something */ });

UI의 응답 성을 위해, 당신은 영감, 다음 예에서와 같이, 단지 밀리 초 몇 개의 후 코드를 호출 할에서는 setTimeout을 사용하는 것이 좋습니다 :

function doSomething() {
    alert("I'm done resizing for the moment");
};

var resizeTimer;
$(window).resize(function() {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(doSomething, 100);
});

34
버튼으로 창을 전체 화면으로 펼칠 때이 이벤트가 발생하지 않는 이유는 무엇입니까?
Sly

2
@Sly Mac의 Safari, Chrome 및 Mozilla에서 작동합니다. 어떤 브라우저를 사용하십니까?
Mark Vital

2
@Sly :$('.button').on({ click: function(){ /* your code */ $(window).trigger('resize') })
Zack Zatkin-Gold

6
엘리야, 이것은 JavaScript입니다. 당신이 쓴 것은 정확하지 않습니다 (새로운 것으로 구성 할 때 하나의 특정 경우 제외).
Yoh Suzuki

3
이 jQuery 함수는 창 크기 조정시 호출해야하는 현재 함수 목록에 함수 호출을 "추가"한다는 점을 언급 할 가치가 있습니다. 현재 창 크기 조정시 예약 된 기존 이벤트를 덮어 쓰지 않습니다.
RTF

48
$(window).bind('resize', function () { 

    alert('resize');

});

4
resize () 메소드가 실제로 전체 바인드 접근법의 바로 가기이기 때문에 바인드 접근법을 선호하며, 일반적으로 요소에 적용 해야하는 이벤트 핸들러가 두 개 이상인 경우가 종종 있습니다.
Mike Kormendy

@Mike-그뿐만 아니라 리스너를 제거하려는 경우 resize 메소드에 "unbind"메소드가 없다고 생각합니다. "바인드"는 확실히 갈 길입니다!
셰인

43

크기 조정 이벤트를 활용하는 비 jQuery 방법은 다음과 같습니다.

window.addEventListener('resize', function(event){
  // do stuff here
});

모든 최신 브라우저에서 작동합니다. 그것은 당신을 위해 아무것도 스로틀 하지 않습니다 . 다음은 실제로 사용 되는 예 입니다.


이 솔루션은 IE에서 작동하지 않습니다. IE dom을 지원하는 고정 버전 : stackoverflow.com/questions/6927637/…
Sergey

1
> 그것은 당신을 위해 아무것도 조절하지 않습니다. 좀 더 자세히 설명해 주시겠습니까? 무엇을 조절해야합니까? 연속해서 여러 번 발생하는 이벤트와 관련이 있습니까?
josinalvo

@josinalvo는 일반적으로 많은 것을 발생시키는 이벤트를 듣고있을 때 디 바운스 하고 싶은 이벤트 (예 : lodash)를 프로그램에 병목 현상을 일으키지 않도록합니다.
Jondlm

17

오래된 스레드를 가져 와서 죄송하지만 누군가 jQuery를 사용하지 않으려면 다음을 사용할 수 있습니다.

function foo(){....};
window.onresize=foo;

8
이것은 window.onresize에 바인딩 될 수있는 기존 핸들러를 방해합니다. 스크립트가 다른 스크립트와 함께 생태계에 살아야하는 경우 스크립트가 창 크기 조정에서 무언가를 수행하려는 유일한 스크립트라고 가정해서는 안됩니다. jQuery와 같은 프레임 워크를 사용할 수 없다면 최소한 기존 window.onresize를 잡고 처리기를 끝까지 추가하는 것이 좋습니다.
Tom Auger

2
@TomAuger "적어도 기존 window.onresize를 잡고 처리기를 끝에 추가하는 것을 고려해야합니다." -아마도 "처리기 끝에서 기존 처리기를 호출하는 것"과 반대의 의미입니까? 나는 이미 존재하는 함수의 끝에 무언가를 추가하는 자바 스크립트 코드를 정말로보고 싶다 :-)
TMS

어떤 점에서 요점을 알 수 있습니다. 새로운 onResize 핸들러는 기존 onResize를 래핑해야합니다. 그러나 원래 onResize 핸들러를 호출 할 때까지 onResize에 추가하려는 함수를 호출 할 필요는 없습니다. 따라서 원래 onResize 함수 이후에 새로운 onResize 함수가 계속 실행되도록 할 수 있습니다.
Tom Auger


5

jQuery 1.9.1을 사용하면 기술적으로 동일하지만 IE10에서는 작동하지 않지만 Firefox에서는 작동하지 않습니다.

// did not work in IE10
$(function() {
    $(window).resize(CmsContent.adjustSize);
});

이것은 두 브라우저에서 모두 작동했습니다.

// did work in IE10
$(function() {
    $(window).bind('resize', function() {
        CmsContent.adjustSize();
    };
});

편집 :
) * 실제로 하지 , 기술적으로 동일한 같은 지적과로 의견을 설명 WraithKenny헨리 블라이스 .


1
두 가지 변경 사항이 있습니다. 어느 것이 효과가 있었습니까? ( .resize().bind('resize')? 또는 익명 함수를 추가 나는 그것이 두 번째이다 생각하고 있어요.)
WraithKenny

@WraithKenny 좋은 지적입니다. 익명 함수를 추가하는 것이 효과가 있었을 수도 있습니다. 시도해도 기억 나지 않습니다.
bassim

1
첫 번째 경우에서, adjustSize방법은 그 문맥을 잃는다 this번째 통화 반면 CmsContent.adjustSize()보존 thisthis === CmsContent. 메소드에 CmsContent인스턴스가 필요한 adjustSize경우 첫 번째 경우가 실패합니다. 두 번째 경우는 모든 종류의 함수 호출에 대해 작동하므로 항상 익명 함수를 전달하는 것이 좋습니다.
Henry Blyth

1
@HenryBlyth 감사합니다! +1
bassim

4

jQuery$(window).resize()기본적으로 기능을 제공 합니다.

<script type="text/javascript">
// function for resize of div/span elements
var $window = $( window ),
    $rightPanelData = $( '.rightPanelData' )
    $leftPanelData = $( '.leftPanelData' );

//jQuery window resize call/event
$window.resize(function resizeScreen() {
    // console.log('window is resizing');

    // here I am resizing my div class height
    $rightPanelData.css( 'height', $window.height() - 166 );
    $leftPanelData.css ( 'height', $window.height() - 236 );
});
</script> 

3

jQuery 플러그인 "jQuery resize event"는 이벤트를 조절하여 모든 브라우저에서 동일하게 작동하도록하기 때문에이를위한 최상의 솔루션이라고 생각합니다. Andrews 답변과 비슷하지만 크기 조정 이벤트를 특정 요소 / 선택기 및 전체 창에 연결할 수 있기 때문에 더 좋습니다. 깨끗한 코드를 작성할 수있는 새로운 가능성을 열어줍니다.

플러그인은 여기에서 사용할 수 있습니다

많은 리스너를 추가하면 성능 문제가 있지만 대부분의 경우에는 완벽합니다.


0

나는 이것에 더 많은 제어를 추가해야한다고 생각합니다.

    var disableRes = false;
    var refreshWindow = function() {
        disableRes = false;
        location.reload();
    }
    var resizeTimer;
    if (disableRes == false) {
        jQuery(window).resize(function() {
            disableRes = true;
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(refreshWindow, 1000);
        });
    }

0

그것이 jQuery에 도움이되기를 바랍니다.

기존 함수가있는 경우 먼저 함수를 정의하고 다음 단계로 건너 뜁니다.

 function someFun() {
 //use your code
 }

브라우저 크기 조정은 이와 같이 사용합니다.

 $(window).on('resize', function () {
    someFun();  //call your function.
 });

0

언급 된 창 크기 조정 기능 외에도 이벤트 크기를 변경하지 않고 사용하면 크기 조정 이벤트가 많이 발생한다는 것을 이해하는 것이 중요합니다.

Paul Irish는 크기 조정 호출에 많은 영향을 미칩니다. 사용하는 것이 좋습니다. 크로스 브라우저 작동합니다. 다른 날 IE8에서 테스트했으며 모두 괜찮 았습니다.

http://www.paulirish.com/2009/throttled-smartresize-jquery-event-handler/

차이점 을 확인하려면 데모 를 확인하십시오.

완전 함을위한 기능은 다음과 같습니다.

(function($,sr){

  // debouncing function from John Hann
  // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
  var debounce = function (func, threshold, execAsap) {
      var timeout;

      return function debounced () {
          var obj = this, args = arguments;
          function delayed () {
              if (!execAsap)
                  func.apply(obj, args);
              timeout = null;
          };

          if (timeout)
              clearTimeout(timeout);
          else if (execAsap)
              func.apply(obj, args);

          timeout = setTimeout(delayed, threshold || 100);
      };
  }
  // smartresize 
  jQuery.fn[sr] = function(fn){  return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };

})(jQuery,'smartresize');


// usage:
$(window).smartresize(function(){
  // code that takes it easy...
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.