Ich würde sagen, dass die Lösung funktionale Programmierung und Closures lautet.
Was triggert bei Dir denn eine Progress-Änderung? Doch sicher das Progress-Event, dem du einen Handler zuordnest. Wenn Du diese Zuordnung innerhalb einer Funktion durchführst (die sonst NICHTS tut), kannst Du eine Closure bilden, die deinem Handler Zusatzinformationen bereitstellt. Wenn Du Zusatzinformationen für mehrere Handler gemeinsam brauchst, kannst Du sie alle in dieser Funktion registrieren und hast einen geteilten Datenpool nur für dieses XHR Objekt, ohne das Objekt anzufassen.
Also z.B. sowas:
function addProgressHandler(xhr, progrControl)
{
xhr.addEventListener('progress', function(event) {
// verwende progrControl variable um das DOM Element zu referenzieren, das den Progress zeigt
});
}
Wenn Du die Funktion nicht in addProgressHandler einkapseln, sondern anderswoher holen willst, dann kannst Du sie natürlich auch in die Registrarfunktion hineingeben. Wichtig ist eben nur, dass eine Closure gebildet wird, die pro Registrierung einen kleinen Datenspeicher für die Handlerfunktion bildet.
function addProgressHandler(xhr, progrControl, progressHandler)
{
xhr.addEventListener('progress', function(event) {
progressHandler(event, progrControl);
});
}
Gruß
M.