[WA1] GUI Selections (was Re: [whatwg] Web Forms 2.0)
Matthew Raymond
mattraymond at earthlink.net
Wed Feb 23 20:10:40 PST 2005
Olav Junker Kjær wrote:
> Matthew Raymond wrote:
> > So you see, if we want to establish a GUI selection interface for
> > DOM/Javascript, we can use DOM Range as PART of the interface, but we
> > still have to define some way of getting the current selection and
> > setting the user selection.
>
> Okay. I get it. Mozilla seem to support something similar (also
> non-standard) to get from a selection to a DOM range:
> http://www.mozilla.org/docs/dom/domref/dom_window_ref24.html#1000044
> While I like your proposal, I think we should choose one of the
> currently implemented methods (IE's or Mozillas) unless they have
> serious shortcomings.
The Mozilla getSelection method doesn't actually return a DOM Range,
though, so I'm inclined to pass on it, even though we're introducing
window in WA1. It just strikes me as too complicated; it introduces a
completely new selection object, multiple ranges, et cetera...
Then again, if you have a really good argument for it, I'm willing
to hear it.
> > Yeah, but from the little bit I've read of the IE method, I hear it
> > sucks.
>
> Well, it doesn't provide a way to get the start or end points of a
> selection, which is what the original poster wanted.
> It works like this: the document has a "selection" property which
> represents the current selection. On the selection object you can call
> createRange() to create a TextRange object which is more or less similar
> to a DOM Range object (although more limited). Also, you can turn a
> TextRange into the current selected by calling the select() method on it.
> It works the same way for input values, textarea values, and ordinary
> content.
Matthew Thomas was worried that allowing webmasters to alter
selections with setSelection or removeSelection would create situations
where webmasters would intentionally prevent users from selecting stuff.
As a result, I think he'd oppose a model that supports setting the
selection outside a control, which makes the IE selection model not
terribly useful.
> > Near as I can determine, though, DOM Range can't change attributes,
> > so it would be useless for use with <input>, even if the |value|
> > attribute was always equal to the .value property.
>
> The DOM Range spec claims that it works on Attr-nodes also.
/me shrugs.
Okay. I just skimmed the spec, so maybe it does. Doesn't really
matter, though, because the .value property is still not the same as the
|value| attribute or the contents of a <textarea> element, and changing
that would break the specification of the reset button. (In theory, you
may actually want to change the initial value of a control in the DOM so
that when someone hits a reset button, the new initial value is put into
the control instead of the old one, so saving the initial value outside
the DOM may not be an option.)
Then again, there's a .defaultValue property. Form reset could be
defined in such a way as to use that property as the initial value
instead of the contents of the DOM. However, the DOM content is defined
as the initial value in the HTML 4.01 spec, so does changing the DOM in
some browsers change the corresponding value of .defaultValue???
What's certain is that linking the .value property with the markup
for the initial value would directly contradict portions of the DOM2 spec.
From http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-49531485:
"Changing this attribute changes the contents of the form control,
but does not change the value of the HTML value attribute of the element."
From http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70715579:
"Changing this attribute changes the contents of the form control,
but does not change the contents of the element."
So would this be considered breaking backwards compatibility, since
the opposite of the proposed behavior is defined in the spec?
> > Do we need a way of maintaining multiple user selections? I don't
> > think IE supports this.
>
> The API suggest that it does (there is a createRangeCollection()
> method), but I'm not sure this actually works.
Perhaps we should change getSelection to getSelections and have it
return a collection of ranges... Hmm...
> > Also, do we need execCommand if we're using DOM Range?
>
> The important thing is to have contentEditable and an interface to
> manipulate the current selection. Then execCommand can be built on top
> of that in script. (The execCommand interface in IE is cool though,
> because it supports undo. Except that the undo history is cleared when
> any DOM manipulation is done using any other method than execCommand,
> which limits its usefulness).
Well, the question, though, is whether or not DOM Range provides
enough of an interface. In theory, you could do everything you need to,
but in reality the scripting could get so complex that you're rather
just use a built-in method like execCommand.
> > I prefer the Mozilla
> > method anyways. It's much simpler and people don't have to understand
> > DOM Range to use it, which is good in situations like this since
> > dealing with selections within controls is more common.
>
> But one interface is simpler that two interfaces, and we need DOM Range
> (or something similar) anyway to do rich editing, which is arguably just
> as common an use case.
The real problem is that DOM Range is largely useless for selections
that consist entirely of a string of text obtained through the .value
property. All I need to know is the start and end points within the
string and I can make any changes I want using simple string
manipulation. So there's really never a situation where you NEED
something as complicated as DOM Range for a simple text control. Never
mind the fact that the value you're talking about doesn't exist in the
DOM in the first place. There's also the problem of DOM Ranges requiring
Nodes to define their start and end points. If .value isn't in the DOM,
what would the parent node be?
No, better to have two systems, since we're essentially dealing with
two kinds of content. DOM Range is a lot harder to learn anyways, so
after that the Mozilla method should be as easy as cake.
More information about the whatwg
mailing list