On Sat, 9 Sep 2006, Anne van Kesteren wrote:

On Fri, 08 Sep 2006 18:40:34 +0200, Dave Raggett <[EMAIL PROTECTED]> wrote:
p.s. implementing the output element would be a lot cleaner if more browsers supported the /> syntax for empty elements that aren't part of traditional HTML. IE already does so, but Firefox and Opera do not. Firefox is even worse as it coerces the tag name to upper case when you inspect the DOM node it creates! Opera and Firefox also differ over the amount of whitespace text nodes that are set as the content on unknown elements. IE has its own weird worts, although strangely, it works rather nicely for non-html markup in XML namespaces. IE therefore encourages the use of XML namespaces for mixed markup when delivered as text/html.

You sure IE only does this for <foo/> and not also for <foo>? It's my understand they are treated as being identical in every single browser. Whether or not such an element is treated as empty varies from browser to browser.

For traditional HTML elements, IE uses its built-in knowledge of
their content model, along with rules for dealing with malformed
HTML markup.

For other elements the behavior depends upon whether the tag
has a namespace prefix or not.

If the tag doesn't have an XML namespace prefix, then it is
inserted into the DOM as an empty upper case element.

  <foo>     nodeName = "FOO"
  </foo>    nodeName = "/FOO"
  <foo/>    nodeName = "FOO"

The same is true if you define the XML namespace with the
xmlns attribute e.g.

  <foo xmlns="http://example.com/ns"/>  nodeName="FOO"

BUT if you use a tag with a previously defined XML namespace
then things are different:

  <f:foo>hello world</f:foo>

is parsed as a foo element with a text node "hello world" as its
content. The case for the element's tag name is preserved.

if the namespace prefix isn't previously declared then you get:

  <f:foo>    nodeName = "F:FOO"
  </f:foo>   nodeName = "/F:FOO"

However, the namespace declaration can leave the URI empty, e.g.

 <html xmlns:f="">

is sufficient for IE to avoid giving <f:foo> the empty uppercase
treatment.

It isn't sufficient to define the namespace on the element itself
as in the following example:

  <g:fred xmlns:g="">smith</g:fred>

which gets the uppercase empty element treatment. To avoid
that, you need to declare the namespace on the html start tag.

Elements with a declared XML namespace prefix can be styled
with CSS.

Note that my tests were done using a script to walk the DOM
tree and display the results in an alert box.

With a knowledge of the above behavior, web page scripts can
be written clean up the DOM, e.g. placing the tags into the
HTML namespace with a dynamically defined prefix, and fixing
up the content. It's not a show stopper.

Converting the node name to uppercase also seems like the right thing to do for text/html documents although HTML5 might change bits of that...

Perhaps.

Another difference between IE and Opera is that Opera includes
the prefix as part of the node name for elements with a previously
declared XML namespace.

None of this is insurmountable by a determined scripter, but we
might perhaps try and aim for closer alignment amongst different browsers that is currently the case. I am not advocating that
Opera follows IE's upper case/empty element weirdness, rather
that Opera treat <foo/> as an empty element.

 Dave Raggett <[EMAIL PROTECTED]>  W3C lead for multimodal interaction
 http://www.w3.org/People/Raggett +44 1225 866240 (or 867351)

Reply via email to