Fix autosize for jQuery 3.6.1. 2022-11-09
authorIain Patterson <me@iain.cx>
Wed, 9 Nov 2022 10:49:00 +0000 (05:49 -0500)
committerIain Patterson <me@iain.cx>
Wed, 9 Nov 2022 10:51:44 +0000 (05:51 -0500)
lib/forms.php
www/jquery.autosize.js

index 5751f78..b7da305 100644 (file)
@@ -36,7 +36,7 @@
     else echo $_POST[$name];
     echo "</textarea>";
     echo "<script>\n  $(function() {\n";
-    echo "    $(\"#$id\").autosize();\n";
+    echo "    autosize($(\"#$id\"));\n";
     echo "  });</script>";
   }
 
index 3e575d0..6ab5e91 100644 (file)
@@ -1,256 +1 @@
-const map = (typeof Map === "function") ? new Map() : (function () {
-       const keys = [];
-       const values = [];
-
-       return {
-               has(key) {
-                       return keys.indexOf(key) > -1;
-               },
-               get(key) {
-                       return values[keys.indexOf(key)];
-               },
-               set(key, value) {
-                       if (keys.indexOf(key) === -1) {
-                               keys.push(key);
-                               values.push(value);
-                       }
-               },
-               delete(key) {
-                       const index = keys.indexOf(key);
-                       if (index > -1) {
-                               keys.splice(index, 1);
-                               values.splice(index, 1);
-                       }
-               },
-       }
-})();
-
-let createEvent = (name)=> new Event(name, {bubbles: true});
-try {
-       new Event('test');
-} catch(e) {
-       // IE does not support `new Event()`
-       createEvent = (name)=> {
-               const evt = document.createEvent('Event');
-               evt.initEvent(name, true, false);
-               return evt;
-       };
-}
-
-function assign(ta) {
-       if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return;
-
-       let heightOffset = null;
-       let clientWidth = null;
-       let cachedHeight = null;
-
-       function init() {
-               const style = window.getComputedStyle(ta, null);
-
-               if (style.resize === 'vertical') {
-                       ta.style.resize = 'none';
-               } else if (style.resize === 'both') {
-                       ta.style.resize = 'horizontal';
-               }
-
-               if (style.boxSizing === 'content-box') {
-                       heightOffset = -(parseFloat(style.paddingTop)+parseFloat(style.paddingBottom));
-               } else {
-                       heightOffset = parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth);
-               }
-               // Fix when a textarea is not on document body and heightOffset is Not a Number
-               if (isNaN(heightOffset)) {
-                       heightOffset = 0;
-               }
-
-               update();
-       }
-
-       function changeOverflow(value) {
-               {
-                       // Chrome/Safari-specific fix:
-                       // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space
-                       // made available by removing the scrollbar. The following forces the necessary text reflow.
-                       const width = ta.style.width;
-                       ta.style.width = '0px';
-                       // Force reflow:
-                       /* jshint ignore:start */
-                       ta.offsetWidth;
-                       /* jshint ignore:end */
-                       ta.style.width = width;
-               }
-
-               ta.style.overflowY = value;
-       }
-
-       function getParentOverflows(el) {
-               const arr = [];
-
-               while (el && el.parentNode && el.parentNode instanceof Element) {
-                       if (el.parentNode.scrollTop) {
-                               arr.push({
-                                       node: el.parentNode,
-                                       scrollTop: el.parentNode.scrollTop,
-                               })
-                       }
-                       el = el.parentNode;
-               }
-
-               return arr;
-       }
-
-       function resize() {
-               if (ta.scrollHeight === 0) {
-                       // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.
-                       return;
-               }
-
-               const overflows = getParentOverflows(ta);
-               const docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240)
-
-               ta.style.height = '';
-               ta.style.height = (ta.scrollHeight+heightOffset)+'px';
-
-               // used to check if an update is actually necessary on window.resize
-               clientWidth = ta.clientWidth;
-
-               // prevents scroll-position jumping
-               overflows.forEach(el => {
-                       el.node.scrollTop = el.scrollTop
-               });
-
-               if (docTop) {
-                       document.documentElement.scrollTop = docTop;
-               }
-       }
-
-       function update() {
-               resize();
-
-               const styleHeight = Math.round(parseFloat(ta.style.height));
-               const computed = window.getComputedStyle(ta, null);
-
-               // Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box
-               var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight;
-
-               // The actual height not matching the style height (set via the resize method) indicates that 
-               // the max-height has been exceeded, in which case the overflow should be allowed.
-               if (actualHeight < styleHeight) {
-                       if (computed.overflowY === 'hidden') {
-                               changeOverflow('scroll');
-                               resize();
-                               actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
-                       }
-               } else {
-                       // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands.
-                       if (computed.overflowY !== 'hidden') {
-                               changeOverflow('hidden');
-                               resize();
-                               actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
-                       }
-               }
-
-               if (cachedHeight !== actualHeight) {
-                       cachedHeight = actualHeight;
-                       const evt = createEvent('autosize:resized');
-                       try {
-                               ta.dispatchEvent(evt);
-                       } catch (err) {
-                               // Firefox will throw an error on dispatchEvent for a detached element
-                               // https://bugzilla.mozilla.org/show_bug.cgi?id=889376
-                       }
-               }
-       }
-
-       const pageResize = () => {
-               if (ta.clientWidth !== clientWidth) {
-                       update();
-               }
-       };
-
-       const destroy = (style => {
-               window.removeEventListener('resize', pageResize, false);
-               ta.removeEventListener('input', update, false);
-               ta.removeEventListener('keyup', update, false);
-               ta.removeEventListener('autosize:destroy', destroy, false);
-               ta.removeEventListener('autosize:update', update, false);
-
-               Object.keys(style).forEach(key => {
-                       ta.style[key] = style[key];
-               });
-
-               map.delete(ta);
-       }).bind(ta, {
-               height: ta.style.height,
-               resize: ta.style.resize,
-               overflowY: ta.style.overflowY,
-               overflowX: ta.style.overflowX,
-               wordWrap: ta.style.wordWrap,
-       });
-
-       ta.addEventListener('autosize:destroy', destroy, false);
-
-       // IE9 does not fire onpropertychange or oninput for deletions,
-       // so binding to onkeyup to catch most of those events.
-       // There is no way that I know of to detect something like 'cut' in IE9.
-       if ('onpropertychange' in ta && 'oninput' in ta) {
-               ta.addEventListener('keyup', update, false);
-       }
-
-       window.addEventListener('resize', pageResize, false);
-       ta.addEventListener('input', update, false);
-       ta.addEventListener('autosize:update', update, false);
-       ta.style.overflowX = 'hidden';
-       ta.style.wordWrap = 'break-word';
-
-       map.set(ta, {
-               destroy,
-               update,
-       });
-
-       init();
-}
-
-function destroy(ta) {
-       const methods = map.get(ta);
-       if (methods) {
-               methods.destroy();
-       }
-}
-
-function update(ta) {
-       const methods = map.get(ta);
-       if (methods) {
-               methods.update();
-       }
-}
-
-let autosize = null;
-
-// Do nothing in Node.js environment and IE8 (or lower)
-if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {
-       autosize = el => el;
-       autosize.destroy = el => el;
-       autosize.update = el => el;
-} else {
-       autosize = (el, options) => {
-               if (el) {
-                       Array.prototype.forEach.call(el.length ? el : [el], x => assign(x, options));
-               }
-               return el;
-       };
-       autosize.destroy = el => {
-               if (el) {
-                       Array.prototype.forEach.call(el.length ? el : [el], destroy);
-               }
-               return el;
-       };
-       autosize.update = el => {
-               if (el) {
-                       Array.prototype.forEach.call(el.length ? el : [el], update);
-               }
-               return el;
-       };
-}
-
-export default autosize;
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e||self).autosize=t()}(this,function(){var e,t,n="function"==typeof Map?new Map:(e=[],t=[],{has:function(t){return e.indexOf(t)>-1},get:function(n){return t[e.indexOf(n)]},set:function(n,o){-1===e.indexOf(n)&&(e.push(n),t.push(o))},delete:function(n){var o=e.indexOf(n);o>-1&&(e.splice(o,1),t.splice(o,1))}}),o=function(e){return new Event(e,{bubbles:!0})};try{new Event("test")}catch(e){o=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!1),t}}function r(e){var t=n.get(e);t&&t.destroy()}function i(e){var t=n.get(e);t&&t.update()}var l=null;return"undefined"==typeof window||"function"!=typeof window.getComputedStyle?((l=function(e){return e}).destroy=function(e){return e},l.update=function(e){return e}):((l=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(e){return function(e){if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!n.has(e)){var t,r=null,i=null,l=null,d=function(){e.clientWidth!==i&&c()},u=function(t){window.removeEventListener("resize",d,!1),e.removeEventListener("input",c,!1),e.removeEventListener("keyup",c,!1),e.removeEventListener("autosize:destroy",u,!1),e.removeEventListener("autosize:update",c,!1),Object.keys(t).forEach(function(n){e.style[n]=t[n]}),n.delete(e)}.bind(e,{height:e.style.height,resize:e.style.resize,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener("autosize:destroy",u,!1),"onpropertychange"in e&&"oninput"in e&&e.addEventListener("keyup",c,!1),window.addEventListener("resize",d,!1),e.addEventListener("input",c,!1),e.addEventListener("autosize:update",c,!1),e.style.overflowX="hidden",e.style.wordWrap="break-word",n.set(e,{destroy:u,update:c}),"vertical"===(t=window.getComputedStyle(e,null)).resize?e.style.resize="none":"both"===t.resize&&(e.style.resize="horizontal"),r="content-box"===t.boxSizing?-(parseFloat(t.paddingTop)+parseFloat(t.paddingBottom)):parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth),isNaN(r)&&(r=0),c()}function a(t){var n=e.style.width;e.style.width="0px",e.style.width=n,e.style.overflowY=t}function s(){if(0!==e.scrollHeight){var t=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push({node:e.parentNode,scrollTop:e.parentNode.scrollTop}),e=e.parentNode;return t}(e),n=document.documentElement&&document.documentElement.scrollTop;e.style.height="",e.style.height=e.scrollHeight+r+"px",i=e.clientWidth,t.forEach(function(e){e.node.scrollTop=e.scrollTop}),n&&(document.documentElement.scrollTop=n)}}function c(){s();var t=Math.round(parseFloat(e.style.height)),n=window.getComputedStyle(e,null),r="content-box"===n.boxSizing?Math.round(parseFloat(n.height)):e.offsetHeight;if(r<t?"hidden"===n.overflowY&&(a("scroll"),s(),r="content-box"===n.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight):"hidden"!==n.overflowY&&(a("hidden"),s(),r="content-box"===n.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight),l!==r){l=r;var i=o("autosize:resized");try{e.dispatchEvent(i)}catch(e){}}}}(e)}),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],r),e},l.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],i),e}),l});