Hi folks,

I've been working on a little jQuery powered MVC framework for the past week and it really has started to produce some nice results. One of the things I highly depend on is the ability to dynamically include javascript files, and trigger a callback function when they are loaded. Those need to load before the DOM does. I call this semi-asynchronous loading.

Right now I have a function called jsInclude for this that is part of a jCake 'singleton' class (using 'new function') which works really beautifully in Firefox. However since about ~4 hours I've been trying to get it to work under IE and only hit issues. So first please have a look at the code:

----------------------------------------------------------------------------
// the variable 'self ' refers to the jCake class/ that this function is a part of

this.jsInclude = function(jsInclude, callback, params, scope)
{
   if (!params)
       params = [];
   else if(typeof(params)=='string')
       params = [params];

   for (i=0; i < self.jsIncludes.length; i++)
   {
       if (self.jsIncludes[i]==jsInclude)
       {
           callback.apply(self, params);
           return;
       }
   }
var path = self.jsBaseUrl+jsInclude; document.write('<script type="text/javascript" src="'+path+'"></script>'); if (callback)
   {
self.jsCallbacks.push({scope: scope || self, callback: callback, params: params}); document.write('<script type="text/javascript">var callback = jCake.jsCallbacks['+(self.jsCallbacks.length-1)+']; callback.callback.apply(callback.scope, callback.params);</script>');
   }
self.jsIncludes.push(jsInclude);
}
----------------------------------------------------------------------------

What it does is fairly simple, it dynamically adds a <script> tag to the document using document.write and then, in case there is a callback function it adds another script tag that should fire the callback when the external <script> before it has loaded. This works in FF, but in IE the callback will be triggered instantly. So I tried to work around this in several ways: using the IE defer attribute for the script tag <http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/defer.asp>, the onreadystatechange event <http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited> as well as using an additional external file. But no matter what I've tried, it either resulted in the include becoming asynchronous (as opposed to semi-asynchronous loading before the DOM), or into some mess of IE errors that eventually brought up a white page (probably because document.write was triggered after the DOM had loaded).

So for me this is the point to ask some of the JS ninjas around here if they've been playing around with stuff like this before. Again, what I need is a cross browser (let's say IE/FF) way to dynamically include JS files before the DOM has loaded and registering an onload callback.

Meanwhile I'll go back to the drawing board and create a stand-alone demo of the problem that I'll post here later on in case nobody can work with the code I posted above.

-- Felix Geisendörfer aka the_undefined
--------------------------
http://www.thinkingphp.org
http://www.fg-webdesign.de
_______________________________________________
jQuery mailing list
[email protected]
http://jquery.com/discuss/

Reply via email to