Jump to content
Angel96

Switch Color

Recommended Posts

Salut!

Am un script, si nu stiu cum sa fac o chestie la el.

<script type='text/javascript'>
    function changeBack()
    {
        var back = document.getElementById('colorPicker').value;    
        document.getElementById('content_box').style.background = back ;
    }    
      </script> 

<select id="colorPicker" onchange="JavaScript:changeBack()">
    <option value="transparent">None</option>
    <option value="yellow">Yellow</option>
    <option value="salmon">Salmon</option>
    <option value="lightblue">Light Blue</option>
    <option value="limegreen">Lime Green</option>
    <option value="cyan">Cyan</option>
    <option value="violet">Violet</option>
    <option value="red">Red</option>
</select>

Unde scrie content_box acolo este ID a unui block sau a oricui DIV.

Scriptul consta din aceea ca sa skimbe culoarea unui block sau a unui DIV cu elementul ID

Scriptul merge bine, cind imi aleg culoarea respectiva pe care o doresc se skimba, dar nu se salveaza sa fie tot aceeasi culoare pe care am aleso.

Ca sa intelegeti mai bine, de exemplu: Vrea ca blockul respectiv pe care lam ales sa fie de culoarea Violet, dupa ce miam ales culoarea, blockul sa skimbat in Violet, si iata acum si problema mea apare pe care doresc sa o rezolv. Dupa ce miam schimbat culoarea blockului dau un restart la pagina si culoarea numai este, se schimba in cea default. Eu doresc ca dupa ce miam ales culoarea respectiva tot ea sa ramina, pina nu voi dori sa chimb alta culoare.

Sper ca mati inteles ce deresc.

Edited by Angel96
Link to comment
Share on other sites

4 hours ago, theandruala said:

Din ce am inteles, tu vrei ca schimbarea sa îți rămâna Constanța. Deci trebuie sa stochezi ceea ce vrei tu undeva. Folosind js, cam orice fsci persista pana la refresh. Încearcă sa stochezi în cookie, și sa iei de acolo când intri pe pagina. 

da asta doresc, dar nustiu cum sa stochez in cookie...

Link to comment
Share on other sites

31 minutes ago, Angel96 said:

nimik nu am inteles ce scrie acolo

Daca tu nu intelegi asta:

 

Create a cookie, valid across the entire site:

Cookies.set('name', 'value');

Create a cookie that expires 7 days from now, valid across the entire site:

Cookies.set('name', 'value', { expires: 7 });

Create an expiring cookie, valid to the path of the current page:

Cookies.set('name', 'value', { expires: 7, path: '' });

Atunci e o problema f mare, nu vreau sa fiu heitar, dar pune in plm mana si ruleaza alea sa vezi ce se intampla.

  • Upvote 1
Link to comment
Share on other sites

36 minutes ago, Angel96 said:

ma ajuta cineva?

Nu prea cred ca te ajuta nimeni. Daca tu nu esti in stare sa citesti un readme sau sa scrii un 

<script src="/path/to/js.cookie.js"></script>

ce kk de proiect vrei sa faci tu acolo?

Dai copy paste la tot ce prinzi de pe stackoverflow si dupa te plangi ca nu merge si sa-ti rezolvam noi?

 

Nu asa se face treaba. Pune mana si invata lucruri mai simple intai, si dupa faci "scripturi" deastea.

 

Bafta!

 

https://www.w3schools.com/html/

https://www.w3schools.com/js/default.asp

  • Upvote 2
Link to comment
Share on other sites

3 hours ago, Gecko said:

Nu ai nevoie de libs pentru cookies. Foloseste localStorage care vine by default in toate browserele recente.

 

Cand alegi culoarea, o retii prin localStorage:


localStorage.setItem('myColor', 'culoarea aici');

Cand incarci pagina, verifici daca a fost salvata anterior in localStorage, astfel:


var color = localStorage.getItem('myColor') || '#fff';

#fff va fi culoarea default daca n-a fost setat. Daca a fost setat, vei avea culoarea in "color". Pe baza variabilei o aplici pe div sau unde vrei tu.

nu mi sa primit nimic, posibil nu am facut cum trebuie.

Link to comment
Share on other sites

6 hours ago, Angel96 said:

nu mi sa primit nimic, posibil nu am facut cum trebuie.

