Обнаружение localStorage изменений JavaScript - PullRequest
0 голосов
/ 17 апреля 2019

Я использую пакет npm «хранилище-изменено», который обнаруживает изменения localStorage на той же вкладке («https://www.npmjs.com/package/storage-changed"),now он отлично работает на Chrome и способен правильно определять события. Однако он не ' работает на firefox или microsoft edge.

Как я могу заставить его работать в этих браузерах?

Вот код для функции пакета npm

import storageUtils from 'storage-utilities'

const emit = (target, detail, options) => {
  return new Promise(() => {
    let attempts = 0

    const interval = setInterval(() => {
      if (attempts++ >= options.timeout) clearInterval(interval)

      const event = new CustomEvent(options.eventName, { detail })

      if (target[detail.key] === detail.value) {
        window.dispatchEvent(event)
        clearInterval(interval)
      }
    }, 10)
  })
}

const getEventName = (options) => {
  return options.eventName || options.targetName + 'StorageChanged'
}

const getTimeout = (options) => {
  return options.timeout ? options.timeout / 10 : 15
}

const getTarget = (storage) => {
  if (typeof storage === 'string') {
    return window[`${storage}Storage`]
  }

  return storage
}

const getTargetName = (storage) => {
  return typeof storage === 'string'
    ? storage === 'session'
      ? 'session'
      : `local`
    : storage === window.sessionStorage
      ? 'session'
      : 'local'
}

export default (storage, options) => {
  const opts = options || {}
  // Set up missing options.
  opts.targetName = getTargetName(storage)
  opts.eventName = getEventName(opts)
  opts.timeout = getTimeout(opts)

  // Get correct storage target and ref setItem.
  const target = getTarget(storage)
  const setItem = target.setItem.bind(target)
  const removeItem = target.removeItem.bind(target)

  target.setItem = (key, value) => {
    const _value = storageUtils.stringify(value)

    emit(target, { key, value: _value, _target: opts.targetName }, opts)
    setItem(key, _value)
  }

  target.removeItem = (key) => {
    emit(target, { key, _target: opts.targetName }, opts)
    removeItem(key)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...