Beiträge von Netzwerg

    Das ist genau das, was ich meine. Dein JS wird sehr groß und ist fehleranfällig, hat eine riesen Anteil an C&P und wird ein Maintenance-Alptraum. Und im übrigen registrierst du in deinem Quellcode genau wie ich gesagt habe jedes mal einen neuen Handler. $("#option1").click(function() { ... }); ist der erste, $("#option2").click(function() { ... }); der zweite, und mit $("#option11").click(function() { ... }); und entsprechend dem für option12 geht es weiter. Alleine das sind 4 unterschiedliche, jedes mal hard-gecodete Handler.


    Ich hab ja auch nicht gesagt, du sollst 1:1 meine Lösung verwenden, sondern dir ein Beispiel gegeben, wie man es generischer lösen könnte. Du denkst einfach stur prozedural und in primitiven Datentypen. Denk objektorientiert und imperativ!


    Man könnte z.B. eine Technologie als ein Objekt auffassen. Eine Technologie hat einen Namen, hat Voraussetzungen, die erfüllt sein müssen (also eine Liste an anderen Technologien) und hat dann ggf. noch eine Eigenschaft, ob sie erforscht ist (boolean).


    Man kann dann auf zwei Arten weitermachen: Diese Daten in data-* Attributen speichern und das Markup selber schreiben, und das JS die Daten aus den data-* Attributen lesen lassen. Oder man speichert sich diese Daten im JSON-Format ab und lässt sich das Markup gleich vom JS generieren.


    Ein anderer Punkt sind deine ganzen kopierten Strings. Man könnte diese Strings einmal generisch fertig machen, z.B. als var x = "Glückwunsch, du hast {0} erforscht" und dann x.replace("[0}", "Speere") um das ganze auszugeben. Das ist eine triviale Änderung, spart die aber viel C&P und erlaubt die a) das Ganze viele infacher zu übersetzen oder b) die Nachricht viel einfacher anzupassen.


    Hier ist mal ein anderes Beispiel:
    http://jsbin.com/heludibewu/2 (Link zur Source: http://jsbin.com/heludibewu/2/edit).


    Wenn du bei einer Technologie den "erforschen" Button drückst, wird entsprechend es bei den Voraussetzungen grün markiert. Du kannst hier natürlich noch beliebige weitere Aktionen machen, wie Nachrichten einblenden oder noch andere Färbungen vornehmen.


    Bei dieser Lösung kannst du neue Technologien hinzufügen, indem du einfach das technologies-Array um neue Objekte erweiterst. Das ist eine Möglichkeit, ganz klassisch das open/closed Principle anzuwenden.


    Deine Lösung funktioniert natürlich auch, keine Frage. Sie ist nur - nach allen objektiven Kriterien (s.o.)- sehr schlecht. Es ist typischer Code wie man ihn höchstens von einem gerade anfangendem Schler erwarten würde. Erreicht sein ziel, aber wenn du ihn jemals jemandem anderen gibst bringt der dich dafür um ;)


    Meine Lösung ist übrigens keineswegs kanonisch oder das Gelbe vom Ei - sie ist nur eine der vielen Möglichkeiten, sich dem Problem generisch zu nähern, C&P zu vermeiden und den Wartungsaufwand zu verringern. Meine Lösung erlaubt es auch, die Daten ggf. automatisch auszulesen, und sich somit komplett zu sparen, diese manuell einzugeben (was bei 400 Technologien auch viel sein dürfte). Selbst wenn man es manuell eingeben muss spart man sich viel Zeit, da man nur Elemente ins Array packen muss, und sich sonst keine Gedanken mehr machen muss.


    tl;dr: Man kann sich viel Arbeit sparen, wenn man Anfangs richtig arbeitet. Objektorientierung hilft ;)

    Geschaltelte if/else sind unleserlich, schwer wartbar und kaum erweiterbar, außerdem bläht es deinen Code unglaublich auch.


    Nehmen wir dein Beispiel. Du hast einen Forschungsbaum, und kannst anklicken, ob etwas erforscht ist, oder nicht. Du markierst dann den entsprechenden Eintrag farbig.


    Was du tust, ist, für jede Forschung eine ID anzulegen und außerdem noch deine JS Datei ändern zu müssen. Wäre es nicht viel besser, wenn deine JS Datei nur aus 20-30 Zeilen Code bestünde, und du einfach in der HTML Datei beliebig viele Forschungen hinzufügen könntest? Das hat nichts mit "kompliziert machen" zu tun, sondern erleichtert dir selber am Ende die Arbeit. In deinem Beispiel brauchst du mind 3 Zeilen Code im JS pro Forschung. Schon bei 10 Forschungen ist ein 30 Zeilen JS, dass generisch funktioniert, besser. ich kenne die Komplexität des Forschungsbaums jetzt natürlich nicht, aber in manchen Spielen erreichen die durchaus einige hundert Elemente. damit sparst du am Ende auch viel Traffic, wenn deine JS Dateien nicht unnötig aufgebläht sind.


    Und das lässt sich ziemlich einfach erreichen, auf verschiedene Wege.


    Um mal ein sehr vereinfachtes Beispiel zu nehmen:
    http://jsfiddle.net/pn7e8bfk/2/


    Deine Lösung mit if/else würde folgendes mehr benötigen:
    Eine ID pro Checkbox, eine ID pro <span>, ein zusätzlicher onChange="" Handler pro Checkbox und drei Zeilen JS pro Checkbox. Mein ganzes JS ist nur 5 Zeilen groß.


    Du brauchst nicht alles in Klassen etc. zu verpacken, um elegant zum Ziel zu kommen. Das was ich da oben gemacht hab geht ähnlich übrigens auch völlig ohne JQuery, allerdings erleichtert dir jQuery vieles, z.B. weil du dich nicht um Browserkompatibilität kümmern musst. JavaScript verwendet übrigens nicht einmal "Klassen" im eigentlichen Sinne, JS ist Prototypen-basiert.


    Zitat

    Klar, Qualität vor Quantität, aber hier ist es umgekehrt besser ... weniger ARbeit, aber volle Funktionalitätgewährleistet und dazu auc noch 100% valider Code, was will man mehr?


    ich denke ich habe gerade gut demonstriert, dass eine gut durchdachte Lösung ohne lange if/else Ketten deutlich weniger Arbeit ist, oder nicht?


    Zitat

    Bedenke bitte, dass ich genau das vermeiden will, sonst kann ich gleich alles auf PHP/MySQL programmieren,


    Was hat sinnvoller, sauber geschriebener Code damit zu tun, welche Programmiersprache man verwendet. Sauberer Code hilft einem in jeder Programmiersprache.

    Das hat nicht viel mit JS zu tun.


    Verschachtelte if/else in der Form wie du sie da benutzt sind - egal in welcher Programmiersprache - Unsinn. Überleg dir, was deine Daten sind (ein Forschungsbaum ist ein Baum...) und mach dir ein geeignetes Datenmodell, und nutze dann das ;)


    Du machst mit JS DOM-Manipulation. Also wirst du schon die DOM-Grundlagen und auch Zugriffe auf Klassen und IDs lernen müssen. Vor allem greifst du ja bereits auf IDs zu.

    Ah ja, das Design wird erst dann kommen, wenn ich alle Grafiken dazu habe, dafür ist auf alle Fälle schon mal die Funktionalität ansatzweise gegeben, es wird nur noch grauenvoller, da ich leider mit if/else anstelle von switch/case arbeiten muss :(.


    Warum überhaupt if/else oder switch/case?


    Das kann man doch viel geschickter lösen. Entwirf dir ein sinnvolles Datenmodell und arbeite darauf. Lange if/else Ketten sind 1960er Jahre Programmierung :(


    Mach dir aus den Forschungen nen Graphen und arbeite damit. Arbeite mit Klassen/IDs. Verwende ggf data- Attribute. Es gibt buchstäblich hunderte besserer Lösungen als lange, möglicherweise geschachtelte if/else-Ketten ;)

    Du solltest jQuery schon richtig benutzen oO


    Außerdem ist dein Markup ziemlich kaputt, jede Menge nicht richtig geschlossene self-closing Tags.


    Du kannst $.ready(callback) oder einfach $(callback) (kürzere Schreibweise) verwenden, um auf das DOmContentLoaded Event zu horchen - das ist im Prinzip wie onload, stellt aber sicher, dass das DOM geladen ist. Besser wärs doch aber, die Seite einfach so zu gastelten, dass alles auf rot ist, wenn noch nichts geklickt wurde? das muss man doch nicht mit JS machen.


    Dann solltest du nicht onclickverwenden, sondern mit $(...).click(callback) die EventListener anmelden. Und die Elemente entweder mit $(...).css(...) umstylen, oder dir Klassen für geklickt/nicht geklickt überlegen und diese mit addClass  / removeClass setzen und entfernen. Und natürlich willst du nicht wirklich auf den click horchen, sondern auf eine Statusänderung bei den Buttons.


    Ich hab dir mal ein Minimalbeispiel fertig gemacht:
    http://jsfiddle.net/pn7e8bfk/

    Hallo,


    alternativ das Netzteil. Ich hatte mal ähnliche Symptome, als das Netzteil defekt war und offenbar nicht mehr ausreichend Spannung geliefert hat.


    ^this


    Graka oder Netzteil. Wenn dein Mainboard auch noch ne onboard-Grafik hat, kannst des recht einfach austesten, indem du den Monitor ans Mainboard anschließt. Is das Bild dann ok, liegts wahrscheinlich an der Graka.


    Nach nem Schaden am Monitor siehts eher nicht aus, wenn sich der Rechner dabei aufgehangen hat. Um das auszuschließen kannst den aber auch einfach kurz an nen anderen Rechner anstöpseln.


    Wenns die Graka ist kann man die recht einfach tauschen, allerdings kann bei solchen Geschichten auch gerne mal das Mainboard auch etwas abbekommen, das sollte auf jeden Fall auch überprüft werden, wenn der Rechner eh ins Geschäft geht. Allerdings ist die Gefahr beim Netzteil größer, dass andere Komponenten in Mitleidenschaft gezogen werden (mir hat nen Netzteil leider mal nen Rechner ganz gut geröstet...)

    Wie gesagt, ich finde das auch etwas unglücklich gelöst. Ich hatte das hier gerade auch - mein Tab war noch lange offen, ich klicke oben auf die Benachrichtigungen. Dadurch sehe ich mich in dem Thema als offline (entgegen obiger Aussage behebt F5 dies allerdings).


    WCF rendert es die Ansicht und aktualisiert dann den eigenen Status. D.h. man sieht bei sich selber immer den Status des letzten Seitenaufrufes, nicht den aktuellen. Für alle anderen Besucher passt das aber immer.


    Im Prinzip passiert hier das Selbe wie in meinem alten PR bemängelt:
    https://github.com/WoltLab/WCF/pull/568


    Das Persitenz-Layer von WCF ist halt bescheuert gebaut. Die Objekte repräsentieren immer nur den Snapshot aus der DB, wenn sie erstellt werden, aktualisierst du ein Objekt so bekommst du erst bei der nächsten Db Abfrage das neue Ergebnis.