Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Che Guevara


 Thema: Javascript - Prototypes
erste ungelesene Seite | letzter Beitrag 
Teufel

AUP Teufel 21.04.2008
Frage
Hallöchen,

ich sitz grad an einem kleinen JS-Framework mit allen möglichen nützlichen Features, wie Cookies, DOM, Events usw.

Da es dabei recht viele Prototype Funktionen gibt, wollte ich mir das ganze etwas einfacher machen:

 
Code:
String.prototype = {
	trim: function() {
		return this.replace(/^\s*|\s*$/g, "");
	},
	clean: function() {
		return this.replace(/\s{2,}/g, " ").trim();
	}
}


Imo ist die Syntax korrekt, trotzdem funktioniert es nicht (es gibt leider keine Fehlermeldung).
Ich bin mir auch recht sicher das schon mal so gesehen zu haben.

Was mache ich falsch?

Zweite Frage:

Wie lautet das Objekt in dem alle HTML Elemente gespeichert werden?
Element
funktioniert afaik nur im Mozilla, und den Umweg über eine Funktion möchte ich nicht unbedingt gehen.

Für Hilfe wäre ich sehr dankbar.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Teufel am 07.06.2008 3:03]
07.06.2008 2:20:34  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
White[AoT]

Arctic
najo die syntax ist richtig - für eigene objekte.
was du momentan machst ist, dass du den kompletten prototype von String überschreibst. Das darfst du verständlicherweise nicht, weil du damit alle anderen im prototype definierten methoden löscht.

die lösung ist also String.prototype.trim = function() ... und das gleiche nochmal für clean.

gruß, White
07.06.2008 14:46:29  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
White[AoT]

Arctic
achso, noch zu deinem 2ten problem.
Es ist im IE das gleiche, allerdings darfst du darauf nicht zugreifen.
Im IE gibts leider keine möglichkeit, das "alle html elemente" objekt zu erweitern.
07.06.2008 14:48:00  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Teufel

AUP Teufel 21.04.2008
Ok, dann werde ich mir für das prototype zeug einen Wrapper schreiben.

Danke dir.
07.06.2008 15:37:18  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Teufel

AUP Teufel 21.04.2008
Da du dich ja sehr gut auskennst, gleich noch einmal eine Frage:

Für die Ajax Funktion würde ich gerne ein Objekt mit Funktionen als Parameter übergeben, zum Beispiel:

 
Code:
<input type="button" onclick="new Ajax('site.php', {
	onComplete: function(response) {
		alert(response);
	},
	onError: function() {
		alert('Error');
	}).init();"/>



Die Frage ist also: Wie kann ich das übergebene Objekt als Teil der Funktion implementieren?



// hat sich erledigt:

 
Code:
function foobar(param) {
	this.param = param;
	alert(this.param.param1);
	alert(this.param.param2);
}
new foobar({param1: "Hello", param2: "World"});
[Dieser Beitrag wurde 3 mal editiert; zum letzten Mal von Teufel am 08.06.2008 15:48]
07.06.2008 20:59:11  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Teufel

AUP Teufel 21.04.2008
Und gleich nochmal:

Das Teil ist jetzt so gut wie fertig und funktioniert im Firefox genau so wie ichs wollte.
Leider spucken mir Opera und der IE den Fehler "Ajax not defined" aus.
Ich weiß jetzt nicht warum das bei den beiden nicht klappt.
Als Objekt kann ich die Funktion ja nicht wirklich definieren.

Anstatt "this" im Code habe ich versucht mit einem Objekt zu arbeiten, und das zu returnen. Dann gehts aber gar nicht mehr, allerdings ohne Fehlermeldung.

Wäre wirklich super wenn jemand weiterweiß
13.06.2008 18:50:10  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
igor]2

Phoenix
Wird dein Problem vermutlich nicht lösen, aber ich hab da ne Frage zu einer anderen Stelle im Code:

var objects = ["Microsoft.XMLHttp", "MSXML2.XMLHTTP",
  "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.5.0"], i;
for (i=0; i<objects.length; i++) {
  try {
    return new ActiveXObject(objects[i]);
  } catch (e) {
    throw new Error("Your Browser doesn't support Ajax: ["+e+"]");
    return null;
  }
}


Liefert das nicht sowieso entweder ein
new ActiveXObject("Microsoft.XMLHttp")
zurück, oder wirft eine Exception? So wie ich das sehe, wird doch nur der Fall i=0 ausgewertet. (Zumal "return null;" nach dem throw eigentlich ebenfalls nicht ausgeführt wird, wenn JS da nicht irgendetwas elementar anders als andere Sprachen macht.)

e: Zeilenumbruch.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von igor]2 am 14.06.2008 9:37]
14.06.2008 9:36:58  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Teufel

AUP Teufel 21.04.2008
Ich versteh jetzt nicht ganz was du meinst, aber die Schleife läuft ja weiter durch.
Schleifen bricht man bei JS mit break ab...
14.06.2008 13:56:28  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
igor]2

Phoenix
Ein Rücksprung aus einer Methode, sei es per return oder throw, bricht eine Schleife auch ab. Meiner Meinung nach ist der Codeblock daher funktional äquivalent zu

try {
  return new ActiveXObject("Microsoft.XMLHttp");
} catch (e) {
  throw new Error("Your Browser doesn't support Ajax: ["+e+"]");
}


wenn ich das richtig sehe.
14.06.2008 15:56:07  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
FoxHunter

foxhunter2
Return springt auch aus der Schleife, also wird hier wirklich nur i=0 evaluiert, igor hat Recht.

Statt return new ActiveXObject(objects[i]) muss sowas wie das her:

 
Code:
Object obj = new ActiveXObject(objects[i]); // Keine Ahnung wie der Rückgabetyp des Konstruktors ist
if(obj != null)
   return obj;
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von FoxHunter am 14.06.2008 15:59]
14.06.2008 15:57:26  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Teufel

AUP Teufel 21.04.2008
Ok, da hab ich wohl einen Fehler gemacht.

Allerdings behebt das leider den Fehler nicht dass "Ajax undefined" ist traurig
15.06.2008 2:14:01  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Teufel

AUP Teufel 21.04.2008
So, und gleich nochmal weils so schön war:

 
Code:
<script>
Array.prototype.extend = function(obj) {
	for (var i in obj) {
		this.prototype[i.toString()] = obj[i];
	}
	return this;
}
Array.extend({
	blubb: function() {
		alert("Hello");
	}
});
[1,2,3].blubb();
</script>


Mit diesem Code möchte ich einen Wrapper bauen, um das Problem im ersten Post zu umgehen.
Also quasi
 
Code:
Array.extend({
	blubb: function() {
		// do something w/ array
	}
});



Scheint mir logisch und richtig zu sein, aber geht offensichtlich nicht.
Fehlermeldung:
TypeError: Array.extend is not a function


Duh.

Ideas, anyone?
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Teufel am 19.06.2008 18:40]
19.06.2008 17:45:54  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: Javascript - Prototypes


mods.de - Forum » Webdesign & Coding » 

Hop to:  

Thread-Tags:
| tech | impressum