这篇文章首要给咱们介绍了关于JS怎么监听div的resize事情的相关材料,文中经过示例代码介绍的非常详细,对咱们的学习或者工作具有一定的参考学习价值,需求的朋友们下面随着小编来一起学习学习吧


需求


开发过程中常常遇到的一个问题便是怎么监听一个div的size改动。


比方我用canvas制作了一个chart,当canvas的size发生改动的时候,需求重新制作里面的内容,这个时候就需求监听resize事情做处理。


window上尽管能够添加resize事情监听,但这并不能满意咱们的需求,因为许多时候,div的size发生了改动,但是window的size并没有改动。


不过咱们能够间接运用window的resize事情监听来完成关于某个div的resize事情监听,请看下面详细完成。


关于div的resize事情的监听,完成方式有许多,比方周期性查看,经过scroll事情等等,本文首要介绍经过object元素来完成监听。


/**

 * Created by taozh on 2017/5/6.

 * taozh1982@gmail.com

 */

var EleResize = {

 _handleResize: function (e) {

  var ele = e.target || e.srcElement;

  var trigger = ele.__resizeTrigger__;

  if (trigger) {

   var handlers =www.522966657.com  trigger.__z_resizeListeners;

   if (handlers) {

    var size = handlers.length;

    for (var i = 0; i < size; i++) {

     var h = handlers[i];

     var handler = h.handler;

     var context = h.context;

     handler.apply(context, [e]);

    }

   }

  }

 },

 _removeHandler: function (ele, handler, context) {

  var handlers = ele.__z_resizeListeners;

  if (handlers) {

   var size = handlers.length;

   for (var i = 0; i < size; i++) {

    var h = handlers[i];

    if (h.handler === handler && h.context === context) {

     handlers.splice(i, 1);

     return;

    }

   }

  }

 },

 _createResizeTrigger: function (ele) {

  var obj = document.createElement('object');

  obj.setAttribute('style',

   'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;');

  obj.onload = EleResize._handleObjectLoad;

  obj.type = 'text/html';

  ele.appendChild(obj);

  obj.data = 'about:blank';

  return obj;

 },

 _handleObjectLoad: function (evt) {

  this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;

  this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize);

 }

};

if (document.attachEvent) {//ie9-10

 EleResize.on = function (ele, handler, context) {

  var handlers = ele.__z_resizeListeners;

  if (!handlers) {

   handlers = [];

   ele.__z_resizeListeners = handlers;

   ele.__resizeTrigger__ = ele;

   ele.attachEvent('onresize', EleResize._handleResize);

  }

  handlers.push({

   handler: handler,

   context: context

  });

 };

 EleResize.off = function (ele, handler, context) {

  var handlers = ele.__z_resizeListeners;

  if (handlers) {

   EleResize._removeHandler(ele, handler, context);

   if (handlers.length === 0) {

    ele.detachEvent('onresize', EleResize._handleResize);

    delete ele.__z_resizeListeners;

   }

  }

 }

} else {

 EleResize.on = function (ele, handler, context) {

  var handlers = ele.__z_resizeListeners;

  if (!handlers) {

   handlers = [];

   ele.__z_resizeListeners = handlers;


   if (getComputedStyle(ele, null).position === 'static') {

    ele.style.position = 'relative';

   }

   var obj = EleResize._createResizeTrigger(ele);

   ele.__resizeTrigger__ = obj;

   obj.__resizeElement__ = ele;

  }

  handlers.push({

   handler: handler,

   context: context

  });

 };

 EleResize.off = function (ele, handler, context) {

  var handlers = ele.__z_resizeListeners;

  if (handlers) {

   EleResize._removeHandler(ele, handler, context);

   if (handlers.length === 0) {

    var trigger = ele.__resizeTrigger__;

    if (trigger) {

     trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize);

     ele.removeChild(trigger);

     delete ele.__resizeTrigger__;

    }

    delete ele.__z_resizeListeners;

   }

  }

 }

}


详细完成测验代码:





 

 Resize

 

 



addListener

removeListener

resize




原理


这里的详细完成分两类,


ie9-10


默许支撑div的resize事情,能够直接经过div.attachEvent('onresize', handler);的方式完成


其它浏览器


经过在div中添加一个内置object元素完成监听。


设置object元素的style使其填充满div,这样当div的size发生改动时,object的size也会发生改动。


然后监听object元素的contentDocument.defaultView(window目标)的resize事情。


注: 本文供给的是怎么监听resize事情,其实在resize时,可能会连续快速的触发(比方拖动浏览器),为了提高功率,能够考虑运用批处理的形式。


到此这篇关于JS怎么监听div的resize事情的文章就介绍到这了,更多相关JS监听div的resize事情内容请搜索脚本之家以前的文章或继续浏览下面的相关文章期望咱们今后多多支撑脚本之家!


来历:脚本之家