views:

172

answers:

7

I want to rewrite this line as vanilla JS so it is applied quicker (and before the downloading of the jQuery library). The line is

$(document).ready(function() { $('body').addClass('javascript'); });

If I added it to the html element instead, would I be able to leave off the DOM ready part? One problem with this though is the validator doesn't like the class attribute on the html element, even if it is inserted with JS.

So, how would I rewrite that as vanilla JS?

A: 
window.onload = function() {
   var elmt =  document.getElementsByTagName('body');
   if(elmt){
      elmt[0].className = 'javascript';
   }
}

That should do it.

EDIT: Updated to get element by tag name not ID.

jaywon
you are looking for the id #body here...
David
@David, thx for the heads up. don't do a lot of jQuery so assumed that was to find an element by ID.
jaywon
I'm pretty sure `onload` is triggered after `$(document).ready` - I think it's waiting for all images to load, for example.
Kobi
document.body is cleaner (and slightly faster) then gEBTN[0].
David Dorward
@david d - i agree, thanks for the suggestion
jaywon
+1  A: 

I dont know about vanilla JS, but you can write:

document.getElementsByTagName('body')[0].className += ' javascript';

at the bottom of the page (before closing the body tag).

David
A: 

Simple:

window.onload = function() {
  document.body.className = "javascript";
}

Or in HTML:

<body onload="document.body.className = 'javascript'">...</body>

Unless you want to differentiate between "before onload" and "after onload", you can do it statically:

<body class="javascript">...</body>
Eugene Lazutkin
K Prime
Feel free to ignore the 3rd example. In all fairness he didn't indicate what he wants to achieve by that.
Eugene Lazutkin
+7  A: 

If you want to reproduce the jQuery's document.ready event, you can use the onreadystatechange or DOMContentLoaded events where applicable:

function domReady () {
  document.body.className += " javascript";
  // ...
}

// Mozilla, Opera, Webkit 
if ( document.addEventListener ) {
  document.addEventListener( "DOMContentLoaded", function(){
    document.removeEventListener( "DOMContentLoaded", arguments.callee, false);
    domReady();
  }, false );

// If IE event model is used
} else if ( document.attachEvent ) {
  // ensure firing before onload
  document.attachEvent("onreadystatechange", function(){
    if ( document.readyState === "complete" ) {
      document.detachEvent( "onreadystatechange", arguments.callee );
      domReady();
    }
  });
}
CMS
A: 

Did you try to put at the very end of your body the following?

<script>
    document.body.className = 'javascript';
</script>
Mic
A: 

just put this

<script>document.body.className += ' javascript';</script>

before </body> tag. Simple and easy (and very close) solution.

NilColor
+1  A: 

If your aim is to add the class to body immediately as the page is loaded, perhaps to hide no-JS-fallback elements, you could do that just immediately inside the body tag rather than waiting for any events:

<body>
    <script type="text/javascript">
        document.body.className+= ' javascript';
    </script>

(although in general if that's the aim it's better to remove the fallback elements as you go along replacing them with scripted elements, so that if one piece of script errors out all the other components on the page don't break.)

This is the fastest way to bind to elements: do so just immediately after creating them (inside the open tag if you only need to alter the elements; just after the close tag if you need to alter their contents). However this approach does tend to litter the page with ugly <script> blocks, which is why more people put the code all at the bottom or use an load/ready-handler.

bobince
Thanks for your answer - should I parse the XHTML with regex too? :P *provoking*
alex