Zur Boardunity Forenstartseite

Zurück   Boardunity & Video Forum » Technik » Programmierung und Datenbanken

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1  
Alt 05.10.2005, 18:41
Benutzerbild von LonelyPixel
UNB-Entwickler
 
Registriert seit: 01.2004
Ort: Erlangen
Beiträge: 974

JavaScript: lokale Variablen in anonymen Funktionen


Hi,
da bin ich schon wieder. Diesmal stehe ich vor einem anderen Problem: ich möchte mehrere Event-Handler auf einer Seite einrichten, die jeweils verschiedene Dinge in die Statuszeile des Browsers schreiben sollen. Konkret will ich, dass beim mouseover über Submit-Buttons in Formularen deren Zieladresse wie bei jedem anderen Link angezeigt wird.

Dafür habe ich mir folgenden Code gebastelt:
Code:
// Event handler that adds mouse hover statusbar information about HTML forms'
// submit buttons' target URL
//
// NOTE: There are several problems with this function:
//       * It doesn't correctly handle the base path on Firefox, but it does on Opera.
//       * It always shows the page's last form's action URL for all submit buttons on the page.
//         Maybe something from http://weblogs.asp.net/asmith/archive/2003/10/06/30744.aspx can help here.
// TODO,FIXME
//
function UnbAddFormStatus(event)
{
	var i;
	for (i = 0; i < document.forms.length; i++)
	{
		// For all forms in the document
		var f = document.forms[i];
		var url = f.getAttribute("action");
		if (url.indexOf("/") == 0)
			url = document.location.href.match(/^(.*?)\//)[1] + "/" + url;
		else if (url.indexOf("/") == -1)
			url = document.location.href.match(/^(.*)\//)[1] + "/" + url;

		var method = f.method.toUpperCase();

		var text = "";
		text += url;
		if (method == "POST") text += " (" + method + ")";
		
		var j;
		for (j = 0; j < f.elements.length; j++)
		{
			// For all elements in that form
			var e = f.elements[j];
			if (e.tagName == "input" && (e.type == "submit" || e.type == "image"))
			{
				// If submit button
				e.addEventListener("mouseover", function() {window.status = text;}, false);
				e.addEventListener("mouseout", function() {window.status = "";}, false);
				
				//alert("Added info: " + text + " for button: " + e.value);
			}
		}
	}
}

// Call handler function when the page has finished loading
window.addEventListener("load", UnbAddFormStatus, false);
Der geht also alle forms der Seite durch und setzt die entsprechenden Event-Handler mit anonymen Funktionen die dann in die Statuszeile schreiben. Leider scheint sich der Browser zu merken, dass die Variable text bereits existiert und speichert dann bei allen Funktionen dieselbe Referenz auf diese eine Variable ab. Dadurch schreibt natürlich jede Funktion denselben Wert, was ja nicht sein soll.

Was ich jetzt suche ist eine Methode, mit der ich in den anonymen Funktionen Daten speichern kann, die da auch drin bleiben und nicht nochmal von außen verändert werden. Ich hab jetzt mehrere Implementierungen mit anonymen Funktionen gesehen, die sind toll, um nen lokalen Namensraum zu schaffen etc, aber mein Ziel konnte ich bislang noch nicht erreichen.

Ich hab zwar in Algorithmik I mal Scheme (eine Lisp-Variante) gelernt, und da auch mit closures gearbeitet (kurz: jede Funktion hat ihren eigenen permanenten Kontext), allerdings kann ich mich nicht mehr an die Details erinnern, was mir ohne passende JavaScript-Syntax wohl auch nicht viel hilft. Dass dieses closure-Konzept in JS auch funktioniert, sagt die im Code angegebene URL aus.

Ich weiß, dass das hier nicht primär ein JavaScript-Expertenforum ist, aber mir fällt grad keins ein, wo man sowas fragen könnte. Bin natürlich auch für Links dankbar, die mich an entsprechende Communities verweisen.
__________________
Yves Goergen
Softwareentwicklung, Fotografie, Webhosting, UNB Components (in Arbeit)
  #2  
Alt 22.11.2011, 23:58
neues Mitglied
 
Registriert seit: 11.2011
Beiträge: 1

Closures in JavaScript


Ich weiß der Artikel ist schon älter, aber da ich ein ähnliches Problem hatte, hier einmal des Rätsels Lösung: Closures. Sie ermöglichen es Werte zwischen zu speichern und Sichtbarkeiten einzuschränken. Ein kurze Einleitung wie diese zu Implementieren sind erhält man z.B. hier: closures in javascript
Antwort


Stichworte
-


Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
Gehe zu






1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25