문제

브라우저 창 크기 조정 이벤트에 어떻게 연결할 수 있습니까?

거기 있습니다 jQuery 크기의 이벤트를 듣는 방법 그러나 나는이 하나의 요구 사항을 위해 내 프로젝트에 가져 오지 않는 것을 선호합니다.

도움이 되었습니까?

해결책

jQuery는 표준을 감싸고 있습니다 resize Dom Event, EG.

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

jQuery 5월 모든 브라우저에서 크기 조정 이벤트가 일관되게 발사되도록하는 작업을 수행하지만 브라우저가 다른지 확실하지 않지만 Firefox, Safari 및 IE에서 테스트하는 것이 좋습니다.

다른 팁

Window.onresize 기능을 무시하지 마십시오.

대신, 객체 또는 요소에 이벤트 리스너를 추가 할 함수를 만듭니다. 이를 확인하고 청취자가 작동하지 않는 경우를 확인한 다음 최후의 수단으로서 물체의 기능을 무시합니다. 이것은 jQuery와 같은 라이브러리에서 사용되는 선호하는 방법입니다.

object: 요소 또는 창 객체
type: 크기 조정, 스크롤 (이벤트 유형)
callback: 함수 참조

var addEvent = function(object, type, callback) {
    if (object == null || typeof(object) == 'undefined') return;
    if (object.addEventListener) {
        object.addEventListener(type, callback, false);
    } else if (object.attachEvent) {
        object.attachEvent("on" + type, callback);
    } else {
        object["on"+type] = callback;
    }
};

그런 다음 사용은 다음과 같습니다.

addEvent(window, "resize", function_reference);

또는 익명 기능으로 :

addEvent(window, "resize", function(event) {
  console.log('resized');
});

우선, 나는 알고있다 addEventListener 위의 주석에 메소드가 언급되었지만 코드는 보지 못했습니다. 선호하는 접근법이므로 여기에 있습니다.

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

다음은 작동하는 샘플입니다.

크기 조정 이벤트는 크기를 조정하면서 지속적으로 발사되므로 직접 사용해서는 안됩니다.

디렉터스 기능을 사용하여 초과 통화를 완화하십시오.

window.addEventListener('resize',debounce(handler, delay, immediate),false);

그물 주위에 떠 다니는 일반적인 디포 케이스는 다음과 같습니다.

