Home > database >  Function which enables to select different background color of each element from different color in
Function which enables to select different background color of each element from different color in

Time:01-08

I have a project which is the note-taking website. When someone adds a note it is stored in local storage in the form of an array and a Javascript function works which calls the stored element and runs for each on the elements. Here is the Javascript code:

function showNote2() {
    console.log("Show");
    let note = localStorage.getItem("notes");
    if(note == null){
        noteData = []
        // message.innerText = "Please Add a Note"
    }
    else{
        noteData = JSON.parse(note);
    };
    let showBox = "";
    noteData.forEach(function show(element, index) {
        showBox  = `<div  id="card4" style="width: 18rem;">
        <select id="mySelect"  style="text-align:center" onchange="change_color()">
        <option id="bckgrnd-clr" value="white">Background Color</option>
        <option id="red" value="Red">Red</option>
        <option id="green" value="Green">Green</option>
        <option id="blue" value="Blue">Blue</option>
        </select>
                <div  id="card3">
                  <h5 >Note
                  ${index   1}
                  </h5>
                  <p > 
                  ${element}
                  </p>
                  <button id="${index}" onclick="deleteNote(this.id)" >Delete Note</a>
                </div>
              </div>   `
            })
              let showNote3 = document.getElementById("notes2");
              if(noteData.length != 0){
                  showNote3.innerHTML = showBox;
              }else{
                  showNote3.innerHTML = "Please add a Note"
              }
}

In the above code, select gives us the option to choose a color for the note, now I want to add a function to onchange which can help me choose a different color for different notes. The function I used was working only on the first-note and setting the color of all notes according to the selected option of first-note. The color will be applied on class with card-body

I am building this for practice in Javascript. Any hints would be appreciated, as this is something new for me Update: This is the solution I applied after getting the idea from the comments.

function change_color(index) {
    let note = localStorage.getItem("notes");
    if(note != null ){
        let colorApply = document.getElementById("card3")
        let elm1 = document.getElementById(index)
        let color = elm1.options[elm1.selectedIndex].value;
        document.colorApply.style.backgroundColor = color;
    }
    else{
        `Note is Empty`
    }

Now this is the error i am getting at color

"Cannot read properties of null (reading 'options')" Any help would be appreciated?

CodePudding user response:

See the working snippet. :)

In your loop, change code like this:

let elm1 = document.getElementById(index)

to

let showNote3 = document.getElementById(`card${index}`);
let colorApply = document.getElementById(`card${index}`)
let elm1 = document.getElementById(`mySelect${index}`)

and in your HTML

`<div  id="card${index}" ...` />
`<select id=`mySelect${index}`  style="text-align:center" onchange="change_color()">`

Also when you have the element, you do not need to use document

// -> document.colorApply.style.backgroundColor = color;
colorApply.style.backgroundColor = color;

Finally, you need to send the index of the note into your change_color function.

onchange="change_color(${index})"

function showNote2() {
  console.log("Show");
  let note = null // localStorage.getItem("notes");
  if (note == null) {
    noteData = ['My Note 1', 'My Note 2']
    // message.innerText = "Please Add a Note"
  } else {
    noteData = JSON.parse(note);
  };
  let showBox = "";
  noteData.forEach(function show(element, index) {
    showBox  = `
    <div  id="card${index}" style="width: 18rem;">
            <select id="mySelect${index}"  style="text-align:center" onchange="change_color(${index})">
            <option id="bckgrnd-clr" value="white">Background Color</option>
            <option id="red" value="Red">Red</option>
            <option id="green" value="Green">Green</option>
            <option id="blue" value="Blue">Blue</option>
            </select>
            <div  id="cardbody${index}">
                      <h5 >Note ${index   1}</h5>
                      <p > 
                      ${element}
                      </p>
                      <button id="btn${index}" onclick="deleteNote(this.id)" >Delete Note</a>
                    </div>
                  </div>   
                  `
  })
  let showNote3 = document.getElementById("note");
  if (noteData.length != 0) {
    showNote3.innerHTML = showBox;
  } else {
    showNote3.innerHTML = "Please add a Note"
  }
}

function change_color(index) {
  let note = noteData[index] // localStorage.getItem("notes");
  if (note != null) {
    let colorApply = document.getElementById(`card${index}`)
    let elm1 = document.getElementById(`mySelect${index}`)
    let color = elm1.options[elm1.selectedIndex].value;
    colorApply.style.backgroundColor = color;
  } else {
    console.log(`Note is Empty`)
  }
}

showNote2()
<h1>Notes</h1>
<div id='note' />
<button onclick='note' />

  •  Tags:  
  • Related