Cum ai făcut?
Încearcă ca imediat după ce s-a încărcat pagina să verifici dacă variabila din localStorage propusă de Gecko, conține culoare. Asta deoarece funcția ta este apelată doar atunci când alegi ceva din acel select, nu și când se-ncarcă pagina, prin urmare culoarea nu are cum să fie schimbată.

Funcția changeBack ar trebui să arate în felul următor:

const changeBack = () => {
  	  // Aici luamm o culoare
	  let back = document.getElementById('colorPicker').value;
  	  // Aici stocam culoarea in localStorage sub denumirea 'myColor'
  	  localStorage.setItem('myColor', String(back));
  	  // Aici setăm culoarea unui element cu valoarea aleasă
      document.getElementById('content_box').style.background = back;
}

Până în acest punct ceea ce ai făcut a fost că ai stocat o culoare în LocalStorage, mai departe trebuie să iei culoarea respectivă după ce s-a încărcat pagina și să o setezi pe un element. Pentru asta, poți de exemplu să asculți event-ul onLoad pe <body>. Ex: <body onload="functiaMea()" 
Iar functiaMea() poate să fie ceva de acest gen:

const functiaMea = () => { 
	// Aici iau culoarea precedenta din localStorage, iar dacă una precedenta nu există se va returna codul pentru culoarea albă
	const culoareaPrecedenta = localStorage.getItem('myColor') || '#fff';

	// Aici schimb culoarea 
	document.getElementById('content_box').style.background = culoareaPrecedenta
}


Ca și bonus:
Am să asum că ești începător, și mă gândesc că modul în care Gecko verifică culoarea precedentă te pune în confuzie și ți se pare criptic, mă refer la: 
 

const culoareaPrecedenta = localStorage.getItem('myColor') || '#fff';

Aici pornește de la faptul că funcția getItem() ce aparține de LocalStorage, returnează false sau true în funcție de dacă a găsit cheia respectiva ( 'myColor' ) sau nu. Mai departe, pe baza acestui lucru poți face diferite verificări. @Gecko a ales să se folosească de modul în care expresiile sunt evaluate în JavaScript, și să folosit de operatorul OR ( || ) ca să scrie asta mai pe surt.

Ca să-ți faci o idee, expresia de mai sus se poate scrie și sub forma:
 

let culoareaPrecedenta = null;

if( localStorage.getItem('myColor') === true ) {
	culoareaPrecedenta = localStorage.getItem('myColor');
} else {
  return '#fff' 
}

// În JavaScript condițiile din if sunt toate "transformate" în booleans ( true or false ) prin urmare dacă dorești să verifici dacă ceva e adevarat, poți să renunti la " === true ",
// iar if statement-ul tău poate să fie și în modul:
if( localStorage.getItem('myColor') ) { // do stuff } 


Totuși e cam lunguiața, deci o variantă mai scurtă ar fi folosind shorthand if statements aka așa:

// În prima fază verifici dacă există o culoare, în a 2-a fază dacă există o returnezi, dacă nu returnezi culoarea albă
let culoareaPrecedenta = localStorage.getItem('myColor') === true ? localStorage.getItem('myColor') : '#fff';

// Totuși, ții minte ce am spus mai sus legat de evaluarea expresiilor? Ea poate să fie scrisă și mai scurt așa:
let culoareaPrecedenta = localStorage.getItem('myColor') ? localStorage.getItem('myColor') : '#fff';

Știind aceste lucruri, poți să te folosești de modul în care expresiile din stânga și dreapta operatoriilor sunt evaluate și să ajungi la varianta originală care este una scurtă. În cazul operatorului OR ( || ) condițile din stânga și dreapta lui sunt evaluate la True sau False.
Și la nivel fundamental, la executare o să ajungi să ai ceva de acest gen:
 

let color = localStorage.getItem('myColor') || '#fff';

// Aici e posibil ca funcția getItem să returneze False, by default în JavaScript orice String este evaluat ca și True.
// Prin urmare dacă culoarea ta nu este găsită se va ajunge la ceva de genul:

let color = false || "#fff"

// Mai departe, având în vedere că operatorul OR păstrează doar condițiile adevărate ( TRUE ), iar string-urile sunt TRUE, se va ajunge la:

let color = "#fff";

Iar dacă ar fi ca localStorage să conțina o valoare adevărată,  atunci s-ar ajunge la true || true, iar având în vedere că în JavaScript expresiile sunt executate de la stânga la dreapta, se va păstra ce este în partea stângă a operatorului.

În acest mod, poți face tot felul de chestii cu operatori, să zicem că dacă dorești ca atunci când nu există o culoare precedentă, să nu faci nimic. Ei bine poți să te folosești de operatorul AND ( && ) pentru asta și să faci ceva de genul:

let color = localStorage.getItem('myColor') && localStorage.getItem('myColor');

 

Prin treaba de mai sus, color o să fie setat 'undefined' în functie de dacă există sau nu o culoare setată înainte ;)