const debounce = (func, wait, immediate) => {
    var timeout;
    return () => {
        const context = this, args = arguments;
        const later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        const callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

이것은 그렇게 사용할 수 있습니다 ...

window.addEventListener('resize', debounce(() => console.log('hello'),
200, false), false);

200ms마다 한 번 이상 발사하지 않을 것입니다.

모바일 방향 변경의 경우 사용 :

window.addEventListener('orientationchange', () => console.log('hello'), false);

여기에 있습니다 작은 도서관 나는 이것을 깔끔하게 돌보기 위해 함께 모았다.

나는 정답이 @alex V에 의해 이미 제공되었다고 생각하지만, 대답은 5 년이 넘었으므로 현대화가 필요합니다.

두 가지 주요 문제가 있습니다.

  1. 사용하지 마십시오 object 매개 변수 이름으로. 재설정 된 단어입니다. 이 말로 @alex V의 제공되는 기능은 작동하지 않습니다. strict mode.

  2. 그만큼 addEvent @alex v에서 제공 한 함수는 반환되지 않습니다 event object 만약 addEventListener 방법이 사용됩니다. 다른 매개 변수를 추가해야합니다 addEvent 이를 허용하는 기능.

참고 : 새로운 매개 변수입니다 addEvent 이 새로운 기능 버전으로 마이그레이션하면이 기능에 대한 이전 호출을 중단하지 않도록 선택 사항이되었습니다. 모든 레거시 용도가 지원됩니다.

다음은 업데이트되었습니다 addEvent 이러한 변경 사항으로 기능 :

/*
    function: addEvent

    @param: obj         (Object)(Required)

        -   The object which you wish
            to attach your event to.

    @param: type        (String)(Required)

        -   The type of event you
            wish to establish.

    @param: callback    (Function)(Required)

        -   The method you wish
            to be called by your
            event listener.

    @param: eventReturn (Boolean)(Optional)

        -   Whether you want the
            event object returned
            to your callback method.
*/
var addEvent = function(obj, type, callback, eventReturn)
{
    if(obj == null || typeof obj === 'undefined')
        return;

    if(obj.addEventListener)
        obj.addEventListener(type, callback, eventReturn ? true : false);
    else if(obj.attachEvent)
        obj.attachEvent("on" + type, callback);
    else
        obj["on" + type] = callback;
};

새로 전화를 걸었습니다 addEvent 기능:

var watch = function(evt)
{
    /*
        Older browser versions may return evt.srcElement
        Newer browser versions should return evt.currentTarget
    */
    var dimensions = {
        height: (evt.srcElement || evt.currentTarget).innerHeight,
        width: (evt.srcElement || evt.currentTarget).innerWidth
    };
};

addEvent(window, 'resize', watch, true);

내 블로그 게시물을 참조해 주셔서 감사합니다 http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-is.html.

표준 창 크기 조정 이벤트에 연결할 수 있지만 IE에서는 이벤트가 X마다 한 번 발생하고 Y 축 이동마다 한 번 발생하여 성능이 발사 될 수있는 수많은 이벤트가 발생할 수 있습니다. 렌더링이 집중적 인 작업 인 경우 사이트에 미치는 영향.

내 방법에는 후속 이벤트에서 취소되는 짧은 시간 초과가 포함되어있어 사용자가 창 크기 조정을 마칠 때까지 이벤트가 코드까지 거품이되지 않도록합니다.

2018+ 솔루션 :

당신은 사용해야합니다 크기 조정기. 그것은 사용하는 것보다 훨씬 더 나은 성능을 가진 브라우저 네이티브 솔루션이 될 것입니다. resize 이벤트. 또한, 그것은 이벤트를 지원할뿐만 아니라 document 또한 임의적입니다 elements.

var ro = new ResizeObserver( entries => {
  for (let entry of entries) {
    const cr = entry.contentRect;
    console.log('Element:', entry.target);
    console.log(`Element size: ${cr.width}px x ${cr.height}px`);
    console.log(`Element padding: ${cr.top}px ; ${cr.left}px`);
  }
});

// Observe one or multiple elements
ro.observe(someElement);

현재 만 Chrome은이를 지원하지만 다른 브라우저는 따라갈 것입니다 (곧). 지금은 a를 사용해야합니다 폴리 필.

window.onresize = function() {
    // your code
};

다음 블로그 게시물은 귀하에게 유용 할 수 있습니다. IE의 창 크기 조정 이벤트 수정

이 코드를 제공합니다.

Sys.Application.add_load(function(sender, args) {
    $addHandler(window, 'resize', window_resize);
});

var resizeTimeoutId;

function window_resize(e) {
     window.clearTimeout(resizeTimeoutId);
     resizeTimeoutId = window.setTimeout('doResizeCode();', 10);
}

위의 이미 언급 된 솔루션은 창과 창문 만 크기를 조정하는 것만 큼 작동합니다. 그러나 선별 크기를 자식 요소로 전파하려면 이벤트를 직접 전파해야합니다. 다음은이를위한 몇 가지 예제 코드입니다.

window.addEventListener("resize", function () {
  var recResizeElement = function (root) {
    Array.prototype.forEach.call(root.childNodes, function (el) {

      var resizeEvent = document.createEvent("HTMLEvents");
      resizeEvent.initEvent("resize", false, true);
      var propagate = el.dispatchEvent(resizeEvent);

      if (propagate)
        recResizeElement(el);
    });
  };
  recResizeElement(document.body);
});

자식 요소가 전화 할 수 있습니다

 event.preventDefault();

이벤트에서 크기 조정 이벤트의 첫 번째 arg로 전달되는 이벤트 객체. 예를 들어:

var child1 = document.getElementById("child1");
child1.addEventListener("resize", function (event) {
  ...
  event.preventDefault();
});
var EM = new events_managment();

EM.addEvent(window, 'resize', function(win,doc, event_){
    console.log('resized');
    //EM.removeEvent(win,doc, event_);
});

function events_managment(){
    this.events = {};
    this.addEvent = function(node, event_, func){
        if(node.addEventListener){
            if(event_ in this.events){
                node.addEventListener(event_, function(){
                    func(node, event_);
                    this.events[event_](win_doc, event_);
                }, true);
            }else{
                node.addEventListener(event_, function(){
                    func(node, event_);
                }, true);
            }
            this.events[event_] = func;
        }else if(node.attachEvent){

            var ie_event = 'on' + event_;
            if(ie_event in this.events){
                node.attachEvent(ie_event, function(){
                    func(node, ie_event);
                    this.events[ie_event]();
                });
            }else{
                node.attachEvent(ie_event, function(){
                    func(node, ie_event);
                });
            }
            this.events[ie_event] = func;
        }
    }
    this.removeEvent = function(node, event_){
        if(node.removeEventListener){
            node.removeEventListener(event_, this.events[event_], true);
            this.events[event_] = null;
            delete this.events[event_];
        }else if(node.detachEvent){
            node.detachEvent(event_, this.events[event_]);
            this.events[event_] = null;
            delete this.events[event_];
        }
    }
}
<script language="javascript">
    window.onresize = function() {
    document.getElementById('ctl00_ContentPlaceHolder1_Accordion1').style.height = '100%';
} 

</script>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top