programing

Quota Exceeded Error: 돔 예외 22: 할당량을 초과하는 항목을 스토리지에 추가하려고 했습니다.

randomtip 2022. 9. 12. 11:20
반응형

Quota Exceeded Error: 돔 예외 22: 할당량을 초과하는 항목을 스토리지에 추가하려고 했습니다.

iOS 7이 탑재된 iPhone에서 LocalStorage를 사용하면 이 오류가 발생합니다.레졸반트를 찾고 있었는데, 개인적으로 열람조차 하지 않는 것을 생각하면, 아무 것도 관련이 없습니다.

iOS 7에서 localStorage가 기본적으로 비활성화되는 이유를 이해할 수 없습니다만, 비활성화되어 있는 것 같습니다.다른 웹사이트에서도 테스트를 해봤는데, 잘 안 됐어요.심지어 http://arty.name/localstorage.html,이라는 웹사이트를 통해서 테스트도 해봤는데 이상한 이유로 아무것도 저장되지 않는 것 같아요.

누군가 같은 문제를 겪은 적이 있나요? 단지 운이 좋아서 고친 것뿐이죠.보관 방법을 변경해야 합니까?

몇 줄의 정보만 저장하여 하드 디버깅을 시도했지만 소용이 없었습니다.나는 스탠다드를 사용했다.localStorage.setItem()저장 기능.

이 문제는 Safari가 개인 모드 브라우징일 때 발생할 수 있습니다.개인 브라우징 중에는 로컬 스토리지를 전혀 사용할 수 없습니다.

한 가지 해결책은 사용자에게 앱이 작동하려면 비공개 모드가 필요하다고 경고하는 것입니다.

업데이트: 이것은 Safari 11에서 수정되었기 때문에 동작은 다른 브라우저와 일치합니다.

답변에서 와 같이 iOS와 X 에서 Quota Quota Exceeded Error in Safari Private Browser Error가 localStorage.setItem (오류)sessionStorage.setItem가 호출됩니다).가 호출됩니다.

한 가지 솔루션은 각 사용 인스턴스에서 try/catch 또는 modernizr 체크를 수행하는 것입니다.setItem.

단, 이 에러의 발생을 글로벌하게 정지하는 심을 사용하고 싶은 경우는, 다음의 조작을 실시해, JavaScript 의 나머지가 파손되는 것을 방지합니다.

https://gist.github.com/philfreo/68ea3cd980d72383c951

// Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem
// throw QuotaExceededError. We're going to detect this and just silently drop any calls to setItem
// to avoid the entire page breaking, without having to do a check at each usage of Storage.
if (typeof localStorage === 'object') {
    try {
        localStorage.setItem('localStorage', 1);
        localStorage.removeItem('localStorage');
    } catch (e) {
        Storage.prototype._setItem = Storage.prototype.setItem;
        Storage.prototype.setItem = function() {};
        alert('Your web browser does not support storing settings locally. In Safari, the most common cause of this is using "Private Browsing Mode". Some settings may not save or some features may not work properly for you.');
    }
}

함수를 「 」가 반환됩니다.true ★★★★★★★★★★★★★★★★★」falselocalStorage:

isLocalStorageNameSupported = function() {
    var testKey = 'test', storage = window.sessionStorage;
    try {
        storage.setItem(testKey, '1');
        storage.removeItem(testKey);
        return true;
    } catch (error) {
        return false;
    }
}

볼 수 있어요.localStorage.setItem()사용할 수 있는지 확인해야 합니다.§:

if ( isLocalStorageNameSupported() ) {
    // can use localStorage.setItem('item','value')
} else {
    // can't use localStorage.setItem('item','value')
}

우연히 iOS 7에서도 같은 문제가 발생했습니다(시뮬레이터가 없는 디바이스도 있습니다).

iOS 7의 Safari는 스토리지 할당량이 적은 것 같습니다.이것에 도달하려면 , 이력 로그가 길다고 생각됩니다.

