loading js code with xmlhttp working (but..)

W

warteschlange

i want to postload javscript from another javascript.
This works fine in
firefox and IE6
for macIE i can use an Iframe to load the code and inject it with
insertAdjacentHTML
The problems arise with safari and opera.
both load the new code with XMLHttpRequest, but the code is no
'executable'
To make this possible on IE i had to use the magic 'DEFER' attribute.

(Sync or Async ist not the issue)



This is a extract of the working code:
Code:
//----------------
function importJS(url){
var script = syncGetFile(url);
document.body.insertAdjacentHTML("beforeEnd",
"<span>&nbsp;</span><SCRIPT DEFER>" + script + "</SCRIPT>");
}

//----------------
function syncGetFile(url){
var xmlhttp = _XMLHttpRequest_init();
xmlhttp.open("GET", url, false);
xmlhttp.send(null);
return xmlhttp.responseText;
}
function _XMLHttpRequest_init() {
.....
}
if(typeof HTMLElement!="undefined" && !
HTMLElement.prototype.insertAdjacentElement){
HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {
}
}
for testing try to insert "var str = 'function a(){alert(1)}'; with
insertAdjacent or another way
and call the function afterwards.

i'm stuck now.

opera and safari experts needed...
Andres
 
M

Martin Honnen

warteschlange said:
i want to postload javscript from another javascript.
This works fine in
firefox and IE6
for macIE i can use an Iframe to load the code and inject it with
insertAdjacentHTML
The problems arise with safari and opera.
both load the new code with XMLHttpRequest, but the code is no
'executable'

With recent Opera (8.x, perhaps 7.5x) it should be possible to simply
create a new script element object and insert it into the page without
using any XMLHttpRequest e.g.

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'test2005071701.js';
document.getElementsByTagName('head')[0].appendChild(script);

That also works with IE/Win and with Mozilla but you should note that
the script file might be loaded asynchronously so don't expect to be
able to call functions in the JavaScript file directly after the
appendChild call.
 
W

warteschlange

thanks,
i will try Opera 8.
I'm completely aware of the sync / async problem.

So there remains Safari as a problem.
I'm sure, that sooner or later Safari will allow your mentioned method,
but until then some hacking is needed.

(I guess, it is the same with the opacity - you have to convice the
progammers, that it is not relevant how useful that 'gadget' is, what
really matters is compability)

One aproach to make it work with safari, was loading the new jssrc and
using eval (arghhh...) - Works, but functions must be defined this
way:
window.funcName = function(...){...}, to be callable from the origin
code.

Again thanks
and hoping for a Safari expert
 
W

warteschlange

I noticed one disadvatage of your method to use
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'test2005071701.js';
instead of httpRequest:
you see in the statusbar an information, that a reload is goin on...
Having a timer for requesting data every few seconds this is
unfortunately not very elegant!
 
R

Randy Webb

warteschlange said the following on 7/22/2005 2:12 PM:
I noticed one disadvatage of your method to use
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'test2005071701.js';
instead of httpRequest:
you see in the statusbar an information, that a reload is goin on...
Having a timer for requesting data every few seconds this is
unfortunately not very elegant!

It is still a better alternative than an HTTPRequest that has limited
support though, isn't it? createElement is supported in more browsers
than HTTPRequest is. Possibly using a test for HTTPRequest support and a
final section that attempts to use createElement and possibly two other
ways to dynamically load a .js file.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,817
Latest member
AdalbertoT

Latest Threads

Top