views:

628

answers:

6

I have this piece of code:

<script language="javascript" type="text/jscript">
  document.write("<img src='http://dm.leadgenesys.com/jpgp.lgt?en=P.........TP_Q=&amp;amp;ur=' + escape(document.referrer) + ''  border='0' alt='no alt' />");
</script>

and... when I try to validate it, I'm given this error:

document type does not allow element "img" here

…rer) + '" border="0" alt="no alt" />');

The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head" -- or two elements that overlap (which is not allowed).

Any idea what I can do to make this JavaScript w3c compliant?

+2  A: 

You probably have your <script> element in your <head>, so essentially you're trying to create an <img> in the head of your document, which doesn't work. You need to put the script in the <body>.

However, I'd recommend you add the element via the DOM instead, because you'll be less likely to run into these kinds of problems.

musicfreak
+3  A: 

Simple: don't try to validate your JavaScript as HTML.

You can do this in a number of ways... But the best by far is to move it out into a separate JS file, and then either call it from a short script

<body>
...
<script type="text/javascript" language="javascript">WriteImage();</script>
...
</body>

...or better yet, ditch document.write() entirely and manipulate the DOM after it has loaded.

See also: Unobtrusive JavaScript

Shog9
the separated js file worked great for me! since the <script> wasn´t on the <head>thank you!
Andy
+1  A: 

It's part of the HTML4 standard. You must escape "</" sequences found inside SCRIPT tags.

<SCRIPT type="text/javascript">
  document.write ("<EM>This will work<\/EM>")
</SCRIPT>

Another solution, and probably better, is to move the JS code in external files.

Reference

Ionuț G. Stan
That's not the problem, as there's no "</" sequence in his script tag. It's still true, though.
Miles
Miles, you're right. It slipped my eyes that he's using an IMG tag.
Ionuț G. Stan
+3  A: 

Another way to silence the validator...

Put it like this:

<script type="text/javascript">
/* <![CDATA[ */
your_javascript_here("<" + ... ;
/* ]]> */
</script>

The CDATA part should be enough for the validator, the /* style comments */ are for older browsers which do not recognize the CDATA tag (it would otherwise break the javascript).

ChristopheD
Perhaps I'm confused, Shouldn't it be: //<![CDATA[//]]>
Sean
CDATA sections only work when the document is parsed as XML (sent using application/xhtml+xml)
Miles
These are multiline comments, as in C.
ChristopheD
Miles is right, that CDATA crap means nothing for the browser. And by the way, in real XHTML there's no document.write.
Ionuț G. Stan
I agree it means nothing to the browser, that's why i wrote 'another way to silence (read:trick) the validator...' :)
ChristopheD
+2  A: 

How aboout

<script>
<!--
var i = null;
if ((i/0) == 12)
  alert("whooo! pack your things, as it's starting to rain cats and dogs!");
--><script>

See that the content of the "script" is inside "html comments"?

elcuco
A: 
document.write("<" + "img … /" + ">");

Or:

document.write("\x3Cimg … /\x3E");
Gumbo