php.de

Zurück   php.de > Webentwicklung > JavaScript, Ajax und mehr

JavaScript, Ajax und mehr dynamisches Scripten und Interaktion auf Clientebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.02.2012, 20:01  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.170
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard Prototyping und Konstruktorparameter

Guten Abend allerseits,

ich versuche grad ein wenig meine ersten Gehversuche mit Javascript und OOP.

Hier mein Code.
Code:
function ShowHideElement(idEvent, idElem)
{
    this.idEvent = idEvent;
    this.idElem = idElem;
}

ShowHideElement.prototype.show = function(pEvent)
{
    document.getElementById(this.idElem).class = 'com_form_show';
}

ShowHideElement.prototype.event = function(pEvent)
{
    if(document.addEventListener) {
        document.getElementById(this.idEvent).addEventListener('click', this.show, false);
    } else {
        document.getElementById(this.idEvent).attachEvent('onclick', this.show);
    }
}
Aufrufen tu ich das ganze im windowonload so.

Code:
var comForm = new ShowHideElement('show_com_form', 'comment_form_container');
                comForm.show();
                comForm.event();
Die Ids der beiden Elemente existieren, ich vorm laden des Objektes getestet ob die IDs null sind, wäre das gewesen dann hätte kein Fehler durch den click Event auftreten können.
Aber ich bekomme bei Eventversuch die Fehlermeldung das die ID die in this.idElem steht null ist.

Was mache ich da falsch und muss ich ändern?

Vielen Dank für eure Hilfe Gruß Litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 02.02.2012, 20:25  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.695
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Was du beschreibst, hängt vermutlich mit Closures zusammen. Wenn du die Kontext-Referenz this in Event-Callbacks verwendet, verweist sie natürlich auf das Element, das das Event ausgelöst hat. Ein häufig missachteter Stolperstein.
Du musst den Kontext vorher in einer anderen Variablen speichern.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:28  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.879
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Was mache ich da falsch und muss ich ändern?
Hast gleich den besten Fall erwischt Bei Events (timeout, click-Event etc) ändert sich die Referenz von this und this zeigt auf das Event-auslösende Objekt, z.B. window. Schau Dir mal das an: http://aktuell.de.selfhtml.org/artik...te-und-kontext

Btw. würde ich Dir raten, im Objekt nicht die ID, sondern eine Referenz auf den DOM Knoten zu speichern. Sonst must getById jedesmal neu den DOM Tree durchackern.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:29  
Erfahrener Benutzer
 
Benutzerbild von drsoong
 
Registriert seit: 05.08.2008
Beiträge: 1.127
drsoong wird schon bald berühmt werden
Standard

Ähm, musste das jetzt ziemlich oft lesen...Machst Du das, um generell Javascript der "alten Schule" zu lernen, bevor Du auf ein Framework, Library umsteigst? Der jQuery-Code hierzu wäre:

Code:
$("#show_com_form").click(function(){
$("#comment_form_container").show();
});
Sieht irgendwie übersichtlicher aus, oder?
__________________
Es ist schon alles gesagt. Nur noch nicht von allen.
drsoong ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:31  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.879
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Das ist schon sehr sinnvoll, drsoong. Mit JQuery alleine kommt man bei komplexeren Anwendungen nämlich nicht sehr weit. Jedenfalls nicht ohne Ressourcenverschwendung. Wie $("#comment_form_container") in Deinem Beispiel.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:36  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.695
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Meiner Meinung nach sollte jeder zumindest anfänglich einmal Bare-Metal-JavaScript schreiben. Habe ich auch gemacht.
Wenn man später für den produktiven Einsatz Frameworks einsetzt ist das vollkommen in Ordnung. Aber genauso wie man PHP nicht anhand gigantischer Libraries lernt, sondern anhand simpler Hallo-Welt-Programme, sollte man auch erst einmal die Grundstruktur von JavaScript verstanden haben.

Im Übrigen ein kleiner Tipp: auf attachEvent() kannst du mittlerweile verzichten. Nutze einfach addEventListener(), das reicht. Dann wird das auch mit den Closures einfacher, weil du dann einfach eine anonyme Methode für das Event-Callback nutzen kannst ohne redundanten Code schreiben zu müssen:

***Code-Schnipsel weiter unten***
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:42  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.879
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Manko, das wird so glaube ich nicht funktionieren. that dürfte im prototype-Setting nicht bekannt sein.

[edit] Vergiss es, hab was übersehen. Btw. falschrum: var this = that;
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:48  
Erfahrener Benutzer
 
Benutzerbild von drsoong
 
Registriert seit: 05.08.2008
Beiträge: 1.127
drsoong wird schon bald berühmt werden
Standard

Zitat:
Jedenfalls nicht ohne Ressourcenverschwendung. Wie $("#comment_form_container") in Deinem Beispiel.
Weil...?
__________________
Es ist schon alles gesagt. Nur noch nicht von allen.
drsoong ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:51  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.879
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Selbe Antwort:
Zitat:
Btw. würde ich Dir raten, im Objekt nicht die ID, sondern eine Referenz auf den DOM Knoten zu speichern. Sonst must getById jedesmal neu den DOM Tree durchackern.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 02.02.2012, 20:53  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.695
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Err, das sollte eigentlich auch andersherum gemeint sein. this kann man sowieso keinen Wert zuweisen. Auf den Prototypen-Kontext habe ich jetzt gar nicht geachtet und einfach nur das Codeschnipsel übernommen. Oje. So ist es gemeint:

Code:
function ShowHideElement(idEvent, idElem)
{
    this.idEvent = idEvent;
    this.idElem = idElem;
    
    this.show = function(pEvent)
    {
        var that = this;
        document.getElementById(this.idEvent).addEventListener('click', function() {
            document.getElementById(that.idElem).class = 'com_form_show';
        }, false);
    }
}
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Javascript array prototyping in namespace rudygotya JavaScript, Ajax und mehr 2 12.10.2009 14:45


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:37 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum