- From: Ian Hickson <ian@hixie.ch>
- Date: Sat, 28 Apr 2012 04:01:49 +0000 (UTC)
On Mon, 10 May 2010, Biju wrote: > > Can we have a new DOM property textarea.selectionText which can be used > to set/get selection text of a TEXTAREA/INPUT type=text. Gettng the value is relatively easy: On Mon, 10 May 2010, Biju wrote: > > Current way in firefox is to > > 1. OrigStart = textarea.selectionStart But admittedly setting it is a pain: > 2. textarea.value = textarea.value.substr(0, OrigStart) > + new_text_to_replace > + textarea.value.substr(textarea.selectionEnd); > 3. Now u loose original selection, so > > 4. textarea.setSelectionRange(OrigStart, OrigStart+new_text_to_replace.length) > 5. remember .scrollTop and reapply if needed I agree that making this easier would be good. > On IE even though wierd you can do it simply by > document.selection.createRange().text = new_text_to_replace; > BTW, you need to make sure the selection is currently on the > textarea/input form control. > IE is also very fast when doing that, when firefox hangs few second > using the other way IE's version is non-standard and not adopted by other UAs. On Mon, 10 May 2010, Ojan Vafai wrote: > > In addition to selection and scroll issues, needing to replace the > entire textarea value doesn't scale and thus limits what sorts of things > you can do with textareas. A general way to set a sub-part of a > textarea's value seems useful to me. I don't think we should tie that to > setting the selected text though. > > textarea.setRangeText(start, end, text); > > It replaces the text between start and end, maintains current scroll > position and preserves the selection. On Tue, 11 May 2010, Biju wrote: > > Both have advantages > > Option 1 (textobj.selectionText) advantages > * No need for web developer to provide selection start/end > * Automatically select the newly inserted text, > (as most time that is what you want) > * No need for web developer to calculate selection start/end for > setting it after text insert > * preserve scroll > * Has both Getter and Setter > > Option 2 (textobj.setRangeText(start, end, text)); advantages > * Independent of selection, web developer can change text at any range > with out affecting selection > * Web developer has more options with it. > * preserve scroll > > So I want to merge both suggestion, with a new signature, > also trying to reduce coding for web developer "less code less bug" > > textobj.setRangeText(newtext, start, end, cursorpos) > > parameters: > newtext > - optional parameter > - new text that will replace existing > - if missing/null/undefined/NaN then default to "" > > start > - optional parameter > - starting position of the original textobj text that need to be replaced > - if missing/null/undefined/NaN then default to textobj.selectionStart > - negative value make start position from last character in the text content > > end > - optional parameter > - ending position of the original textobj text that need to be replaced > - if missing/null/undefined/NaN then default to textobj.selectionEnd > - negative value make end position from last character > > cursorpos > - optional parameter > - if missing/null/undefined/NaN then default to 0 > - what should happen to cursor/selection after text insert, its values are > - - 0 - select the newly inserted text > - - 1 - place cursor at beginning of inserted text > - - 2 - place cursor at the end of inserted text > - - 3 - keep selection unaffected > * issue, when value is 3 what should we do when setRangeText is replacing text > which has some parts selected and some other parts unselected > > > so if somebody want replace selection text it is just > textobj.setRangeText(newtext); > which is almost same as my original proposal, and > textobj.setRangeText(); > will blank a selection That seems a bit overly complicated, but something in that vein seems reasonable. I've added setRangeText(newText); // replace selection with newText setRangeText(newText, start, end); // replace given range with newText setRangeText(newText, start, end, action); // see below ...where action is one of: 'select': selects the new text 'start': selects empty range at start of new text 'end': selects empty range at end of new text 'preserve': (default) set selection as follows: - if selection start was before range, leave as is - if selection start was after the old range, put it as far from the end of the new range as it was from the end of the old range - if selection start was in the old range, move it to the start of the new range - if selection end was before range, leave as is - if selection end was after the old range, put it as far from the end of the new range as it was from the end of the old range - if selection emd was in the old range, move it to the end of the new range > We could also add a getter method, also with optional parameters > textobj.getRangeText(start, end) > so, > textobj.getRangeText() gives current selection > textobj.getRangeText(0) gives from start of text to current selection end > textobj.getRangeText(null, -1) gives from current selection start to end of text Getting the text from a range is already rather simple (as demonstrated at the top of this e-mail), so I don't think that's necessary. -- Ian Hickson U+1047E )\._.,--....,'``. fL http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,. Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Friday, 27 April 2012 21:01:49 UTC