Mam taką klasę (korzystam z prototype):

Addons = Class.create();

Addons.prototype = {
initialize: function(){},

require: function(libraryName) {
try {
var script_tag = new Element('script',{
type: 'text/javascript',
src: libraryName
});
$$("head")[0].appendChild(script_tag);
} catch(e){
// inserting via DOM fails in Safari 2.0, so brute force approach
document.write('<script type="text/javascript" src="' + libraryName + '"></script>');
}
}
}

I używam jej w sposób następujący:

Engage = new Addons();

var include = $w('global/functions main_menu/functions components');
var path = '../../scripts/';

include.each(function(file){
Engage.require(path + file + '.js');
});

w global/functions.js znowu dynamicznie dołączam kilka plików, tworząc swoistą rekurencję, wszystkie przeglądarki sobie z tym radzą (tak, nawet IE6) z wyjątkiem Opery i to w wersji bodajże ostatniej (9.26). Problem jest takiej natury, że tablice include i path są nadpisywane w każdym nowym rekurencyjnym wywołaniu, dlatego dołącza tylko kilka plików, bo reszte zamazuje. Dziwne zachowanie Opery. Miał ktoś podobny problem?