質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

ローカルストレージに「入りきらなかったこと」は判定できますか?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 505

kasumisou

score 8

実現したいこと

PHPからデカい値を取得しローカルストレージに入れるにあたって、その成否を判定したいです。

発生している問題

値がデカいため入りきらなかったときは別の処理を行いたいのですが、「入りきらなかったこと」を判定する方法がわかりません。

該当のソースコード

下記でPHPから取得します。dekaiがデカい値で、これが入ったかどうかを判定したいです。

function dekaiInsert(){
    $.ajax({ url:'http://example.com/ajax', type:'POST', data:{action:'dekaiAjax'} })
    .done(function( dekai ) {    
        localStorage.setItem( 'デカい値', dekai );      
    });    
}

試したこと

上の実行後に、「そのキーへアクセスできること」を判定すれば出来るかもと思い、下記hasLocalStorage()を試しました。

しかし「入りきらなかったこと」とは無関係なようで、入りきらなかった場合でもtrueが返ってしまいました。

$(window).on('load', function() {

    // デカい値を入れる
    dekaiInsert(); 

    // 入りきらなければfalseとしたいが、trueが返ってしまう
    var hantei = hasLocalStorage( 'デカい値' );
    console.log( '判定結果', hantei ); 

    // 「入りきらなかったこと」を判定して処理を分けたい
    if ( hantei ) {
        // 入りきったときの処理
    }else{
        // 入りきらなかったときの処理
    }
});

// 「そのキーへアクセスできること」を判定
function hasLocalStorage( checkKey ) {
    try {
        window.localStorage.setItem(checkKey, 1);
        window.localStorage.getItem(checkKey);
        return true;
    } catch(e) {
        return false;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/12/17 08:20

    値じゃなくて、サイズがでかいもの、なんですね

    キャンセル

  • y_waiwai

    2019/12/17 08:27

    で、入りきらなったとき、というのはそれはどういう値になるんでしょうか

    キャンセル

  • m.ts10806

    2019/12/17 08:36

    それぞれブラウザによって容量に上限があることはご存じでしょうか。
    というか、そういう判定が必要なほどサイズがあるのでしたらLocalStorageは悪手です。

    キャンセル

回答 3

+7

ぱっと思いついたものを記載します。
書き込み時に容量が多かった場合はQuotaExceededErrorが発生されるので、それをcatchすればよいと思います。
書き込みと判定を別処理にしたい場合は、Flagを使えばよいかと。

以下追記
容量を判定するにわかりやすいサイトを見つけました。
リンク内容
chromeのデベロッパーツールからソースコードを探してみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/17 13:44

    うわ、いいです、いいです。ありがとうございました。

    キャンセル

  • 2019/12/17 13:51

    なるほど、あなたがどういう人か理解しました。
    礼には及びません。

    キャンセル

  • 2019/12/17 14:05

    申し訳ございません。嫌な書き方をしてしまいました。お叱りありがとうございます。

    キャンセル

+6

既にベストアンサーがついていますが、makosankibuさんが指摘されているように、どのみち例外が発生するわけですから、try ~ catch を使わないと処理が継続できません。そして、どうせ try ~ catch を書くのであれば、わざわざサイズのチェックなどしなくても、catchの時点で「書き込めなかった」ことがわかります。

ということで、少なくとも try ~ catch は必須です。

それと、質問者さんはコードを動かしてみたのでしょうか。実際に大きなデータを入れてみれば、例外が発生することはすぐに分かると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

状況がよくわかりませんが一般的に
書き込んだものを呼び出して、サイズが違えば失敗じゃないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/17 11:47

    ありがとうございます。デカい値のサイズは都度異なるので、サイズを測るという方法は難しそうです。

    キャンセル

  • 2019/12/17 11:54

    .done(function( dekai )でdekaiを得てるんですから
    「サイズを測るという方法は難しそう」の意味がわかりません

    localStorage.setItem( 'デカい値', dekai );
    console.log(dekai.length==localStorage.getItem( 'デカい値').length);

    キャンセル

  • 2019/12/17 12:06

    失礼致しました。仰る通りでした。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る