Hmja, also kann direkt kein Parameter an eine zu ladende Funktion weitergegeben werden. Dafür ist dann eine anonyme Containerfunktion erforderlich.
Richtig verstanden?
Ja.
Ich kenne nämlich keine Methode, mit der man eine unbekannte Anzahl an Parametern an addContentLoadListener übergeben würde, die dann weitergegeben werden an die Funktion aus dem ersten Parameter. Beispiel:
var DOMContentLoaded = false;
function addContentLoadListener (func) {
var params = [], param_string = "";
for (var i = 1; i < arguments.length; i++) {
params[params.length] = arguments[i];
param_string += "params[" + i + "]";
if (i < (arguments.length - 1)) {
param_string += ", ";
}
}
var func_string = "func(" + param_string + ");";
alert(func_string);
var wrapper_func = new Function(func_string);
alert(wrapper_func);
if (document.addEventListener) {
var DOMContentLoadFunction = function () {
window.DOMContentLoaded = true;
wrapper_func();
};
document.addEventListener("DOMContentLoaded", DOMContentLoadFunction, false);
}
var oldfunc = (window.onload || new Function());
window.onload = function () {
if (window.DOMContentLoaded) {
return;
}
oldfunc();
wrapper_func();
};
}
function test () {
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);
}
}
addContentLoadListener(test, "a", "b", "c", "d");
Wenn ich eine Funktion bauen will, in der test("a", "b", "c", "d") drinstehen kann, aber auch test("a"), so muss ich den Funktionskörper über new Function erstellen. Das Problem ist: new Function erzeugt im Gegensatz zu einer Function-Expression *keine* Closure! Frage mich nicht, warum. Jedenfalls bedeutet das, dass die Variablen aus dem Scope der Funktion addContentLoadListener nicht in der Wrapper-Funktion zur Verfügung stehen. test(params[0], params[1], params[2], params[3]) wird also korrekt erzeugt, aber params ist in dieser Funktion nicht verfügbar.
Ich weiß nicht, wie man das Problem lösen kann. Man kann es nur umgehen, indem man z.B. einfach die ersten zehn Parameter übergibt:
function addContentLoadListener (func, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) {
var wrapper_func = function () {
func(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
}
...
wrapper_func();
...
}
Oder man speichert die Parameter in einem Object-Objekt:
function addContentLoadListener (func, params) {
...
func(params);
...
}
function test (params) {
alert(params.param1 + " " + params.param2);
}
addContentLoadListener(test, { param1 : "param1", param1 : "param2" });
Mathias