0

私のウェブサイトでは、特定のコンテンツを表示または非表示にするために Cookie を使用しています。ユーザーのログイン方法に応じて、ユーザーに表示されるコンテンツが決まります。つまり、Facebook でログインすると、サイトは「fbsr_3324」という Cookie を探します。私の問題は、Cookie 名の 2 番目の部分がユーザーごとに変わることです (fbsr_2889 fbsr_9902 など)。したがって、誰かが助けて、Cookie 名の最初の部分のみを確認する方法を提案できるかどうかを知りたい (つまり、fbsr_ で始まる Cookie の存在のみを探す)

私が使用している現在のJavascriptは次のとおりです。

function checkCookie() {
    contentDiv=document.getElementById("cookieFb");
    if (document.cookie.indexOf("fbsr_")!=-1) {
        contentDiv.style.display="none";
    }
    else {
        contentDiv.style.display="block";
    }
}
4

2 に答える 2

2

現在使用しているコードは、値を含む Cookie セットがあれば、facebook を使用してログインしたかのように実行されます。'fbsr_haha, gotcha'
おそらく、これは正規表現の仕事です:

/^|;\s*fbsr_[0-9]{4}\=[^;]+;/.test(document.cookie);

トリックを行う必要があります。
式の説明:

  • ^|;: 文字列の先頭またはセミコロン
  • \s*: ゼロ個以上のスペースが続く
  • fbsr_[0-9]{4}: fsbr_ および 4 つの数字の任意のシーケンスに一致します
  • \=: と書くだけでもかまいませんが、エスケープ(ルックアラウンド)=が必要になる場合もあります。=
  • [^;]+少なくとも 1 回以上セミコロン以外のもの
  • ;: 文字通りのセミコロン

この式を使用する場所:

function checkCookie()
{
    contentDiv=document.getElementById("cookieFb");
    if (/^|;\s*fbsr_[0-9]{4}\=[^;]+;/.test(document.cookie))
    {//facebooker!
        contentDiv.style.display="none";
        return;//return here, so you can leve the else out
    }
    contentDiv.style.display="block";
}

まあ、それはそれを行う必要があります。
しかし、どうしても JS に慣れてきて、スクリプトの一部を最適化したい場合は、次のことを検討してください。

var checkCookie = (function(expr)
{
    var contentDiv = document.getElementById('cookieFb');
    return function()
    {
        contentDiv.style.display="block";
        if (expr.test(document.cookie))
        {
            contentDiv.style.display="none";
        }
    };
}(/^|;\s*fbsr_[0-9]{4}\=[^;]+;/));

これは、あなたが持っているのとまったく同じコードの最適化されたバージョンです。cookieFbATM の場合、コードは呼び出されるたびに ID を持つ要素の dom を照会し、 RegExp のインスタンスも作成します。クロージャーを使用すると、DOM を 1 回クエリし、RegExp のインスタンスを 1 回作成して、呼び出しごとに再利用できます。
この場合、それはもう少し効率的で、マイクロ最適化ですが、私は自分自身を助けることができませんでした;)

于 2013-07-31T14:10:33.333 に答える