JS要怎样监听div中的resize事件(实例详解)

这篇文章首要给咱们介绍了关于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.54mren.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事情内容请搜索脚本之家以前的文章或继续浏览下面的相关文章期望咱们今后多多支撑脚本之家!

来历:脚本之家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值