예외를 잡는 것이 가장 좋은 방법이 될 것 같습니다.

Modernizr 프로젝트에는 간단한 패치가 포함되어 있습니다.이것들은 https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js과 같은 것을 시도해 보세요.

위의 DrewT의 답변을 기반으로 한 확장 솔루션은 localStorage를 사용할 수 없는 경우 쿠키를 사용합니다.Mozilla의 docCookies 라이브러리를 사용합니다.

function localStorageGet( pKey ) {
    if( localStorageSupported() ) {
        return localStorage[pKey];
    } else {
        return docCookies.getItem( 'localstorage.'+pKey );
    }
}

function localStorageSet( pKey, pValue ) {
    if( localStorageSupported() ) {
        localStorage[pKey] = pValue;
    } else {
        docCookies.setItem( 'localstorage.'+pKey, pValue );
    }
}

// global to cache value
var gStorageSupported = undefined;
function localStorageSupported() {
    var testKey = 'test', storage = window.sessionStorage;
    if( gStorageSupported === undefined ) {
        try {
            storage.setItem(testKey, '1');
            storage.removeItem(testKey);
            gStorageSupported = true;
        } catch (error) {
            gStorageSupported = false;
        }
    }
    return gStorageSupported;
}

소스에서는 다음 항목만 사용합니다.

localStorageSet( 'foobar', 'yes' );
...
var foo = localStorageGet( 'foobar' );
...

다른 답변에서 이미 설명한 바와 같이 개인 브라우징 모드에서 Safari는 항상 다음 방법으로 데이터를 저장하려고 할 때 이 예외를 발생시킵니다.localStorage.setItem()

이 문제를 해결하기 위해 localStorage와 메서드와 이벤트를 모두 모방한 가짜 localStorage를 작성했습니다.

가짜 로컬 스토리지: https://gist.github.com/engelfrost/fd707819658f72b42f55

이것은 아마도 이 문제에 대한 좋은 일반적인 해결책이 아닐 것입니다.이 방법은 시나리오에 적합한 솔루션입니다.대안은 기존 애플리케이션에 대한 대규모 재작성입니다.

갱신(2016-11-01)

앰프 사용 중JS는 이 문제에 대처하기 위해 아래에 언급했습니다.그러나 Safari in Private 브라우징의 경우 메모리 기반 스토리지로 폴백되었습니다.제 경우에는 사용자가 아직 개인 브라우징을 하고 있더라도 새로 고칠 때 스토리지가 지워진다는 의미이기 때문에 적절하지 않았습니다.

또한 iOS Safari에서 항상 Private 모드로 브라우징을 하고 있는 유저도 많이 볼 수 있었습니다.따라서 Safari의 더 나은 대체 방법은 쿠키(사용 가능한 경우)를 사용하는 것입니다.기본적으로는 개인 브라우징에서도 쿠키에 액세스할 수 있습니다.물론 개인 브라우징을 종료할 때는 지워지지만 새로 고칠 때는 지워지지 않습니다.

로컬 스토리지 폴백 라이브러리를 찾았습니다.매뉴얼에서 다음 항목을 참조하십시오.

목적

"프라이빗 브라우징"과 같은 브라우저 설정에서는 새로운 브라우저에서도 window.localStorage에 의존해야 하는 문제가 발생하고 있습니다.존재하는 경우에도 setItem 또는 getItem을 사용하려고 하면 예외가 발생합니다.이 모듈에서는 사용할 수 있는 브라우저 스토리지 메커니즘을 확인하기 위해 적절한 검사를 수행하고 이를 노출합니다.localStorage와 동일한 API를 사용하기 때문에 대부분의 경우 드롭다운 대체로 작동합니다.

