怎么通过JS听取div的resize事件

今天介绍下js的一些相关知识,文中通过资料跟代码的实战结合生动的讲解了此次内容,应该对于学习编程的朋友有一定帮助,一起来了解下吧~

需求

开发过程中经常遇到的一个问题就是如何监听一个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 = 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 www.6588wang.com) {

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相关的知识呢,希望大家一起共同学习共同成长。

来源:脚本之家

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值