js div resize

EleResize.js

/**
 * 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) {
		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;
			}
		}
	}
}

index.html

<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>Resize</title>
		<script src="./EleResize.js"></script>
		<style>
			html,
			body {
				margin: 0;
				padding: 0;
				width: 100%;
				height: 100%;
			}
			
			#resizeDiv {
				width: 60%;
				height: 60%;
				border: 1px solid red;
				margin: 20px;
			}
			
			button {
				margin: 20px 20px 0;
			}
		</style>
	</head>

	<body>
		<button onclick="addListener()">addListener</button>
		<button onclick="removeListener()">removeListener</button>
		<button onclick="resize()">resize</button>
		<div id="resizeDiv"></div>
		<script>
			var resizeDiv = document.getElementById('resizeDiv');

			function resize() {
				resizeDiv.style.width = "200px";
			}
			var listener = function() {
				console.log("resize");
			};

			function addListener() {
				EleResize.on(resizeDiv, listener);
			}

			function removeListener() {
				EleResize.off(resizeDiv, listener)
			}
		</script>
	</body>

</html>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值