問題的來由
今天有一位朋友問到關于 textarea
標簽的問題,開始時我不以為意。因為在我看來,因為這是一個很簡單的標簽,它表示一個可增刪字符的文本域,可以利用 textarea
的 placeholder
和 value
屬性來做一些適當的操作;用 cols rows 控制 列數,行數(當然,更好是用CSS的width和height)......嗯,就這些了。不過,你可以先看看下面的代碼:
<textarea cols="20" rows="5"><i>斜體</i></textarea>
這是什么?
textarea
里的 i
真是一個“斜體”嗎?結果你應該能猜到,它不可能是一級標題,其真正表現如下:
<textarea cols="20" rows="5"><i>斜體</i></textarea>
在 textarea
中的所有字符,都會被當作是“字符串值”,也就是說 “<i>”
只是 '<'+'i'+'>'
的一個字符串, textarea
內不可能存在其他標簽。到這里,你甚至可能就會有個疑問了,為什么 textarea
是一個雙標簽?在標簽內寫入字符串有什么用?
我們可以試驗以下代碼:
<textarea cols="20" rows="5"><i>斜體</i></textarea>
document.getElementById('mt').innerHTML;// "&lt;o\i&gt;標題&lt;/i&gt;"
document.getElementById('mt').value;// "<i>斜體</i>"
有趣的是,在讀取 innerHTML
的時候,尖括號字符都被變為轉義字符,而且我們嘗試去讀其 value
值時,竟然可以完整讀取里面的內容,這說明了 innerHTML
可以作為其 value
值?
是這樣的嗎?繼續看下去:
<textarea cols="20" rows="5"><i>斜體</i></textarea>
var mt = document.getElementById('mt');
mt.innerHTML; //"&lt;i&gt;標題&lt;/i&gt;"
mt.innerHTML = 'heiheihei';
mt.value;// "heiheihei" //恩,value值確實改變了
mt.value = 'yoyoyo'; //改變其 value
mt.innerHTML;//"heiheihei" //改變 value 值,并不會使得innerHTML改變
mt.innerHTML = 'zezeze'; //再次改變 innerHTML ,看看 value 會不會變
mt.value; //"yoyoyo" value值并不會改變
結論
如果你有耐心把上面的連鎖操作看完,相信你對我要解釋的東西已然明白。
簡單地說來,在 textarea
內的 innerHTML
是字符串;在我們沒有對textarea
的 value
屬性進行操作之前,如果你對 textarea
賦予了 innerHTML
(字符串值),那么 textarea
就擁有了一個起始狀態的默認期望 value
值,并且可以通過 value
屬性(或者 innerHTML
操作)來獲取。不過,當你對 value
屬性進行更改后(包括在文本域內的更改),innerHTML
作為一個初始期望值,就不會再起作用了。