Home > Software engineering >  EventListener for form is not working after unsubscribe button
EventListener for form is not working after unsubscribe button

Time:12-18

I have a little problem.Usign vanilla js i create a form for an email input that after a validation function is sent to localStorage and the state of the button is changed; i did an event listener for unsubscribing the email and it removes the email from localStorage but i can not subscribe again just after the unsubscribe,i can only after refreshing the page. Some screenshots for more details: I enter a valid email: enter image description here

Click subscribe: enter image description here

Click unsubscribe without refreshing the page: enter image description here

And in this state,i can not subscribe again with another email,it works only after refreshing but i need to do this without refresh.How can do i? The section where this form is created is dinamically created. Code: Subscribe functions:

import { validateEmail } from './email-validator.js'

export const subscribe = () => {
  const subscribeBtn = document.getElementById('subscribeButton')
  subscribeBtn.setAttribute('value', 'Unsubscribe')
  document.getElementById('emailForm').style.display = 'none'
  localStorage.setItem('isSubscribed', 'true')
}

export const unsubscribe = () => {
  const subscribeBtn = document.getElementById('subscribeButton')
  subscribeBtn.setAttribute('value', 'Subscribe')
  document.getElementById('emailForm').style.display = 'block'
  localStorage.setItem('isSubscribed', 'false')
}

export const subscribeEmail = (email) => {
  const isValidEmail = validateEmail(email)
  if (isValidEmail === true) {
    subscribe()
    document.querySelector('form').addEventListener('click', function (e) {
      e.preventDefault()
      unsubscribe()
      localStorage.removeItem('Email')
    })
  } else if (isValidEmail === false) {
    unsubscribe()
  }
}

Validation function:

    const VALID_EMAIL_ENDINGS = ['gmail.com', 'outlook.com', 'yandex.ru']

export const validateEmail = (email) => VALID_EMAIL_ENDINGS.some(v => email.includes(v)) ? true : false

export { VALID_EMAIL_ENDINGS as validEnding }

And the section creation function :

import { subscribe, unsubscribe, subscribeEmail } from './subscribe.js'

const addSection = () => {
  const sectionFour = createElement('sectionFour', 'section', 'app-section app-section--image-program', 'fourth-section')
  const sectionParent = getElbyID('sectionParent', 'third-section')
  const parentSection = sectionParent.parentNode
  parentSection.insertBefore(sectionFour, sectionParent.nextSibling)

  const heading2 = createElement('heading2', 'h2', 'program-title')
  const heading2Text = document.createTextNode('Join Our Program')
  heading2.append(heading2Text)
  const parent = getElbyID('parent', 'fourth-section')

  const heading3 = createElement('heading3', 'h3', 'program-subtitle')
  const heading3Text = document.createTextNode('Sed do eiusmod tempor incididunt')
  heading3.appendChild(heading3Text)
  const linebreak = createElement('linebreak', 'br')
  heading3.appendChild(linebreak)
  const textAfterBreak = document.createTextNode('ut labore et dolore magna aliqua')
  heading3.appendChild(textAfterBreak)

  const form = createElement('submitFieldWrapper', 'form', 'submitFieldWrapper', 'form')
  parent.append(heading2, heading3, form)

  const emailForm = createElement('emailForm', 'div', 'form-wrapper', 'emailForm')

  const inputForm = createElement('inputForm', 'input', 'form-input', 'submit-info')
  setAttributes(inputForm,
    'type', 'text',
    'placeholder', 'Email')
  if (localStorage.getItem('Email') !== null) {
    inputForm.setAttribute('value', localStorage.getItem('Email'))
  } else {
    inputForm.setAttribute('placeholder', 'Email')
  }

  emailForm.appendChild(inputForm)

  document.querySelector('form').addEventListener('submit', function (e) {
    e.preventDefault()
    console.log(inputForm.value)
    localStorage.setItem('Email', inputForm.value)
    subscribeEmail(inputForm.value)
  })

  const submitForm = createElement('submitForm', 'input', 'app-section__button submit-btn', 'subscribeButton')
  setAttributes(submitForm,
    'type', 'submit',
    'value', 'Subscribe')
  form.append(emailForm, submitForm)

  const isSubscribed = localStorage.getItem('isSubscribed')
  if (isSubscribed === 'true') {
    subscribe()
  } else if (isSubscribed === 'false') {
    unsubscribe()
  }
}

const createElement = (elName, htmlEl, elClass, elID) => {
  const elementName = document.createElement(htmlEl)
  elementName.className = elClass
  elementName.id = elID

  return elementName
}

const getElbyID = (elName, searchedId) => {
  const elementToSearch = document.getElementById(searchedId)

  return elementToSearch
}

const setAttributes = (elem, ...elemArguments) => {
  for (let i = 0; i < elemArguments.length; i  = 2) {
    elem.setAttribute(elemArguments[i], elemArguments[i   1])
  }
}

export const advancedSection = () => {
  addSection()
  const getHeading = document.getElementById('fourth-section')
  const sectionChildren = getHeading.children
  sectionChildren[0].innerHTML = 'Join Our Advanced Program'
  const getButton = document.getElementById('subscribeButton')
  setAttributes(getButton,
    'type', 'submit',
    'value', 'Subscribe to Advanced Program')
  getButton.className = 'app-section__button submit-btnAdvanced'
}

export default addSection

I dont understand where im wrong or what is missing,please help.Thanks in advance.

CodePudding user response:

When you click the 'Unsubscribe' button, you have not re-assigned the event handler for the 'Subscribe' event.

Add

  document.querySelector('form').addEventListener('submit', function (e) {
    e.preventDefault()
    console.log(inputForm.value)
    localStorage.setItem('Email', inputForm.value)
    subscribeEmail(inputForm.value)
  })

to the end of your unsubcribe() function.

CodePudding user response:

So,the problem was in subscribeEmail function,at e.preventDefault(),idk how it works but i changed preventDefault with the stopPropagation,and now i can subscribe and unsubscribe as much as i want. The code now looks like this:

    export const subscribeEmail = (email) => {
  const isValidEmail = validateEmail(email)
  if (isValidEmail === true) {
    subscribe()
    document.querySelector('form').addEventListener('click', function (e) {
      unsubscribe()
      localStorage.removeItem('Email')
      e.stopPropagation()
    })
  } else if (isValidEmail === false) {
    unsubscribe()
  }
}
  • Related