갓차(gotcha:

  • CookieStorage에는 저장소 제한이 있습니다.여기서 조심해요.
  • 페이지 로드 사이에 MemoryStorage가 유지되지 않습니다.이는 페이지 크래시를 방지하기 위한 임시방편이지만 전체 페이지를 로드하지 않는 웹 사이트에서는 충분할 수 있습니다.

TL;DR:

local-storage-fallback 사용(통합 API와.getItem(prop)그리고..setItem(prop, val)):

브라우저(local Storage, session Storage, 쿠키, 메모리)에 적합한 스토리지 어댑터를 확인하고 사용합니다.

원답

앞의 답변에 덧붙여, 가능한 회피책의 하나는 스토리지 방법을 변경하는 것입니다.Amplify와 같은 몇 가지 librairies가 있습니다.JS지속성도움이 될 수 있는 JS.두 lib 모두 여러 백엔드를 통해 영구적인 클라이언트 측 스토리지를 제공합니다.

증폭의 경우JS

local 스토리지

  • IE 8+
  • 파이어폭스 3.5 이상
  • Safari 4 이상
  • 크롬
  • 오페라 10.5 이상
  • 아이폰2+
  • 안드로이드 2 이상

세션 스토리지

  • IE 8+
  • 파이어폭스 2+
  • Safari 4 이상
  • 크롬
  • 오페라 10.5 이상
  • 아이폰2+
  • 안드로이드 2 이상

글로벌 스토리지

  • 파이어폭스 2+

사용자 데이터

  • IE 5 - 7
  • userData는 IE의 새로운 버전에도 존재하지만 IE 9의 구현에 문제가 있기 때문에 localStorage가 지원되는 경우 userData를 등록하지 않습니다.

기억

  • 다른 스토리지 유형을 사용할 수 없는 경우 메모리 내 저장소가 폴백으로 제공됩니다.

영속적인 경우JS

  • flash: Flash 8 고정 스토리지.
  • 기어: Google Gears 기반 영구 스토리지.
  • local storage: HTML5 드래프트 스토리지.
  • 글로벌 스토리지: HTML5 드래프트 스토리지(구 사양).
  • 즉, Internet Explorer의 사용자 데이터 동작.
  • cookie: cookie 기반의 영속 스토리지.

또한 추상화 레이어를 제공하므로 스토리지 유형을 선택할 필요가 없습니다.그러나 스토리지 유형에 따라 크기 제한 등 몇 가지 제한이 있을 수 있습니다.저는 지금 앰프를 사용하고 있습니다.JS, 하지만 iOS 7/Safari 등에서 실제로 문제가 해결되는지 확인하기 위해 몇 가지 테스트를 더 해야 합니다.

2017년 4월에 패치가 Safari에 통합되었기 때문에 다른 브라우저와 제휴했습니다.이것은 Safari 11과 함께 출시되었습니다.

https://bugs.webkit.org/show_bug.cgi?id=157010

이 질문과 답변은 Parse에서 신규 사용자 등록에 관한 특정 문제를 해결하는 데 도움이 되었습니다.

signUp(atts, options) 함수는 로컬스토리지를 사용하여 세션을 유지하기 때문에 사용자가 프라이빗브라우징 모드일 경우 QuotaExceededError:A attempted to add something to quota than quota exceed something that through that that that quota. 예외와 성공/오류 함수는 호출되지 않습니다.

제 경우, 에러 함수는 호출되지 않기 때문에 처음에는 송신 시 클릭 이벤트 또는 사인업 성공 시 정의된 리다이렉트 실행 시 문제로 생각되었습니다.

사용자에 대한 경고를 포함하면 문제가 해결되었습니다.

Javascript SDK 참조 구문 분석 https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp

사용자 이름(또는 이메일)과 비밀번호를 사용하여 새 사용자를 등록합니다.그러면 새 Parse가 생성됩니다.서버의 사용자 및 {@link #current}을(를) 사용하여 사용자에게 액세스할 수 있도록 localStorage 세션을 유지합니다.

언급URL : https://stackoverflow.com/questions/21159301/quotaexceedederror-dom-exception-22-an-attempt-was-made-to-add-something-to-st

반응형