jQuery cookies

brunoww22 | 2021-02-17 10:25:20 UTC | #1

Cześć :wave:

Jak mogę zapisać te zmiany poprzez jQuery cookies?

jQuery(document).ready(function() {
    jQuery('#customSwitch1').change(function() {
        if ($(this).prop('checked'))
        {
            $('body').addClass('elegant-color');
            $('body').removeClass('morpheus-den-gradient');
        }
        else
        {
            $('body').removeClass('elegant-color');
            $('body').addClass('morpheus-den-gradient');
        }
    });
});

To rozwiązanie (poniżej) nie działa, czyli wnioskuję, że jest niepoprawne, albo coś robię nie tak.

Cookies.set("bodyclass", "bg_save");


jQuery(document).ready(function() {
    jQuery('#customSwitch1').change(function() {
        if ($(this).prop('checked'))
        {
            $('body').addClass('elegant-color');
            $('body').removeClass('morpheus-den-gradient');
        }
        else
        {
            $('body').removeClass('elegant-color');
            $('body').addClass('morpheus-den-gradient');
            $("body").addClass(Cookies.get("bodyclass"));
        }
    });
});

jQuery mam podpięte, przed js-cookie.


Nieznajomy11 | 2020-10-05 03:56:44 UTC | #2

Jeśli chcesz zapisać rodzaj tła, musiałbyś w ciastku zapisywać, jaki to i przy ładowaniu się strony sprawdzać właśnie stan tego ciastka. Obecnie jedynie zapisujesz stały ciąg znaków i dalej go i tak ignorujesz.


brunoww22 | 2020-10-05 03:58:39 UTC | #3

Dziękuję za naprowadzenie.


brunoww22 | 2020-10-05 04:06:31 UTC | #4

Prosiłbym jednak o więcej wskazówek, jeśli chodzi o kod, gdyż zaczynam dopiero z jQuery, a tym bardziej z cookies.


Wright | 2020-10-05 04:35:16 UTC | #5

jQuery(document).ready(function() {
    if (!Cookie.get("bodyclass")) {
        Cookies.set("bodyclass", "bg_save");
    }
    $("body").addClass(Cookies.get("bodyclass"));
    jQuery('#customSwitch1').change(function() {
        if ($(this).prop('checked'))
        {
            Cookies.set("bodyclass", "elegant-color");
            $('body').addClass('elegant-color');
            $('body').removeClass('morpheus-den-gradient');
        }
        else
        {
            Cookies.set("bodyclass", "morpheus-den-gradient");
            $('body').removeClass('elegant-color');
            $('body').addClass('morpheus-den-gradient');
        }
    });
});

brunoww22 | 2020-10-05 07:19:02 UTC | #6

Cookie is not defined, tutaj if (!Cookie.get("bodyclass")) {

A jest zdefiniowane powyżej w taki sposób Cookies.set("bodyclass", "bg_save");


Nieznajomy11 | 2020-10-05 16:26:32 UTC | #7

To literówka, powinno być po prostu Cookies zamiast Cookie. Dodatkowo uważam, że całość kodu nie spełnia założeń, bo poza zapisywaniem, które jest, brakuje tam ładowania. Sam fragment z pierwszym ifem jest też do zakwestionowania, po co się on tam znajduje, chyba że czegoś nie rozumiem.


Wright | 2020-10-05 16:38:51 UTC | #8

[quote=”Nieznajomy11, post:7, topic:16306”]
ifem jest też do zakwestionowania, po co się on tam znajduje
[/quote]

Jeśli ktoś przykładowo wejdzie pierwszy raz na strone i nie bedzie miał tego ciasteczka to:

$("body").addClass(Cookies.get("bodyclass"));

Wypluje undefined


Nieznajomy11 | 2020-10-05 19:53:49 UTC | #9

Pomijając, że addClass zwyczajnie ignoruje wtedy undefined, przynajmniej w wersji jquery której używam, w takim razie czemu po prostu nie zrobić:

if (Cookies.get("bodyclass") !== undefined) {
  $("body").addClass(Cookies.get("bodyclass"));
}

Lub nawet lepiej:

var bodyClassCookie = Cookies.get("bodyclass");
if (bodyClassCookie !== undefined) {
  $("body").addClass(bodyClassCookie);
}

Ustawianie ciasteczka tylko dlatego, że ktoś nie wybrał koloru strony, wydaje się bardzo zbędne.


brunoww22 | 2020-10-05 18:08:50 UTC | #10

Zrobiłem tak jak napisałeś i wciąż ustawia ciasteczko jeśli nie wybiorę koloru strony.

Cookies.set("bodyclass", "bg_save");

jQuery(document).ready(function() {
    var bodyClassCookie = Cookies.get("bodyclass");
    if (bodyClassCookie !== undefined) {
      $("body").addClass(bodyClassCookie);
    }
    $("body").addClass(Cookies.get("bodyclass"));
    jQuery('#customSwitch1').change(function() {
        if ($(this).prop('checked'))
        {
            Cookies.set("bodyclass", "elegant-color");
            $('body').addClass('elegant-color');
            $('body').removeClass('morpheus-den-gradient');
        }
        else
        {
            Cookies.set("bodyclass", "morpheus-den-gradient");
            $('body').removeClass('elegant-color');
            $('body').addClass('morpheus-den-gradient');
        }
    });
});

I jak bylibyście na tyle uprzejmi, aby mi powiedzieć jak wczytać teraz po załadowaniu strony zapisane ciasteczko, będę dozgonnie wdzięczny :)