Poți să-mi scrii dacă ai nevoie cu ajutor legat de JavaScript în general.

Spor! 

 

Edited by c3m3d3
Link to comment
Share on other sites

4 hours ago, c3m3d3 said:

Cum ai făcut?
Încearcă ca imediat după ce s-a încărcat pagina să verifici dacă variabila din localStorage propusă de Gecko, conține culoare. Asta deoarece funcția ta este apelată doar atunci când alegi ceva din acel select, nu și când se-ncarcă pagina, prin urmare culoarea nu are cum să fie schimbată.

Funcția changeBack ar trebui să arate în felul următor:


const changeBack = () => {
  	  // Aici luamm o culoare
	  let back = document.getElementById('colorPicker').value;
  	  // Aici stocam culoarea in localStorage sub denumirea 'myColor'
  	  localStorage.setItem('myColor', String(back));
  	  // Aici setăm culoarea unui element cu valoarea aleasă
      document.getElementById('content_box').style.background = back;
}

Până în acest punct ceea ce ai făcut a fost că ai stocat o culoare în LocalStorage, mai departe trebuie să iei culoarea respectivă după ce s-a încărcat pagina și să o setezi pe un element. Pentru asta, poți de exemplu să asculți event-ul onLoad pe <body>. Ex: <body onload="functiaMea()" 
Iar functiaMea() poate să fie ceva de acest gen:


const functiaMea = () => { 
	// Aici iau culoarea precedenta din localStorage, iar dacă una precedenta nu există se va returna codul pentru culoarea albă
	const culoareaPrecedenta = localStorage.getItem('myColor') || '#fff';

	// Aici schimb culoarea 
	document.getElementById('content_box').style.background = culoareaPrecedenta
}


Ca și bonus:
Am să asum că ești începător, și mă gândesc că modul în care Gecko verifică culoarea precedentă te pune în confuzie și ți se pare criptic, mă refer la: 
 


const culoareaPrecedenta = localStorage.getItem('myColor') || '#fff';

Aici pornește de la faptul că funcția getItem() ce aparține de LocalStorage, returnează false sau true în funcție de dacă a găsit cheia respectiva ( 'myColor' ) sau nu. Mai departe, pe baza acestui lucru poți face diferite verificări. @Gecko a ales să se folosească de modul în care expresiile sunt evaluate în JavaScript, și să folosit de operatorul OR ( || ) ca să scrie asta mai pe surt.

Ca să-ți faci o idee, expresia de mai sus se poate scrie și sub forma:
 


let culoareaPrecedenta = null;

if( localStorage.getItem('myColor') === true ) {
	culoareaPrecedenta = localStorage.getItem('myColor');
} else {
  return '#fff' 
}

