一般來說文字輸入框是可以用input(單行)和textarea(多行)的,但是,如果想在文字中間插入之類的非文字節點,或者文字設定不同的樣式,這時候兩個就不行了。可以用可編輯的div來實現。
把乙個div設定成可編輯的,只需要把新增屬性:contenteditable="true"就可以了。比如:asdfasdf
這時候div就像文字框一樣可以輸入文字內容了,和文字框不同的是,div的結構會隨著輸入的內容變化的,按enter鍵換行其實在可編輯的div裡新加了div元素,文字內容放在span元素裡。
如果想插入或者設定某斷字串的字型大小等樣式,就需要知道焦點的位置或者是選擇文字的位置。
對於不同的瀏覽器,大致有兩個解決的方法:
一種是根據document.selection屬性,適合ie10以及ie10以下的ie瀏覽器。
一種是根據window.getselection()方法,適合webkit核心(chrome、uc等)、firefox瀏覽器以及ie11等。
1.ie10-
看下面的例子:
焦點位置:選中文字:1234567890abcdef
range物件裡記錄了選中的文字和起始焦點的位置,只不過裡面記錄的是位置(座標)資訊,而我們想要知道的是游標在第幾個字元後面閃爍,這樣才好插入等節點。這裡使用range的compareendpoints方法,新建乙個range,從前往後挨個字元的移動焦點,移動一次判斷下是否移動到了原來range的後面了。
2.chrome uc等
看下面的例子:
起始位置:選中文字:1234567890abcdef
selection物件看起來比ie10-用的range物件要好用一些,相對來說也更好理解。裡面記錄了開始位置、結束位置、開始元素、結束元素等資訊,選中的文字需要根據這些資訊自己計算。需要注意的是,例子中判斷了startel == endel,說明開始元素和結束元素可能是不同的元素的。這對應的情況就是,幾個span挨在一起,從乙個span的文字選到另乙個span的文字,中間可能有好幾個span,那這時候的開始位置和結束位置又是什麼呢?試一下應該知道,開始位置是開始焦點在開始dom元素中的序號,結束位置是結束時候的焦點在結束dom元素中的序號。這時候就需要使用相鄰兄弟元素的操作了。ie10中也涉及這個問題,不再贅述。 可編輯div游標位置
參考 mdn上提示這些api不穩定。應該是相容ie9 谷歌,火狐 1.var sel window.getselection 變數sel是當前頁面被選中區域 2.var objrange sel.getrangeat 0 獲得選中區域的range物件 startoffset和endoffset代表了...
可編輯DIV設定游標位置
平時我們使用文字框input,textarea時,我們有時候需要得到游標的位置或者說設定游標的位置.但是文字框有個不足,就是不能滿足我們插入或者其他的一些要求.所以有時候我們使用div來代替文字框.今天為了搞定設定di的游標位置.頭疼啊,終於可以了,記錄一下,網上資料不多.首先要讓div啟用編輯模式...
可編輯div在游標位置插入指定內容
在游標位置插入內容 insertcontent content let sel null if document.selection else 需注意 在谷歌瀏覽器下測試發現 document.execcommand inserhtml false 當使用這種方式插入html內容時,p標籤不見了,只...