- From: Dave Raggett <dsr@w3.org>
- Date: Sun, 10 Sep 2006 11:17:19 +0100 (BST)
On Sat, 9 Sep 2006, Anne van Kesteren wrote: > On Fri, 08 Sep 2006 18:40:34 +0200, Dave Raggett <dsr at w3.org> 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 <dsr at w3.org> W3C lead for multimodal interaction http://www.w3.org/People/Raggett +44 1225 866240 (or 867351)
Received on Sunday, 10 September 2006 03:17:19 UTC