Problem mit jQuery, Bootstrap-JS und eigenem JS-Script

  • Huhu Ihr Lieben,


    ich bin gerad am verzweifeln.


    Ich habe hier folgende HTML 5 - jQuery/Bootstra (CSS/JS) Seite im Bau, die den Forge of Empires Forschungsbaum später einmal darstellen soll:



    Natürlich hab ich alle Forschungen bereits in meiner Version drinn, jedoch reicht der Teil für mein Problem aus.


    Wenn die Seite geladen wurde, kann man die Buttons nutzen, um die Forschung auf true/false zu setzen, was dann entweder in einem gelben oder grünen Hintergrund resultieren sollte.
    Sobald ich auch nur ansatzweise jQuery und/oder Bootstrap dadurch nutze/anspreche, geht der Spaß nicht.


    Lasse ich jQuery/Bootstrap raus, dann funktioniert das ehemalige Script:



    Verwende ich jedoch auch nur eines der beiden JS-Frameworks und leider braucht Bootstrap-JS das zuvor eingebundene jQuery-Framework, dann kann ich mein Vorhaben vergessen, zudem bleibt dadurch der per <input type="radio" ... erzeugte und durch das Bootstrap-CSS zum Button veränderte Radio-Input nicht mehr aktiv, sprich, der gedrückte "Button" bleibt in diesem Fall nicht mehr gedrückt.


    Wie also kann ich dem ganzen jetzt mitteilen, wenn Button XY gedrückt ist, färbe mir gefälligst den Hintergrund von DIV YX anhand des DIV-ID-Attributs BLA? Das kann doch nicht so schwer sein oder?
    Ich hab natürlich, wie damals zu WBB3 Zeiten, den noConflict - Mode versucht ... Pustekuchen.


    Bleibt mir also nur zu hoffen, dass ich eventuell hier die Lösung bekomme, nach der ich aktuell seit 4h am Suchen bin :/ .


    Was natürlich nicht schlecht wäre, wäre am Ende noch eine function onLoad(), um beim Laden der Seite alle Forschungen auf rot zu setzen.


    Gruß
    Chaos234

    Die ganze Welt ist ein Zoo und das darin befindliche Tier ist der Mensch.


    (Von mir selbst entwickelt)

  • 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/

  • Vielen Dank für deine Hilfe Netzwerg.


    Allerdings muss ich dir widersprechen, mit dem Bezug auf nicht geschlossene self-closing Tags. In HTML 5 kommt kein abschließender /, das war nur bei XHTML so gewesen, andernfalls wirft der Validator mir eins um die Ohren ^^ .


    Ich habe ja den Fehler auch mit deiner Lösung gehabt, weil ich noch die Bootstrap.min.js geladen hatte, welche ich aber nun gekickt habe.


    Nach dem ich nun deine Überlegung mit Google verbunden haben, ist dabei folgendes raus gekommen: https://deltanet-production.de/foe/
    Aktuell geht das ganze nur bis zur Forschung Das Rad, der QC ist jedoch 100% valide.


    Kannst dich an den Buttons ja mal quer Beet auslassen :).


    Auch hast du damit Recht, wenn ich alles vorher schon per CSS rot färbe, aktuell hängt es noch im JS-Script-Tag drinn, werde ich jedoch, wie auch alle anderen CSS-Deklarationen, aus den einzellnen Tags verbannen und schön brav in eine externe CSS-Datei packen, selbiges gilt für den JS-Script-Tag, sobald dieser fertiggestellt ist.


    Wenn Du noch weitere Verbesserungsvorschläge hast, lass es mich wissen :).
    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 :(.

    Die ganze Welt ist ein Zoo und das darin befindliche Tier ist der Mensch.


    (Von mir selbst entwickelt)

  • Allerdings muss ich dir widersprechen, mit dem Bezug auf nicht geschlossene self-closing Tags. In HTML 5 kommt kein abschließender /, das war nur bei XHTML so gewesen, andernfalls wirft der Validator mir eins um die Ohren .


    HTML5 unterstützt auch die XHTML-Schreibweise zu mal auch laut SGML ein <tag /> zulässig ist. ;)


  • HTML5 unterstützt auch die XHTML-Schreibweise zu mal auch laut SGML ein <tag /> zulässig ist. ;)


    Ah ok, naja, dann ist es ja so gesehen schnuppe, wenn beide Versionen den Validator nicht ärgern ^^ .

    Die ganze Welt ist ein Zoo und das darin befindliche Tier ist der Mensch.


    (Von mir selbst entwickelt)

  • 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 ;)

  • Dann müsste ich mich erst durch den ganzen Krams lesen und darauf hab ich kein Bock, wenn ich ehrlich bin.
    Ich hab mit if/else bereits begonnen und die Strucktur weitgehenst so aufgestellt, dass es nicht zu viele Ver-
    schachtelungen sind. Aber ohne if/else sehe ich da leider keine andere Möglichkeit, denn mit JS habe ich mich so
    gut wie nie im Leben beschäftigt.


    Liegt daran, dass ich mir nur das aus dem Netz hole, was ich brauche, ohne Rücksicht auf Grundlagen oder dergleichen.
    Und jetzt noch für so eine lapidare Seite auf Klassen/IDs zurückzugreifen ... das soll was simples werden und kein
    hochkarätiges WBB/WCF-Plugin ;).


    Wie gesagt, ich nehm gern verbesserte Snippets entgegen, ferner ich diese auch verstehe. Denn, da es nicht in PHP ist,
    kann ich auch nicht mit einem Mix aus MySQL und PHP-Klassen arbeiten, dass wäre um einiges einfacher, aber sicherlich
    sinnloser oder?

    Die ganze Welt ist ein Zoo und das darin befindliche Tier ist der Mensch.


    (Von mir selbst entwickelt)

  • 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.

  • Ja, auf die IDs im HTML-Code.


    DOM-Grundlagen? Sagt mir nichts, bin ich auch ehrlich gesagt nicht drann interessiert.
    Warum alles immer so kompliziert machen, wenn man es mit if/else auch erreichen kann?


    Ich habe auf das volle Bootstrap verzichtet und nur das Modal-Plugin genommen, was aber
    auch seinen Dienst irgendwie verweigert, denn selbst mit der Anweisung data-dismiss="modal"
    geht das Modal nicht zu, also habe ich nen href zur eigenen Seite implementiert und obiges
    einfach entfernt. Läd zwar die seite komplett neu, aber was solls.


    Ich kann eh kein Bootstrap-JS nutzen, weil sonst mein gesamtes JS nicht mehr funktioniert, da Bootstrap
    irgendetwas überschreiben tut, keine Ahnung was, aber es tut's auf jeden Fall.


    Gut, also nur mit jQuery arbeiten ... bei 444 Options nicht gerad wenig, das wird nen großes JS bei meiner
    Vorliebe zu if/else und mal ehrlich gefragt ... ich wüsste nicht, wie ich hier via DOM-Grundlagen besser
    drann wäre.


    Ich halte grundsätzlich nicht viel von JS, weils angreifbar ist, ebenso wie Flash. Bleibe ich bei den simplen
    if/else, sollte nix passieren. Würde ich jetzt aber alles in ein paar dutzend Klassen packen ... zu viel Arbeit.


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


    Wenn du natürlich willst, kannst du mir gern ein Beispiel geben, ich halt nicht viel von Theroie, ich lern lieber
    direkt beim arbeiten, also Code anschauen und entweder ich raff es oder nicht (dann hab ich pech).


    Gegenfrage ... was ist an meinem if/else jetzt so schlimm? Dass es nicht den DOM-Grundlagen oder dem OOP
    entspricht und nur "dahingeschmissener Spaghetticode" ist oder nur deshalb, weils mit Klassen ebenso lösbar ist?
    Bedenke bitte, dass ich genau das vermeiden will, sonst kann ich gleich alles auf PHP/MySQL programmieren,
    was ich so (noch) nciht vor hatte.


    Ich wollte zu beginn nur nen interaktiven FB machen, später mal dann nen Login und pro Welt nen speicherbaren FB,
    aber das hat noch lange Zeit, muss ja auch von deren Community angenommen werden.


    So viel dazu ... nebenbei gesagt ... jede Hilfe ist herzlich willkommen :)

    Die ganze Welt ist ein Zoo und das darin befindliche Tier ist der Mensch.


    (Von mir selbst entwickelt)

  • 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.