Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resize event for textarea?

The current versions of Firefox and Chrome include a drag handler to resize a <textarea> box. I need to capture the resizing event, I thought it would be easy with jQuery's resize() event, but it doesn't work!

I have also tried the normal onResize event, but the result is the same. You can try it on JSFiddle.

Is there a way to capture it?

like image 282
metrobalderas Avatar asked Apr 06 '11 17:04

metrobalderas


People also ask

How to auto resize textarea?

It can be achieved by using JavaScript and jQuery. Method 1: Using JavaScript: To change the height, a new function is created which changes the style property of the textarea. The height of the textarea is first set to auto. This value makes the browser set the height of an element automatically.

How to resize textarea in js?

To add the auto resize, just call the function addAutoResize() once your textareas are exposed in DOM.

What is Resize event?

The resize event fires when the document view (window) has been resized. This event is not cancelable and does not bubble.

What is Onresize HTML?

The onresize event occurs when the browser window has been resized. Tip: To get the size of an element, use the clientWidth, clientHeight, innerWidth, innerHeight, outerWidth, outerHeight, offsetWidth and/or offsetHeight properties.


2 Answers

Chrome doesn't capture the resize event and that Chrome doesn't capture the mousedown, so you need to set the init state and then handle changes through mouseup:

jQuery(document).ready(function(){    var $textareas = jQuery('textarea');     // store init (default) state       $textareas.data('x', $textareas.outerWidth());    $textareas.data('y', $textareas.outerHeight());      $textareas.mouseup(function(){        var $this = jQuery(this);        if (  $this.outerWidth()  != $this.data('x')           || $this.outerHeight() != $this.data('y') )       {           // Resize Action Here           alert( $this.outerWidth()  + ' - ' + $this.data('x') + '\n'                 + $this.outerHeight() + ' - ' + $this.data('y')                );       }          // store new height/width       $this.data('x', $this.outerWidth());       $this.data('y', $this.outerHeight());     });  }); 

HTML

<textarea></textarea> <textarea></textarea> 

You can test on JSFiddle

Note:

  1. You could attach your own resizable as Hussein has done, but if you want the original one, you can use the above code
  2. As Bryan Downing mentions, this works when you mouseup while your mouse is on top of a textarea; however, there are instances where that might not happen like when a browser is not maximized and you continue to drag beyond the scope of the browser, or use resize:vertical to lock movement.

For something more advanced you'd need to add other listeners, possibly a queue and interval scanners; or to use mousemove, as I believe jQuery resizable does -- the question then becomes how much do you value performance vs polish?


Update: There's since been a change to Browsers' UI. Now double-clicking the corner may contract the textbox to its default size. So you also may need to capture changes before/after this event as well.

like image 69
vol7ron Avatar answered Sep 20 '22 05:09

vol7ron


A standard way to handle element's resizing is the Resize Observer api, available in all modern web browser versions.

function outputsize() {  width.value = textbox.offsetWidth  height.value = textbox.offsetHeight } outputsize()  new ResizeObserver(outputsize).observe(textbox)
Width: <output id="width">0</output><br> Height: <output id="height">0</output><br> <textarea id="textbox">Resize me.</textarea>

If you need to deal with old versions of Chrome and Firefox (others untested), Mutation Observer can be used to detect the change of the style attribute.

function outputsize() {  width.value = textbox.offsetWidth  height.value = textbox.offsetHeight } outputsize()  new MutationObserver(outputsize).observe(textbox, {  attributes: true, attributeFilter: [ "style" ] })
Width: <output id="width">0</output><br> Height: <output id="height">0</output><br> <textarea id="textbox">Resize me.</textarea>

Resize Observer

Documentation: https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API

Spec: https://wicg.github.io/ResizeObserver

Current Support: http://caniuse.com/#feat=resizeobserver

Polyfills: https://github.com/pelotoncycle/resize-observer https://github.com/que-etc/resize-observer-polyfill https://github.com/juggle/resize-observer

like image 34
Daniel Herr Avatar answered Sep 20 '22 05:09

Daniel Herr