Обнаружение изменений localStorage в javascript

#javascript #firefox

#javascript #firefox

Вопрос:

Я использую пакет npm «storage-changed», который обнаруживает изменения localStorage на той же вкладке («https://www.npmjs.com/package/storage-changed «), теперь он отлично работает в 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)
  }
}
 

Комментарии:

1. в чем вопрос?

2. Извините, если я недостаточно ясно выразился, вопрос в том, как заставить этот скрипт поддерживать firefox

3. Похоже, что этот пакет NPM третьей стороны, который вы используете, должен быть исправлен для работы со всеми браузерами, вы должны открыть проблему в этом репозитории github: github.com/colshacol/storage-changed

Ответ №1:

Интерфейс localDataStorage (удобная оболочка для HTML5 localStorage API) удобно запускает события изменения на той же странице / вкладке / окне, в котором произошло событие хранения. Отказ от ответственности: я являюсь автором интерфейса. Он работает в FireFox и во всех браузерах Chromium blink (Chrome, Edge, Vivaldi, Brave и др.)

Как только вы установите localDataStorage, этот пример кода позволит вам увидеть эти события изменения:

 function nowICanSeeLocalStorageChangeEvents( e ) {
    console.log(
        "subscriber: "      e.currentTarget.nodeName   "n"  
        "timestamp: "       e.detail.timestamp   " ("   new Date( e.detail.timestamp )   ")"   "n"  
        "prefix: "          e.detail.prefix      "n"  
        "message: "         e.detail.message     "n"  
        "method: "          e.detail.method      "n"  
        "key: "             e.detail.key         "n"  
        "old value: "       e.detail.oldval      "n"  
        "new value: "       e.detail.newval      "n"  
        "old data type: "   e.detail.oldtype     "n"  
        "new data type: "   e.detail.newtype
    );
};
document.addEventListener(
    "localDataStorage"
    , nowICanSeeLocalStorageChangeEvents
    , false
);