Strona wyświetla się w ramach kontrolera static_pages_controller.
Prosta sprawa po kliknięciu w napis lub kwadrat powinien pokazac sie drugi kwadrat. Z tego co czytałem static_pages.coffee powinien automatycznie się załadować i działać … Ktoś pomoże mi rozwiązać ten problem.
O tym czy plik się ładuje czy nie przekonasz się łatwo wpisując w pierwszej linii static_pages,coffee jakiegoś console.log czy alert.
Na pewno bindujesz się do clicka gdy element #button jest JUŻ w html a nie ZANIM do niego trafi?
Załaduj stronę i w konsoli JS wpisz $('#button').click(function(e) { $("#object").slideToggle('slow'); } ) i wtedy kliknij w tego buttona.
Może idę w złą stronę, ale to może być wina turbolinksów też. One bardzo nie lubią jak się używa zdarzeń na obiektach wprost, zazwyczaj lepszym rozwiązaniem jest delegowanie ich przez document:
Takie zdelegowanie akcji powinno rozwiązać problem tego czy element jest, czy go nie ma w momencie ładowania JSa, co więcej będzie on dalej działał kiedy body zostanie podmienione przez Turbolinks.
I punkt dla paweljw działa nie rozumiem jeszcze o co tu chodzi ale działa !!! więc jest dobrze. Mógłbyś jakoś rozwinąć może na czym polega różnica ??? Bo chciałbym to lepiej zrozumieć
Jeśli znasz konstrukcje JSa ale masz problem z ich przetłumaczeniem na CoffeeScript, polecam to jeśli jeszcze nie czytałeś: https://css-tricks.com/jquery-coffeescript/ szybka referencja jak przełożyć typowe wyrażenia w JS + jQuery na Coffee.
Edit: spieszę wyjaśnić
Kiedy normalnie przeładowuje Ci się strona w przeglądarce, leci zdarzenie ready na document. Wszystkie skrypty z body są wykonywane i jest cacy, a zdarzenia click możemy podpinać w document:ready, bo wtedy już te elementy do których je podpinamy istnieją.
Jajko kwadratowe się zaczyna jak mamy Turbolinks, bo one nie przeładowują strony per se. One robią w tle zapytanie AJAXowe udające “kliknięcie w link”, po czym podmieniają body strony na to z odpowiedzi serwera (podmieniają też parę innych rzeczy - między innymi tag title). Wtedy zdarzenie document:ready nie wypala. W konsekwencji wszystko co mięliśmy podpięte przez np takie zwykłe click też nie wypala, bo element nie istnieje.
Kiedy pisze się z tą delegacją przez body, nie zakładamy listenera na obiekt który może nam zeżreć (po przeładowaniu turbolinksami na przykład), tylko listener leci na samo body, które nam nie zniknie. Dopiero body szuka “w sobie” selektora zgodnego z drugim parametrem do funkcji .on() i wykonuje w jego kontekście funkcję podaną jako trzeci parametr.
Tak jeszcze na marginesie, turbolinks generują zdarzenie po “przeładowaniu” nimi strony, ale nie jest to document ready. Możesz skorzystać z wydarzenia
Spróbuj się też przegryźć przez dokumentację turbolinks, a przynajmniej przez sekcję Events: https://github.com/rails/turbolinks Turbolinksy to patent z potencjałem, ale normalnemu użytkowaniu jQuery wsadza kij w szprychy. Trzeba pokochać albo wyrzucić z projektu, jedno z dwóch
Przypisuje zdarzenie do elementu strony. Nie działa dla turbolinków i Ajaxa bo elementu do którego chciałbyś przypisać zdarzenie nie ma jeszcze na stronie w momencie wykonywania skryptu.
Dla turbolinków (i w ogóle elementów ładowanych Ajaxem):
Zdarzenie jest przypisane do dokumentu (który zawsze jest obecny). Po wyłapaniu zdarzenia sprawdzane jest którego obiektu bezpośrednio dotyczyło (tutaj ‘#button’).
Sugerowałbym zacząć od zapoznania się z jQuery, bo to raczej tutaj tkwi problem w zrozumieniu. Turbolinki to zwykły Ajax, tyle że sprytnie wykorzystany
Ok chce pójść dalej i wykorzystać tę wiedzę, problem wygląda tak: na stronie generowane są div-y o id “show_comment” które mają css display:none, potem “comment_create” też display: none, a następnie dodawane są przyciski “show_comment_button” i “create_comment_button”, całość jest w div-ie “announcement”, chcę napisać skrypt który po naciśnięciu danego przycisku spowoduje pokazanie się tylko poprzedzającego go odpowiedniego diva.
Po pierwsze, jeśli masz czegoś więcej niż jedno, to nie operuj id, tylko klasami, bo inaczej jQuery się popierniczy o który element Ci chodzi (standard mówi, że ID jest unikalnym identyfikatorem danego elementu w jego “domowym poddrzewie” - jakkolwiek dziwnie to nie brzmi, w tłumaczeniu na ludzki chodzi o unikalność w obrębie aktualnie renderowanego HTMLa).
Druga sprawa - prev() wybiera Ci tylko natychmiastowo najbliższy poprzedni element z rodzeństwa aktualnego elementu, więc mając
Używając $('.trzy').prev() możemy się dostać tylko i wyłącznie do diva o klasie “dwa”, nie do jeden. Rozwiązaniem tego problemu jest prevAll(), która zwraca całe poprzedzające dany element rodzeństwo. Oczywiście w naszym przypadku nie chcemy wszystkich poprzedzających elementów, tylko konkretnie najbliższego diva o danej klasie, więc na przykładzie powyżej, żeby dostać się do diva o klasie jeden moglibyśmy napisać $('.trzy').prevAll('div.jeden:first') - to nam daje gwarancję że zawsze będzie to najbliższy div o danej klasie.
Tu masz demo jak mógłbyś użyć tego w swoim przypadku: http://jsfiddle.net/vkrqehwt/. Przepisanie tego na CoffeeScript pozostawiam jako tak zwane łatwe ćwiczenie dla czytelnika
Zadanie odrobione świetna sprawa, w mojej nauce Raisów często pomijałem JS, bo bez CSS strony nie będzie a bez JS jakoś to będzie, teraz wychodzą moje braki na tym polu… nic trza ponadrabiać braki będzie.