// În JavaScript condițiile din if sunt toate "transformate" în booleans ( true or false ) prin urmare dacă dorești să verifici dacă ceva e adevarat, poți să renunti la " === true ",
// iar if statement-ul tău poate să fie și în modul:
if( localStorage.getItem('myColor') ) { // do stuff } 


Totuși e cam lunguiața, deci o variantă mai scurtă ar fi folosind shorthand if statements aka așa:


// În prima fază verifici dacă există o culoare, în a 2-a fază dacă există o returnezi, dacă nu returnezi culoarea albă
let culoareaPrecedenta = localStorage.getItem('myColor') === true ? localStorage.getItem('myColor') : '#fff';

// Totuși, ții minte ce am spus mai sus legat de evaluarea expresiilor? Ea poate să fie scrisă și mai scurt așa:
let culoareaPrecedenta = localStorage.getItem('myColor') ? localStorage.getItem('myColor') : '#fff';

Știind aceste lucruri, poți să te folosești de modul în care expresiile din stânga și dreapta operatoriilor sunt evaluate și să ajungi la varianta originală care este una scurtă. În cazul operatorului OR ( || ) condițile din stânga și dreapta lui sunt evaluate la True sau False.
Și la nivel fundamental, la executare o să ajungi să ai ceva de acest gen:
 


let color = localStorage.getItem('myColor') || '#fff';

// Aici e posibil ca funcția getItem să returneze False, by default în JavaScript orice String este evaluat ca și True.
// Prin urmare dacă culoarea ta nu este găsită se va ajunge la ceva de genul:

let color = false || "#fff"

// Mai departe, având în vedere că operatorul OR păstrează doar condițiile adevărate ( TRUE ), iar string-urile sunt TRUE, se va ajunge la:

let color = "#fff";

Iar dacă ar fi ca localStorage să conțina o valoare adevărată,  atunci s-ar ajunge la true || true, iar având în vedere că în JavaScript expresiile sunt executate de la stânga la dreapta, se va păstra ce este în partea stângă a operatorului.

În acest mod, poți face tot felul de chestii cu operatori, să zicem că dacă dorești ca atunci când nu există o culoare precedentă, să nu faci nimic. Ei bine poți să te folosești de operatorul AND ( && ) pentru asta și să faci ceva de genul:


let color = localStorage.getItem('myColor') && localStorage.getItem('myColor');

 

Prin treaba de mai sus, color o să fie setat 'undefined' în functie de dacă există sau nu o culoare setată înainte ;)

Poți să-mi scrii dacă ai nevoie cu ajutor legat de JavaScript în general.

Spor! 

 

Totusi nu ramine Constanta dupa restart al paginei.

Link to comment
Share on other sites

4 hours ago, Angel96 said:

Totusi nu ramine Constanta dupa restart al paginei.

Dacă folosești Chrome, în Developer Tools poti vedea acolo ce ai în Local Storage. Apasă F12, apoi du-te la tab-ul Application, iar în stânga o să-ți apară "Storage". Sub Storage o să ai Local Storage cu mai multe site-uri, caută site-ul tău și deschide-l. Mai departe de acolo ai să vezi toate cheiile și valoriile din LocalStorage setate de respectivul site, în cazul tău trebuie să apară ceva cu cheia "MyColor" și o anumită valoare. Rămâi cu consola deschisă atunci când schimbi culoarea și vezi dacă se adaugă ceva acolo sau nu. 

Link to comment
Share on other sites

2 hours ago, c3m3d3 said:

Dacă folosești Chrome, în Developer Tools poti vedea acolo ce ai în Local Storage. Apasă F12, apoi du-te la tab-ul Application, iar în stânga o să-ți apară "Storage". Sub Storage o să ai Local Storage cu mai multe site-uri, caută site-ul tău și deschide-l. Mai departe de acolo ai să vezi toate cheiile și valoriile din LocalStorage setate de respectivul site, în cazul tău trebuie să apară ceva cu cheia "MyColor" și o anumită valoare. Rămâi cu consola deschisă atunci când schimbi culoarea și vezi dacă se adaugă ceva acolo sau nu. 

 

 

Link to comment
Share on other sites

Perfect! Până în acest punct ai reușit să salvezi culoarea aleasă în LocalStorage. Valoarea aia o să rămână acolo și după refresh. Acum tot ce ai de făcut este să accesezi respectiva valoare după ce pagină s-a încărcat.

Repet, ca să accesezi ceva din localStorage folosești:
 

localStorage.getItem('numeCheie');

Partea asta de mai sus îți caută cheia respectivă în localStorage.  Și îți returnează ce a găsit în ea. Mai departe, este cam irelevant dacă ți-o returnează și tu nu o stochezi nicăieri, deci o pui într-o variabilă în modul ăsta.
 

let culoareaMea = localStorage.getItem('myColor');

Acum, variabila culoareaMea conține valoarea pentru cheia myColor din localStorage.  Ce trebuie să faci mai departe este ca atunci când pagina s-a încărcat, să setezi culoarea pentru respectivul div cu valoarea din culoareaMea.

