Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 1116207 of HTMLTextAreaElement

  • Revision slug: Web/API/HTMLTextAreaElement
  • Revision title: HTMLTextAreaElement
  • Revision id: 1116207
  • Created:
  • Creator: shtarbanov
  • Is current revision? No
  • Comment

Revision Content

{{APIRef("HTML DOM")}}

Inheritance Hierarchy: 
{{domxref("Node")}}  <==  {{domxref("Element")}}  <==  {{domxref("HTMLElement")}}  <==  {{domxref("HTMLTextAreaElement")}},

The HTMLTextAreaElement interface provides special properties and methods for manipulating the layout and presentation of {{HTMLElement("textarea")}} elements.

Properties

Name Description
form {{readonlyInline}} object: Returns a reference to the parent form element. If this element is not contained in a form element, it can be the {{htmlattrxref("id", "form")}} attribute of any {{HTMLElement("form")}} element in the same document or the value null.
type {{readonlyInline}} string: Returns the string textarea.
value string: Returns / Sets the raw value contained in the control.
defaultValue string: Returns / Sets the control's default value, which behaves like the {{domxref("Node.textContent")}} property.
placeholder string: Returns / Sets the element's {{htmlattrxref("placeholder", "textarea")}} attribute, containing a hint to the user about what to enter in the control.
rows unsigned long: Returns / Sets the element's {{htmlattrxref("rows", "textarea")}} attribute, indicating the number of visible text lines for the control.
cols unsigned long: Returns / Sets the element's {{htmlattrxref("cols", "textarea")}} attribute, indicating the visible width of the text area.
autofocus boolean: Returns / Sets the element's {{htmlattrxref("autofocus", "textarea")}} attribute, indicating that the control should have input focus when the page loads
name string: Returns / Sets the element's {{htmlattrxref("name", "textarea")}} attribute, containing the name of the control.
disabled boolean: Returns / Sets the element's {{htmlattrxref("disabled", "textarea")}} attribute, indicating that the control is not available for interaction.
maxLength long: Returns / Sets the element's {{htmlattrxref("maxlength", "textarea")}} attribute, indicating the maximum number of characters the user can enter. This constraint is evaluated only when the value changes.
accessKey string: Returns / Sets the element's {{htmlattrxref("accesskey", "textarea")}} attribute.
readOnly boolean: Returns / Sets the element's {{htmlattrxref("readonly", "textarea")}} attribute, indicating that the user cannot modify the value of the control.
required boolean: Returns / Sets the element's {{htmlattrxref("required", "textarea")}} attribute, indicating that the user must specify a value before submitting the form.
tabIndex long: Returns / Sets the position of the element in the tabbing navigation order for the current document.
textLength {{readonlyInline}} long: Returns the codepoint length of the control's value. Same as the control's value.length (when using JavaScript).
selectionStart unsigned long: Returns / Sets the index of the beginning of selected text. If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if setSelectionRange() had been called with this as the first argument, and selectionEnd as the second argument.
selectionEnd unsigned long: Returns / Sets the index of the end of selected text. If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if setSelectionRange() had been called with this as the second argument, and selectionStart as the first argument.
selectionDirection string: Returns / Sets the direction in which selection occurred. This is "forward" if selection was performed in the start-to-end direction of the current locale, or "backward" for the opposite direction. This can also be "none" if the direction is unknown."
validity {{readonlyInline}} {{domxref("ValidityState")}} object: Returns the validity states that this element is in.
   
autocapitalize {{experimental_inline}} string: Returns / Sets the element's capitalization behavior for user input. Valid values are: none, off, characters, words, sentences.
willValidate

boolean: Returns / Sets whether the element is a candidate for constraint validation. false if any conditions bar it from constraint validation.

validationMessage {{readonlyInline}} string: Returns a localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (willValidate is false), or it satisfies its constraints.
autocomplete {{experimental_inline}}  
dirName  
inputMode {{experimental_inline}}  
wrap{{gecko_minversion_inline("2.0")}} string: Returns / Sets the {{htmlattrxref("wrap", "textarea")}} HTML attribute, indicating how the control wraps text.

