EventTarget事件:resize

2019-01-25 15:32 更新

EventTarget事件 - resize

調整文檔視圖(窗口)的大小時將觸發(fā)resize事件。

在某些早期的瀏覽器中,可以在任何HTML元素上注冊resize事件處理程序。仍然可以設置onresize屬性或使用addEventListener()在任何元素上設置處理程序。但是,resize事件僅在window對象(document.defaultView)上觸發(fā)(發(fā)送)。只有在window對象上注冊的處理程序才會收到事件。

有一個新提案(2017)允許所有元素通知調整大小更改。

基本信息

接口UIEvent
是否冒泡沒有
是否可取消沒有
目標Document.defaultViewwindow
默認操作沒有

屬性

屬性類型描述
target(只讀)EventTarget事件目標(DOM樹中最頂層的目標)。
type(只讀)DOMString事件的類型。
bubbles(只讀)Boolean事件是否正常冒泡。
cancelable(只讀)Boolean事件是否可以取消。
view(只讀)WindowProxyDocument.defaultViewwindow文件)
detail(只讀)longfloat0

示例

您可以使用window.onresize或window.addEventListener('resize',...)為resize事件注冊事件處理程序。

由于resize事件可以以高速率觸發(fā),因此事件處理程序不應執(zhí)行計算上昂貴的操作,例如DOM修改。相反,建議使用requestAnimationFrame(),setTimeout()或CustomEvent來限制事件,如下所示。

重要提示:請注意IE11需要customEvent() polyfill才能正常運行。

requestAnimationFrame + customEvent

(function() {
  var throttle = function(type, name, obj) {
    obj = obj || window;
    var running = false;
    var func = function() {
      if (running) { return; }
      running = true;
      requestAnimationFrame(function() {
        obj.dispatchEvent(new CustomEvent(name));
        running = false;
      });
    };
    obj.addEventListener(type, func);
  };

  /* init - you can init any event */
  throttle("resize", "optimizedResize");
})();

// handle event
window.addEventListener("optimizedResize", function() {
  console.log("Resource conscious resize callback!");
});

requestAnimationFrame

var optimizedResize = (function() {

  var callbacks = [],
      running = false;

  // fired on resize event
  function resize() {
    if (!running) {
      running = true;

      if (window.requestAnimationFrame) {
        window.requestAnimationFrame(runCallbacks);
      } else {
        setTimeout(runCallbacks, 66);
      }
    }
  }

  // run the actual callbacks
  function runCallbacks() {
    callbacks.forEach(function(callback) {
      callback();
    });

    running = false;
  }

  // adds callback to loop
  function addCallback(callback) {
    if (callback) {
      callbacks.push(callback);
    }
  }

  return {
    // public method to add additional callback
    add: function(callback) {
      if (!callbacks.length) {
        window.addEventListener('resize', resize);
      }
      addCallback(callback);
    }
  }

}());

// start process
optimizedResize.add(function() {
  console.log('Resource conscious resize callback!')
});

setTimeout

(function() {

  window.addEventListener("resize", resizeThrottler, false);

  var resizeTimeout;
  function resizeThrottler() {
    // ignore resize events as long as an actualResizeHandler execution is in the queue
    if ( !resizeTimeout ) {
      resizeTimeout = setTimeout(function() {
        resizeTimeout = null;
        actualResizeHandler();
     
       // The actualResizeHandler will execute at a rate of 15fps
       }, 66);
    }
  }

  function actualResizeHandler() {
    // handle the resize event
    ...
  }

}());

規(guī)范

  • DOM L3
  • CSSOM視圖
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號