2 * jquery.resize.js 0.0.1 - https://github.com/yckart/jquery.resize.js
3 * Resize-event for DOM-Nodes
5 * @see http://workingdraft.de/113/
6 * @see http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
8 * Copyright (c) 2013 Yannick Albert (http://yckart.com)
9 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php).
14 if(typeof define === 'function' && define.amd) {
15 // AMD. Register as an anonymous module.
16 define(['jquery'], factory);
17 } else if(typeof exports === 'object') {
18 // Node/CommonJS style for Browserify
19 module.exports = factory;
26 function addFlowListener(element, type, fn) {
27 var flow = type == 'over';
28 element.addEventListener('OverflowEvent' in window ? 'overflowchanged' : type + 'flow', function(e) {
29 if(e.type == (type + 'flow') || ((e.orient == 0 && e.horizontalOverflow == flow) || (e.orient == 1 && e.verticalOverflow == flow) || (e.orient == 2 && e.horizontalOverflow == flow && e.verticalOverflow == flow))) {
31 return fn.call(this, e);
36 function fireEvent(element, type, data, options) {
37 var options = options || {},
38 event = document.createEvent('Event');
39 event.initEvent(type, 'bubbles' in options ? options.bubbles : true, 'cancelable' in options ? options.cancelable : true);
40 for(var z in data) event[z] = data[z];
41 element.dispatchEvent(event);
44 $.event.special.resize = {
47 var resize = 'onresize' in element;
48 if(!resize && !element._resizeSensor) {
49 var sensor = element._resizeSensor = document.createElement('div');
50 sensor.className = 'resize-sensor';
51 sensor.innerHTML = '<div class="resize-overflow"><div></div></div><div class="resize-underflow"><div></div></div>';
55 first = sensor.firstElementChild.firstChild,
56 last = sensor.lastElementChild.firstChild,
57 matchFlow = function(event) {
59 width = element.offsetWidth;
61 first.style.width = width - 1 + 'px';
62 last.style.width = width + 1 + 'px';
66 var height = element.offsetHeight;
68 first.style.height = height - 1 + 'px';
69 last.style.height = height + 1 + 'px';
73 if(change && event.currentTarget != element) fireEvent(element, 'resize');
76 if(getComputedStyle(element).position == 'static') {
77 element.style.position = 'relative';
78 element._resizeSensor._resetPosition = true;
80 addFlowListener(sensor, 'over', matchFlow);
81 addFlowListener(sensor, 'under', matchFlow);
82 addFlowListener(sensor.firstElementChild, 'over', matchFlow);
83 addFlowListener(sensor.lastElementChild, 'under', matchFlow);
84 element.appendChild(sensor);
87 var events = element._flowEvents || (element._flowEvents = []);
88 if(events.indexOf(handler) == -1) events.push(handler);
89 if(!resize) element.addEventListener('resize', handler, false);
90 element.onresize = function(e) {
91 events.forEach(function(fn) {
97 teardown: function() {
99 var index = element._flowEvents.indexOf(handler);
100 if(index > -1) element._flowEvents.splice(index, 1);
101 if(!element._flowEvents.length) {
102 var sensor = element._resizeSensor;
104 element.removeChild(sensor);
105 if(sensor._resetPosition) element.style.position = 'static';
106 delete element._resizeSensor;
108 if('onresize' in element) element.onresize = null;
109 delete element._flowEvents;
111 element.removeEventListener('resize', handler);
116 resize: function(fn) {
117 return fn ? this.bind("resize", fn) : this.trigger("resize");
120 unresize: function(fn) {
121 return this.unbind("resize", fn);
126 function handler(event) {
127 var orgEvent = event || window.event,
128 args = [].slice.call(arguments, 1);
130 event = $.event.fix(orgEvent);
131 event.type = "resize";
133 // Add event to the front of the arguments
136 return($.event.dispatch || $.event.handle).apply(this, args);