The two properties tabIndex and accessKey are inherited from {{domxref("HTMLElement")}} from HTML5 on, but were defined on HTMLTextAreaElement in DOM Level 2 HTML and earlier specifications.

Methods

Name & Arguments Description
focus() Gives focus to this control.
blur() Removes focus from this control.
select() Selects the contents of the control.
checkValidity() Returns false if the button is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an invalid event at the control. It returns true if the control is not a candidate for constraint validation, or if it satisfies its constraints.
setCustomValidity(string) Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.
setRangeText() {{experimental_inline}}  
{{domxref("HTMLInputElement/setSelectionRange", "setSelectionRange")}}(selectionStart, selectionEnd, [optional] selectionDirection) Selects a range of text, and sets selectionStart and selectionEnd. If either argument is greater than the length of the value, it is treated as pointing to the end of the value. If end is less than start, then both are treated as the value of end.

The two methods blur() and focus() are inherited from {{domxref("HTMLElement")}} from HTML5 on, but were defined on HTMLTextAreaElement in DOM Level 2 HTML and earlier specifications.

Examples

Autogrowing textarea example

Make a textarea autogrow while typing:

JavaScript function:

function autoGrow (oField) {
  if (oField.scrollHeight > oField.clientHeight) {
    oField.style.height = oField.scrollHeight + "px";
  }
}

CSS:

textarea.noscrollbars {
  overflow: hidden;
  width: 300px;
  height: 100px;
}

HTML:

<form>
  <fieldset>  
    <legend>Your comments</legend>  
    <p><textarea class="noscrollbars" onkeyup="autoGrow(this);"></textarea></p>
    <p><input type="submit" value="Send" /></p>
  </fieldset>
</form>

{{EmbedLiveSample('Autogrowing_textarea_example', 600, 300)}}

Insert HTML tags example

Insert some HTML tags or smiles or any custom text in a textarea.
JavaScript function:

function insertMetachars(sStartTag, sEndTag) {
  var bDouble = arguments.length > 1, oMsgInput = document.myForm.myTxtArea, nSelStart = oMsgInput.selectionStart, nSelEnd = oMsgInput.selectionEnd, sOldText = oMsgInput.value;
  oMsgInput.value = sOldText.substring(0, nSelStart) + (bDouble ? sStartTag + sOldText.substring(nSelStart, nSelEnd) + sEndTag : sStartTag) + sOldText.substring(nSelEnd);
  oMsgInput.setSelectionRange(bDouble || nSelStart === nSelEnd ? nSelStart + sStartTag.length : nSelStart, (bDouble ? nSelEnd : nSelStart) + sStartTag.length);
  oMsgInput.focus();
}

CSS to decorate the internal span to behave like a link:

.intLink {
  cursor: pointer;
  text-decoration: underline;
  color: #0000ff;
}

HTML:

<form>
<p>[&nbsp;<span class="intLink" onclick="insertMetachars('&lt;strong&gt;','&lt;\/strong&gt;');"><strong>Bold</strong></span> | <span class="intLink" onclick="insertMetachars('&lt;em&gt;','&lt;\/em&gt;');"><em>Italic</em></span> | <span class="intLink" onclick="var newURL=prompt('Enter the full URL for the link');if(newURL){insertMetachars('&lt;a href=\u0022'+newURL+'\u0022&gt;','&lt;\/a&gt;');}else{document.myForm.myTxtArea.focus();}">URL</span> | <span class="intLink" onclick="insertMetachars('\n&lt;code&gt;\n','\n&lt;\/code&gt;\n');">code</span> | <span class="intLink" onclick="insertMetachars(' :-)');">smile</span> | etc. etc.&nbsp;]</p>
<p><textarea rows="10" cols="50">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut facilisis, arcu vitae adipiscing placerat, nisl lectus accumsan nisi, vitae iaculis sem neque vel lectus. Praesent tristique commodo lorem quis fringilla. Sed ac tellus eros. Sed consectetur eleifend felis vitae luctus. Praesent sagittis, est eget bibendum tincidunt, ligula diam tincidunt augue, a fermentum odio velit eget mi. Phasellus mattis, elit id fringilla semper, orci magna cursus ligula, non venenatis lacus augue sit amet dui. Pellentesque lacinia odio id nisi pulvinar commodo tempus at odio. Ut consectetur eros porttitor nunc mollis ultrices. Aenean porttitor, purus sollicitudin viverra auctor, neque erat blandit sapien, sit amet tincidunt massa mi ac nibh. Proin nibh sem, bibendum ut placerat nec, cursus et lacus. Phasellus vel augue turpis. Nunc eu mauris eu leo blandit mollis interdum eget lorem. </textarea></p>
</form>

