- From: Lachlan Hunt <lachlan.hunt@iinet.net.au>
- Date: Mon, 31 Jan 2005 13:57:39 +1100
- To: Philip TAYLOR <P.Taylor@Rhul.Ac.Uk>
- CC: "Jukka K. Korpela" <jkorpela@cs.tut.fi>, DjMafia <barrerad@gye.satnet.net>, www-validator@w3.org
Philip TAYLOR wrote: > Jukka K. Korpela wrote: >> On Sun, 30 Jan 2005, DjMafia wrote: >>> <script type="text/javascript"> if (!chatterbox || chatterbox != 'ok') { >>> var txt = "This <a href="http://chatter.flooble.com/">flooble >>> chatterbox</a> is" >> >> Quick answer: put all script code into an external file that you refer to >> via a src attribute in a script element. Alternatively, unless you have >> some particular reason to use XHTML, switch to HTML, where the problem >> is smaller (you only need to worry about things like </a>, which you >> can write as <\/a> in JavaScript). In fact, given the script initially provided, you really must use HTML for it to work as intended. Firstly, if you're going to use XHTML served as text/html, you should hide the script from legacy user agents and also escape it propely as CDATA for use within real XHTML. <script type="text/javascript"><!--//--><![CDATA[//><!-- ... //--><!]]></script> That is designed to work for both HTML user agents (which is what you get when you serve as text/html) and XHTML user agents (when served as application/xhtml+xml or other XML MIME type). If your just going to use HTML (as recommended), then just use: <script type="text/javascript"><!-- ... //--></script> However, it is recommended that you include the script within an external file which solves the errors you were recieving, can also then be reused for any document. Although, as I said, there are other problems that need to be looked at, especially if you're going to continue using XHTML. From the original script you provided us with: >>> <noscript> >>> <p><img src="http://img.flooble.com/images/chatter/chaticon.gif" >>> align="absbottom" alt="" >>> onclick="window.open('http://chatter.flooble.com/chatter.php?id=Mafia63&sid=2021655&popup=true&w=480&h=400','flooblechatterbox','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,copyhistory=no,width=480,height=400'); >>> return true" /> There are several problems with this section: * Since this is in a <noscript> section, any user agent that renders it is not going to be able to understand the onclick attribute, thus defeating the whole purpose of a noscript section. * For accessibility reasons, you should also avoid opening unrequested popup windows. Also, some users (including myself) configure user agents to never open new windows. So if you're application requires the new window to function, then it will fail. If it doesn't require the new window, then you really have no reason to use one anyway. * The alternate text provided is quite useless for any user agent that doesn't support images. It's obviously not a purely presentational image since it supposed to serve a function when clicked. * The align attribute is presentational, and is better handled through stylesheets. So, that markup would be better replaced with: <p> <a href="http://chatter.flooble.com/chatter.php?id=Mafia63..."> <img src="http://img.flooble.com/images/chatter/chaticon.gif" alt="Chat" /></a> </p> >>> Talk in my <a href="http://chatter.flooble.com/">flooble chatterbox, a free >>> javascript chat tag board / shoutbox / tagboard program for your xanga, diary, >>> blogger or weblog</a><br /> >>> <a href="http://perplexus.info/about.php">free puzzle of the day</a></p> >>> </noscript> Although, since it seems to link to a JavaScript-only driven chat service, there's really no point in providing this alternate <noscript> content, unless suitable alternate content is provided for the chat service also, or it at least degrades gracefully and is still usable without script enabled. >>> <script type="text/javascript"> if (!chatterbox || chatterbox != 'ok') { >>> var txt = "This <a href="http://chatter.flooble.com/">flooble chatterbox</a> is" >>> document.write(txt); >>> document.write(' temporarily unavailable. It will be back up shortly.'); } </script> document.write() does not work for XHTML documents when they are treated correctly as XML [1]. The basic reason is because XML documents must remain well formed and document.write has the ability to break that. Not only that, but document.write is just not recommended anyway, regardless of whether you're using HTML or XHTML. It is deprecated in favour is using the standardised DOM methods. Therefore, you should use something like the following instead. You need an element in your document within which you will insert the new content, and it needs to be accessible from the script. This is most easily achieved using an element with an id. (Note: If you're going to use XHTML, you should use the namespace aware methods instead, when served as XML. The following will work for HTML) Within the markup: <div id="xxx"> <!-- The script will insert the new elements here --> </div> Then, within the script: var x = document.getElementById("xxx"); x.appendChild(document.createTextNode("This ")) var a = document.createElement("a"); a.setAttribute("href", "http://chatter.flooble.com/"); x.appendChild(a); x.appendChild(document.createTextNode(" is temporarily unavailable...")) > Not convinced this is really the cause of the problem; surely it is the > double use of '"' that is the problem -- used first as delimiter > for the var txt assignment, and then again within the RHS of the > assignment to delimit the replacement text for the href. The quotes, in the case of the original script provided, will likely cause a few JavaScript errors; but since the validator does not know JavaScript, it only knows SGML and XML, they will not have any effect on markup validation. [1] http://ln.hixie.ch/?start=1091626816&count=1 -- Lachlan Hunt http://lachy.id.au/ http://GetFirefox.com/ Rediscover the Web http://SpreadFirefox.com/ Igniting the Web
Received on Monday, 31 January 2005 02:57:50 UTC