Văd că folosești ceva CMS și mă gândesc că HTML-ul este generat din mai multe părți și poate nu vrei să te complici să vezi de unde e generat, așa că în acest context poți să te folosești de un alt event listener.

Sunt două mari event-uri în JavaScript ce sunt emise în momentul în care se încarcă o pagină și anume: DOMContentLoaded și load.
- DomContentLoaded 
este emis imediat ce DOM-ul a fost încarcat ( Doar HTML-ul fără CSS și imagini )
- load este emis după ce totul a fost încărcat ( DOM / CSS / Imagini )

În cazul tău, load este event-ul pe care trebuie să-l "asculți" deoarece tu modifici CSS. Iar treaba asta o faci în felul următor:
 

<script>
// Aici așteptăm eventul de 'load' ca să știm când s-a încărcat pagina
window.addEventListener("load", function(){
  
  const culoareaPrecedenta = String( localStorage.getItem('myColor') || '#fff' );
  // Aici iau culoarea precedentă din localStorage
  // De asemenea o transform în String ca să nu fie probleme
  
  document.getElementById('content_box').style.background = culoareaPrecedenta;
   // Aici schimb culoarea actuală cu ce avem în localStorage

});
</script>

Pune treaba asta la sfârșitul paginii :)


 

Edited by c3m3d3
Concatnare string complet
Link to comment
Share on other sites

3 hours ago, c3m3d3 said:

Perfect! Până în acest punct ai reușit să salvezi culoarea aleasă în LocalStorage. Valoarea aia o să rămână acolo și după refresh. Acum tot ce ai de făcut este să accesezi respectiva valoare după ce pagină s-a încărcat.

Repet, ca să accesezi ceva din localStorage folosești:
 


localStorage.getItem('numeCheie');

Partea asta de mai sus îți caută cheia respectivă în localStorage.  Și îți returnează ce a găsit în ea. Mai departe, este cam irelevant dacă ți-o returnează și tu nu o stochezi nicăieri, deci o pui într-o variabilă în modul ăsta.
 


let culoareaMea = localStorage.getItem('myColor');

Acum, variabila culoareaMea conține valoarea pentru cheia myColor din localStorage.  Ce trebuie să faci mai departe este ca atunci când pagina s-a încărcat, să setezi culoarea pentru respectivul div cu valoarea din culoareaMea.

Văd că folosești ceva CMS și mă gândesc că HTML-ul este generat din mai multe părți și poate nu vrei să te complici să vezi de unde e generat, așa că în acest context poți să te folosești de un alt event listener.

Sunt două mari event-uri în JavaScript ce sunt emise în momentul în care se încarcă o pagină și anume: DOMContentLoaded și load.
- DomContentLoaded 
este emis imediat ce DOM-ul a fost încarcat ( Doar HTML-ul fără CSS și imagini )
- load este emis după ce totul a fost încărcat ( DOM / CSS / Imagini )

În cazul tău, load este event-ul pe care trebuie să-l "asculți" deoarece tu modifici CSS. Iar treaba asta o faci în felul următor:
 


<script>
// Aici așteptăm eventul de 'load' ca să știm când s-a încărcat pagina
window.addEventListener("load", function(){
  
  const culoareaPrecedenta = String( localStorage.getItem('myColor') || '#fff' );
  // Aici iau culoarea precedentă din localStorage
  // De asemenea o transform în String ca să nu fie probleme
  
  document.getElementById('content_box').style.background = culoareaPrecedenta;
   // Aici schimb culoarea actuală cu ce avem în localStorage

});
</script>

Pune treaba asta la sfârșitul paginii :)


 

Mersi mai ajutat mult, totul merge perfect!

Link to comment
Share on other sites

a mai aparut ceva le tema aceasta:

<select id="colorPicker" onchange="JavaScript:changeBack()">
    <option value="transparent">None</option>
    <option value="yellow">Yellow</option>
    <option value="salmon">Salmon</option>
    <option value="lightblue">Light Blue</option>
    <option value="limegreen">Lime Green</option>
    <option value="cyan">Cyan</option>
    <option value="violet">Violet</option>
    <option value="red">Red</option>
</select>

Se poate de facut ca sa fie butoane din coduri html, ca sa pot sa le editez sa le dau un stil oarecare...?

Ca sa intelegeti mai bine ce am vrut, mai jos va las un exemplu.

 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...