{{EmbedLiveSample('Insert_HTML_tags_example', 600, 300)}}

Maximum length and number of lines example

Create a textarea with a maximum number of characters per line and a maximum number of lines:

First, create a function that takes the text field and a key event as input and determines if any of the limits have been reached. If the limit has not been reached, it will return the key.

function checkRows(oField, oKeyEvent) {
  var nKey = (oKeyEvent || /* old IE */ window.event || /* check is not supported! */ { keyCode: 38 }).keyCode,

    // put here the maximum number of characters per line:
    nCols = 30,
    // put here the maximum number of lines:
    nRows = 5,

    nSelS = oField.selectionStart, nSelE = oField.selectionEnd,
    sVal = oField.value, nLen = sVal.length,

    nBackward = nSelS >= nCols ? nSelS - nCols : 0,
    nDeltaForw = sVal.substring(nBackward, nSelS).search(new RegExp("\\n(?!.{0," + String(nCols - 2) + "}\\n)")) + 1,
    nRowStart = nBackward + nDeltaForw,
    aReturns = (sVal.substring(0, nSelS) + sVal.substring(nSelE, sVal.length)).match(/\n/g),
    nRowEnd = nSelE + nRowStart + nCols - nSelS,
    sRow = sVal.substring(nRowStart, nSelS) + sVal.substring(nSelE, nRowEnd > nLen ? nLen : nRowEnd),
    bKeepCols = nKey === 13 || nLen + 1 < nCols || /\n/.test(sRow) || ((nRowStart === 0 || nDeltaForw > 0 || nKey > 0) && (sRow.length < nCols || (nKey > 0 && (nLen === nRowEnd || sVal.charAt(nRowEnd) === "\n"))));

  return (nKey !== 13 || (aReturns ? aReturns.length + 1 : 1) < nRows) && ((nKey > 32 && nKey < 41) || bKeepCols);
}

In the HTML we just need to hook our function to the `onkeypress` event and specify that our textarea does not accept pasting:

<form>
  <p>Textarea with fixed number of characters per line:<br />
    <textarea cols="50" rows="10" onkeypress="return checkRows(this, event);"
              onpaste="return false;"></textarea>
  </p>
</form>

{{EmbedLiveSample('Maximum_length_and_number_of_lines_example', 600, 300)}}

Specifications

Specification Status Comment
{{SpecName('HTML WHATWG', "the-button-element.html#the-textarea-element", "HTMLTextAreaElement")}} {{Spec2('HTML WHATWG')}} The following attributes have been added: autocomplete, and inputmode.
The following method has been added: setSelection().
{{SpecName('HTML5 W3C', "forms.html#the-textarea-element", "HTMLTextAreaElement")}} {{Spec2('HTML5 W3C')}} The attributes tabindex and accesskey, as well as the methods blur() and focus() are now defined on {{domxref("HTMLElement")}}.
The following attributes have been added: autofocus, placeholder, dirName, wrap, maxLength, required, textLength, labels, selectionStart, selectionEnd, selectionDirection, validity, validationMessage, and willValidate.
The following methods have been added: checkValidity(), setCustomValidity(), and setSelectionRange().
{{SpecName('DOM2 HTML', 'html.html#ID-ID-24874179', 'HTMLTextAreaElement')}} {{Spec2('DOM2 HTML')}} The property defaultValue doesn't contain the initial value of the value attribute, but the initial value of the content of the {{HTMLElement("textarea")}}.
{{SpecName('DOM1', 'level-one-html.html#ID-24874179', 'HTMLTextAreaElement')}} {{Spec2('DOM1')}} Initial definition