brunoww22 | 2020-10-05 19:54:54 UTC | #11

Za duzo dzisiaj w kodzie i już nie myśle, przeciez na samej górze ustawiałem ciastko, usunąłem tę linikję wszystko ładnie działa dziękuje za pomoc.

Edit: Jeszcze jeden mały problem, jak mogę zapisać stan checkboxa? Metodą prób i błędów nie udało mi się do tego dojść.


Nieznajomy11 | 2020-10-12 16:27:24 UTC | #12

Musisz przy ładowaniu strony sprawdzać, jakie jest ciastko (w tym pierwszym ifie) i zmienić stan checkboxa “ręcznie”, np. tak:

if (bodyClassCookie === "elegant-color") {
    $('#customSwitch1').prop('checked', true);
}

Generalnie sporo można by poprawić. Między innymi zapisywać na górze w funkcji ready rozwiązania elementów pobieranych przez $/jQuery i potem wykorzystywać już zmienne:

$body = $("body");
$customSwitch = $("#customSwitch1");

I wtedy w ten sposób (nie, to nie jest działający kod, tylko fragmenty):

$customSwitch.change(...)
$body.addClass/removeClass(...)

Jeszcze prawie czysto estetycznie, to też zdecydować się i używać albo jQuery(…) (lepsza kompatybilność) albo bardziej popularnego $(…). Mieszanie w teorii działa, ale nie wygląda najlepiej.


brunoww22 | 2020-10-06 12:41:26 UTC | #13

Dzięki, jak będę miał chwilę to zrobię tak jak mówisz. I dam znać czy wyszło oraz dziala tak jak chcę.

Edit:
Dziękuje bardzo, wszystko ładnie śmiga.
I mam jeszcze ostatnie pytanie. W jaki sposób mógłbym zapisać w ciastku więcej klas? Nie robiąc tak jak poniżej.
Edit2: poprawa kodu
Edit3: kolejna poprawa kodu

$(document).ready(function() {

    $body = $("body");
    $card = $(".card");
    $customSwitch = $("#customSwitch1");

    var bodyClassCookie = Cookies.get("bodyclass");
    var cardClassCookie = Cookies.get("cardclass");
    if (bodyClassCookie && cardClassCookie !== undefined) {
      $body.addClass(bodyClassCookie);
      $card.addClass(cardClassCookie);
    }
    if (bodyClassCookie === "elegant-color" || bodyClassCookie === undefined) {
        $customSwitch.prop('checked', true);
    }
    else
    {
        $customSwitch.prop('checked', false);
    }
    $body.addClass(Cookies.get("bodyclass"));
    $card.addClass(Cookies.get("cardclass"));
    $customSwitch.change(function() {
        if ($(this).prop('checked'))
        {
            Cookies.set("bodyclass", "elegant-color");
            Cookies.set("cardclass", "grey darken-4");
            $body.removeClass('morpheus-den-gradient');
            $body.addClass('elegant-color');
            $card.removeClass('winter-neva-gradient');
            $card.addClass('grey darken-4');
        }
        else
        {
            Cookies.set("bodyclass", "morpheus-den-gradient");
            Cookies.set("cardclass", "winter-neva-gradient");
            $body.removeClass('elegant-color');
            $body.addClass('morpheus-den-gradient');
            $card.removeClass('grey darken-4');
            $card.addClass('winter-neva-gradient');
        }
    });
});

brunoww22 | 2020-10-07 17:33:23 UTC | #14

Odświeżam


Wright | 2020-10-07 20:36:13 UTC | #15

Zapisuj sobie w ciasteczku np. “customStyle” => “dark”, potem zrób ifa, który sprawdza wartość w ciasteczku i jak jest np. “dark” to dodaje do cardów/navów/body jakaś tam klasę


system | 2021-02-17 10:31:44 UTC | #16

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.