Browser compatibility

{{CompatibilityTable}}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support {{CompatVersionUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
autocapitalize {{CompatChrome(43.0)}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
textLength {{CompatChrome(47.0)}} {{CompatGeckoDesktop(28.0)}} {{CompatNo}} {{CompatOpera(33.0)}} {{CompatSafari(9.0)}}
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
Basic support {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
autocapitalize {{CompatNo}} {{CompatChrome(43.0)}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
textLength {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}

Revision Source

<div>{{APIRef("HTML DOM")}}</div>

<div>
<div class="note">
<p><strong>Inheritance Hierarchy:</strong><em>&nbsp;<br />
 {{domxref("Node")}}&nbsp; &lt;==&nbsp; {{domxref("Element")}}&nbsp; &lt;==&nbsp; {{domxref("HTMLElement")}}&nbsp; &lt;==&nbsp; {{domxref("HTMLTextAreaElement")}},</em></p>
</div>
</div>

<p>The <strong><code>HTMLTextAreaElement</code></strong> interface provides special properties and methods for manipulating the layout and presentation of {{HTMLElement("textarea")}} elements.</p>

<h2 id="Properties">Properties</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th>Name</th>
   <th>Description</th>
  </tr>
  <tr>
   <td><code>form </code>{{readonlyInline}}</td>
   <td><code>object:</code> Returns a reference to the parent form element. If this element is not contained in a form element, it can be the {{htmlattrxref("id", "form")}} attribute of any {{HTMLElement("form")}} element in the same document or the value <code>null</code>.</td>
  </tr>
  <tr>
   <td><code>type</code> {{readonlyInline}}</td>
   <td><code><em>string</em>:</code> Returns the string <code>textarea</code>.</td>
  </tr>
  <tr>
   <td><code>value</code></td>
   <td><code><em>string</em>:</code> Returns / Sets the raw value contained in the control.</td>
  </tr>
  <tr>
   <td><code>defaultValue</code></td>
   <td><code><em>string</em>:</code> Returns / Sets the control's default value, which behaves like the {{domxref("Node.textContent")}} property.</td>
  </tr>
  <tr>
   <td><code>placeholder</code></td>
   <td><code><em>string</em>:</code> Returns / Sets the element's {{htmlattrxref("placeholder", "textarea")}} attribute, containing a hint to the user about what to enter in the control.</td>
  </tr>
  <tr>
   <td><code>rows</code></td>
   <td><code><em>unsigned long</em>:</code> Returns / Sets the element's {{htmlattrxref("rows", "textarea")}} attribute, indicating the number of visible text lines for the control.</td>
  </tr>
  <tr>
   <td><code>cols</code></td>
   <td><code><em>unsigned long</em>:</code> Returns / Sets the element's {{htmlattrxref("cols", "textarea")}} attribute, indicating the visible width of the text area.</td>
  </tr>
  <tr>
   <td><code>autofocus</code></td>
   <td><code><em>boolean</em>:</code> Returns / Sets the element's {{htmlattrxref("autofocus", "textarea")}} attribute, indicating that the control should have input focus when the page loads</td>
  </tr>
  <tr>
   <td><code>name</code></td>
   <td><code><em>string</em>:</code> Returns / Sets the element's {{htmlattrxref("name", "textarea")}} attribute, containing the name of the control.</td>
  </tr>
  <tr>
   <td><code>disabled</code></td>
   <td><code><em>boolean</em>:</code> Returns / Sets the element's {{htmlattrxref("disabled", "textarea")}} attribute, indicating that the control is not available for interaction.</td>
  </tr>
  <tr>
   <td><code>maxLength</code></td>
   <td><code><em>long</em>:</code> Returns / Sets the element's {{htmlattrxref("maxlength", "textarea")}} attribute, indicating the maximum number of characters the user can enter. This constraint is evaluated only when the value changes.</td>
  </tr>
  <tr>
   <td><code>accessKey</code></td>
   <td><code><em>string</em>:</code> Returns / Sets the element's {{htmlattrxref("accesskey", "textarea")}} attribute.</td>
  </tr>
  <tr>
   <td><code>readOnly</code></td>
   <td><code><em>boolean</em>:</code> Returns / Sets the element's {{htmlattrxref("readonly", "textarea")}} attribute, indicating that the user cannot modify the value of the control.</td>
  </tr>
  <tr>
   <td><code>required</code></td>
   <td><code><em>boolean</em>:</code> Returns / Sets the element's {{htmlattrxref("required", "textarea")}} attribute, indicating that the user must specify a value before submitting the form.</td>
  </tr>
  <tr>
   <td><code>tabIndex</code></td>
   <td><code><em>long</em>:</code> Returns / Sets the position of the element in the tabbing navigation order for the current document.</td>
  </tr>
  <tr>
   <td><code>textLength</code> {{readonlyInline}}</td>
   <td><code><em>long</em>:</code> Returns the codepoint length of the control's <code>value</code>. Same as the control's <code>value.length</code> (when using JavaScript).</td>
  </tr>
  <tr>
   <td><code>selectionStart</code></td>
   <td><code><em>unsigned long</em>:</code> Returns / Sets the index of the beginning of selected text. If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <code>setSelectionRange()</code> had been called with this as the first argument, and <code>selectionEnd</code> as the second argument.</td>
  </tr>
  <tr>
   <td><code>selectionEnd</code></td>
   <td><code><em>unsigned long</em>:</code> Returns / Sets the index of the end of selected text. If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <code>setSelectionRange()</code> had been called with this as the second argument, and <code>selectionStart</code> as the first argument.</td>
  </tr>
  <tr>
   <td><code>selectionDirection</code></td>
   <td><code><em>string</em>:</code> Returns / Sets the direction in which selection occurred. This is <code>"forward"</code> if selection was performed in the start-to-end direction of the current locale, or <code>"backward"</code> for the opposite direction. This can also be <code>"none"</code>&nbsp;if the direction is unknown."</td>
  </tr>
  <tr>
   <td><code>validity</code> {{readonlyInline}}</td>
   <td><code><em>{{domxref("ValidityState")}} object</em>:</code> Returns the validity states that this element is in.</td>
  </tr>
  <tr>
   <td>&nbsp;</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td><code>autocapitalize</code> {{experimental_inline}}</td>
   <td><code><em>string</em>:</code> Returns / Sets the element's capitalization behavior for user input. Valid values are: <code>none</code>, <code>off</code>, <code>characters</code>, <code>words</code>, <code>sentences</code>.</td>
  </tr>
  <tr>
   <td><code>willValidate</code></td>
   <td>
    <p><code><em>boolean</em>:</code> Returns / Sets whether the element is a candidate for constraint validation. <code>false</code> if any conditions bar it from constraint validation.</p>
   </td>
  </tr>
  <tr>
   <td><code>validationMessage</code> {{readonlyInline}}</td>
   <td><code><em>string</em>:</code> Returns a localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<code>willValidate</code> is <code>false</code>), or it satisfies its constraints.</td>
  </tr>
  <tr>
   <td><code>autocomplete</code> {{experimental_inline}}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td><code>dirName</code></td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td><code>inputMode</code> {{experimental_inline}}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td><code>wrap</code>{{gecko_minversion_inline("2.0")}}</td>
   <td><code><em>string</em>:</code> Returns / Sets the {{htmlattrxref("wrap", "textarea")}} HTML attribute, indicating how the control wraps text.</td>
  </tr>
 </tbody>
</table>

<p>The two properties <code>tabIndex</code> and <code>accessKey</code> are inherited from {{domxref("HTMLElement")}} from HTML5 on, but were defined on <code>HTMLTextAreaElement</code> in DOM Level 2 HTML and earlier specifications.</p>

<h2 id="Methods">Methods</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th>Name &amp; Arguments</th>
   <th>Description</th>
  </tr>
  <tr>
   <td><code>focus()</code></td>
   <td>Gives focus to this control.</td>
  </tr>
  <tr>
   <td><code>blur()</code></td>
   <td>Removes focus from this control.</td>
  </tr>
  <tr>
   <td><code>select() </code></td>
   <td>Selects the contents of the control.</td>
  </tr>
  <tr>
   <td><code>checkValidity()</code></td>
   <td>Returns <code>false</code> if the button is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the control. It returns <code>true</code> if the control is not a candidate for constraint validation, or if it satisfies its constraints.</td>
  </tr>
  <tr>
   <td><code>setCustomValidity(string)</code></td>
   <td>Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.</td>
  </tr>
  <tr>
   <td><code>setRangeText()</code> {{experimental_inline}}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td><code>{{domxref("HTMLInputElement/setSelectionRange", "setSelectionRange")}}(selectionStart, selectionEnd, [optional] selectionDirection)</code></td>
   <td>Selects a range of text, and sets <code>selectionStart</code> and <code>selectionEnd</code>. If either argument is greater than the length of the value, it is treated as pointing to the end of the value. If <code>end</code> is less than <code>start</code>, then both are treated as the value of <code>end</code>.</td>
  </tr>
 </tbody>
</table>

<p>The two methods <code>blur()</code> and <code>focus()</code> are inherited from {{domxref("HTMLElement")}} from HTML5 on, but were defined on <code>HTMLTextAreaElement</code> in DOM Level 2 HTML and earlier specifications.</p>

<h2 id="Examples">Examples</h2>

<h3 id="Autogrowing_textarea_example">Autogrowing textarea example</h3>

<p>Make a textarea autogrow while typing:</p>

<p>JavaScript function:</p>

<pre class="brush: js">
function autoGrow (oField) {
&nbsp; if (oField.scrollHeight &gt; oField.clientHeight) {
&nbsp;&nbsp;&nbsp; oField.style.height = oField.scrollHeight + "px";
&nbsp; }
}</pre>

<p>CSS:</p>

<pre class="brush: css">
textarea.noscrollbars {
&nbsp; overflow: hidden;
&nbsp; width: 300px;
&nbsp; height: 100px;
}</pre>

<p>HTML:</p>

<pre class="brush: html">
&lt;form&gt;
&nbsp; &lt;fieldset&gt; &nbsp;
&nbsp;&nbsp;&nbsp; &lt;legend&gt;Your comments&lt;/legend&gt; &nbsp;
&nbsp;&nbsp;&nbsp; &lt;p&gt;&lt;textarea class="noscrollbars" onkeyup="autoGrow(this);"&gt;&lt;/textarea&gt;&lt;/p&gt;
&nbsp;&nbsp;&nbsp; &lt;p&gt;&lt;input type="submit" value="Send" /&gt;&lt;/p&gt;
&nbsp; &lt;/fieldset&gt;
&lt;/form&gt;
</pre>

<p>{{EmbedLiveSample('Autogrowing_textarea_example', 600, 300)}}</p>

<h3 id="Insert_HTML_tags_example">Insert HTML tags example</h3>

<p>Insert some HTML tags or <em>smiles</em> or any custom text in a textarea.<br />
 JavaScript function:</p>

<pre class="brush: js">
function insertMetachars(sStartTag, sEndTag) {
  var bDouble = arguments.length &gt; 1, oMsgInput = document.myForm.myTxtArea, nSelStart = oMsgInput.selectionStart, nSelEnd = oMsgInput.selectionEnd, sOldText = oMsgInput.value;
  oMsgInput.value = sOldText.substring(0, nSelStart) + (bDouble ? sStartTag + sOldText.substring(nSelStart, nSelEnd) + sEndTag : sStartTag) + sOldText.substring(nSelEnd);
  oMsgInput.setSelectionRange(bDouble || nSelStart === nSelEnd ? nSelStart + sStartTag.length : nSelStart, (bDouble ? nSelEnd : nSelStart) + sStartTag.length);
  oMsgInput.focus();
}</pre>

<p>CSS to decorate the internal span to behave like a link:</p>

<pre class="brush: css">
.intLink {
  cursor: pointer;
  text-decoration: underline;
  color: #0000ff;
}</pre>

<p>HTML:</p>

<pre class="brush: html">
&lt;form&gt;
&lt;p&gt;[&amp;nbsp;&lt;span class="intLink" onclick="insertMetachars('&amp;lt;strong&amp;gt;','&amp;lt;\/strong&amp;gt;');"&gt;&lt;strong&gt;Bold&lt;/strong&gt;&lt;/span&gt; | &lt;span class="intLink" onclick="insertMetachars('&amp;lt;em&amp;gt;','&amp;lt;\/em&amp;gt;');"&gt;&lt;em&gt;Italic&lt;/em&gt;&lt;/span&gt; | &lt;span class="intLink" onclick="var newURL=prompt('Enter the full URL for the link');if(newURL){insertMetachars('&amp;lt;a href=\u0022'+newURL+'\u0022&amp;gt;','&amp;lt;\/a&amp;gt;');}else{document.myForm.myTxtArea.focus();}"&gt;URL&lt;/span&gt; | &lt;span class="intLink" onclick="insertMetachars('\n&amp;lt;code&amp;gt;\n','\n&amp;lt;\/code&amp;gt;\n');"&gt;code&lt;/span&gt; | &lt;span class="intLink" onclick="insertMetachars(' :-)');"&gt;smile&lt;/span&gt; | etc. etc.&amp;nbsp;]&lt;/p&gt;
&lt;p&gt;&lt;textarea rows="10" cols="50"&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut facilisis, arcu vitae adipiscing placerat, nisl lectus accumsan nisi, vitae iaculis sem neque vel lectus. Praesent tristique commodo lorem quis fringilla. Sed ac tellus eros. Sed consectetur eleifend felis vitae luctus. Praesent sagittis, est eget bibendum tincidunt, ligula diam tincidunt augue, a fermentum odio velit eget mi. Phasellus mattis, elit id fringilla semper, orci magna cursus ligula, non venenatis lacus augue sit amet dui. Pellentesque lacinia odio id nisi pulvinar commodo tempus at odio. Ut consectetur eros porttitor nunc mollis ultrices. Aenean porttitor, purus sollicitudin viverra auctor, neque erat blandit sapien, sit amet tincidunt massa mi ac nibh. Proin nibh sem, bibendum ut placerat nec, cursus et lacus. Phasellus vel augue turpis. Nunc eu mauris eu leo blandit mollis interdum eget lorem. &lt;/textarea&gt;&lt;/p&gt;
&lt;/form&gt;
</pre>

<p>{{EmbedLiveSample('Insert_HTML_tags_example', 600, 300)}}</p>

<h3 id="Maximum_length_and_number_of_lines_example">Maximum length and number of lines example</h3>

<p>Create a textarea with a maximum number of characters per line and a maximum number of lines:</p>

<p>First, create a function that takes the text field and a key event as input and determines if any of the limits have been reached. If the limit has not been reached, it will return the key.</p>

<pre class="brush: js">
function checkRows(oField, oKeyEvent) {
  var nKey = (oKeyEvent || /* old IE */ window.event || /* check is not supported! */ { keyCode: 38 }).keyCode,

    // put here the maximum number of characters per line:
    nCols = 30,
    // put here the maximum number of lines:
    nRows = 5,

    nSelS = oField.selectionStart, nSelE = oField.selectionEnd,
    sVal = oField.value, nLen = sVal.length,

    nBackward = nSelS &gt;= nCols ? nSelS - nCols : 0,
    nDeltaForw = sVal.substring(nBackward, nSelS).search(new RegExp("\\n(?!.{0," + String(nCols - 2) + "}\\n)")) + 1,
    nRowStart = nBackward + nDeltaForw,
    aReturns = (sVal.substring(0, nSelS) + sVal.substring(nSelE, sVal.length)).match(/\n/g),
    nRowEnd = nSelE + nRowStart + nCols - nSelS,
    sRow = sVal.substring(nRowStart, nSelS) + sVal.substring(nSelE, nRowEnd &gt; nLen ? nLen : nRowEnd),
    bKeepCols = nKey === 13 || nLen + 1 &lt; nCols || /\n/.test(sRow) || ((nRowStart === 0 || nDeltaForw &gt; 0 || nKey &gt; 0) &amp;&amp; (sRow.length &lt; nCols || (nKey &gt; 0 &amp;&amp; (nLen === nRowEnd || sVal.charAt(nRowEnd) === "\n"))));

  return (nKey !== 13 || (aReturns ? aReturns.length + 1 : 1) &lt; nRows) &amp;&amp; ((nKey &gt; 32 &amp;&amp; nKey &lt; 41) || bKeepCols);
}</pre>

<p>In the HTML we just need to hook our function to the `onkeypress` event and specify that our textarea does not accept pasting:</p>

<pre class="brush: html">
&lt;form&gt;
  &lt;p&gt;Textarea with fixed number of characters per line:&lt;br /&gt;
    &lt;textarea cols="50" rows="10" onkeypress="return checkRows(this, event);"
              onpaste="return false;"&gt;&lt;/textarea&gt;
  &lt;/p&gt;
&lt;/form&gt;
</pre>

<p>{{EmbedLiveSample('Maximum_length_and_number_of_lines_example', 600, 300)}}</p>

<h2 id="Specifications">Specifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('HTML WHATWG', "the-button-element.html#the-textarea-element", "HTMLTextAreaElement")}}</td>
   <td>{{Spec2('HTML WHATWG')}}</td>
   <td>The following attributes have been added: <code>autocomplete</code>, and <code>inputmode</code>.<br />
    The following method has been added: <code>setSelection().</code></td>
  </tr>
  <tr>
   <td>{{SpecName('HTML5 W3C', "forms.html#the-textarea-element", "HTMLTextAreaElement")}}</td>
   <td>{{Spec2('HTML5 W3C')}}</td>
   <td>The attributes <code>tabindex</code> and <code>accesskey</code>, as well as the methods <code>blur()</code> and <code>focus()</code> are now defined on {{domxref("HTMLElement")}}.<br />
    The following attributes have been added: <code>autofocus</code>, <code>placeholder</code>, <code>dirName</code>, <code>wrap</code>, <code>maxLength</code>, <code>required</code>, <code>textLength</code>, <code>labels</code>, <code>selectionStart</code>, <code>selectionEnd</code>, <code>selectionDirection</code>, <code>validity</code>, <code>validationMessage</code>, and <code>willValidate</code>.<br />
    The following methods have been added: <code>checkValidity()</code>, <code>setCustomValidity()</code>, and <code>setSelectionRange()</code>.</td>
  </tr>
  <tr>
   <td>{{SpecName('DOM2 HTML', 'html.html#ID-ID-24874179', 'HTMLTextAreaElement')}}</td>
   <td>{{Spec2('DOM2 HTML')}}</td>
   <td>The property <code>defaultValue</code> doesn't contain the initial value of the <code>value</code> attribute, but the initial value of the content of the {{HTMLElement("textarea")}}.</td>
  </tr>
  <tr>
   <td>{{SpecName('DOM1', 'level-one-html.html#ID-24874179', 'HTMLTextAreaElement')}}</td>
   <td>{{Spec2('DOM1')}}</td>
   <td>Initial definition</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility">Browser compatibility</h2>

<p>{{CompatibilityTable}}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari (WebKit)</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
  <tr>
   <td><code>autocapitalize</code></td>
   <td>{{CompatChrome(43.0)}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
  <tr>
   <td><code>textLength</code></td>
   <td>{{CompatChrome(47.0)}}</td>
   <td>{{CompatGeckoDesktop(28.0)}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatOpera(33.0)}}</td>
   <td>{{CompatSafari(9.0)}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Chrome for Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Phone</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
  <tr>
   <td><code>autocapitalize</code></td>
   <td>{{CompatNo}}</td>
   <td>{{CompatChrome(43.0)}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
  <tr>
   <td><code>textLength</code></td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>
Revert to this revision