Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.javascript > #35840 > unrolled thread

Accessing the value of a cookie

Started bygroovee@cyberdude.com
First post2018-11-20 23:33 -0800
Last post2018-11-24 06:11 -0800
Articles 6 — 4 participants

Back to article view | Back to comp.lang.javascript


Contents

  Accessing the value of a cookie groovee@cyberdude.com - 2018-11-20 23:33 -0800
    Re: Accessing the value of a cookie JJ <jj4public@vfemail.net> - 2018-11-21 16:03 +0700
    Re: Accessing the value of a cookie Ben Bacarisse <ben.usenet@bsb.me.uk> - 2018-11-21 12:37 +0000
      Re: Accessing the value of a cookie groovee@cyberdude.com - 2018-11-22 00:56 -0800
        Re: Accessing the value of a cookie Ben Bacarisse <ben.usenet@bsb.me.uk> - 2018-11-22 12:22 +0000
    Re: Accessing the value of a cookie Julio Di Egidio <julio@diegidio.name> - 2018-11-24 06:11 -0800

#35840 — Accessing the value of a cookie

Fromgroovee@cyberdude.com
Date2018-11-20 23:33 -0800
SubjectAccessing the value of a cookie
Message-ID<f11ea23c-05c7-4b52-8f52-c66912ac1e4e@googlegroups.com>
I was trying to check whether a cookie is set to a particular value or not (on the client side, in JS), and found this code on MDN:

if (document.cookie.split(';').filter((item) => item.includes('reader=1')).length) {
    console.log('The cookie "reader" has "1" for value')
}


What I'd like to know is - what's the ".length" at the end for? I'm trying to get the VALUE of the cookie, why would it's *length* be required?

[toc] | [next] | [standalone]


#35842

FromJJ <jj4public@vfemail.net>
Date2018-11-21 16:03 +0700
Message-ID<fl3lwtx9zhux$.cipgw2qtxmi8$.dlg@40tude.net>
In reply to#35840
On Tue, 20 Nov 2018 23:33:51 -0800 (PST), groovee@cyberdude.com wrote:
> I was trying to check whether a cookie is set to a particular value or not (on the client side, in JS), and found this code on MDN:
> 
> if (document.cookie.split(';').filter((item) => item.includes('reader=1')).length) {
>     console.log('The cookie "reader" has "1" for value')
> }
> 
> What I'd like to know is - what's the ".length" at the end for? I'm trying to get the VALUE of the cookie, why would it's *length* be required?

See:

<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter>

Hint: bookmark that site and use it as JavaScript reference. It'll save you
so much time.

[toc] | [prev] | [next] | [standalone]


#35845

FromBen Bacarisse <ben.usenet@bsb.me.uk>
Date2018-11-21 12:37 +0000
Message-ID<87lg5md2sj.fsf@bsb.me.uk>
In reply to#35840
groovee@cyberdude.com writes:

> I was trying to check whether a cookie is set to a particular value or
> not (on the client side, in JS), and found this code on MDN:
>
> if (document.cookie.split(';').filter(
>             (item) => item.includes('reader=1')).length) {
>     console.log('The cookie "reader" has "1" for value')
> }

> What I'd like to know is - what's the ".length" at the end for? I'm
> trying to get the VALUE of the cookie, why would it's *length* be
> required?

You are trying to do something different, so you won't want to know how
many items get past the filter, which is what the length test is for.
The original code (which you altered) is intended to find out if a key
exists, not what value it has.

You changed "reader=" to "reader=1", but that might not do do what you
think it does because the inner "includes" test will succeed when
reader=11 is in the string.  Mind you, the original code is also a bit
dodgy since it accepts "xyzreader=" as well as "reader=".

If you need to get the key=value pairs you should split on /;[ \t]*/,
and if you need to test for a specific key you should check that the
pair starts with the required key.  Mind you, a regexp could give you a
quick check for existence:

  document.cookie.match(/(:?^|;[ \t]*)reader=/)

(Don't rely on this being safe -- to get the right regexp you'd need to
(a) read the spec, and (b) also know if there are any user agents out
there that don't conform!)

-- 
Ben.

[toc] | [prev] | [next] | [standalone]


#35848

Fromgroovee@cyberdude.com
Date2018-11-22 00:56 -0800
Message-ID<f676846e-367a-483e-81ed-6ff68ec3ae7c@googlegroups.com>
In reply to#35845
On Wednesday, 21 November 2018 18:07:55 UTC+5:30, Ben Bacarisse  wrote:
 
> The original code (which you altered) is intended to find out if a key
> exists, not what value it has.

I did not! This page, look at Example 6 (I have a feeling you were looking at 5!):

https://developer.mozilla.org/en-US/docs/Web/API/document/cookie

[toc] | [prev] | [next] | [standalone]


#35850

FromBen Bacarisse <ben.usenet@bsb.me.uk>
Date2018-11-22 12:22 +0000
Message-ID<87y39l9u9r.fsf@bsb.me.uk>
In reply to#35848
groovee@cyberdude.com writes:

> On Wednesday, 21 November 2018 18:07:55 UTC+5:30, Ben Bacarisse  wrote:
>  
>> The original code (which you altered) is intended to find out if a key
>> exists, not what value it has.
>
> I did not! This page, look at Example 6 (I have a feeling you were
> looking at 5!):

Yes, you are right -- I was looking at the very similar previous
example.  Sorry about that.

The code shown in both exercises does not do what it purports to do.
Don't copy it.  It did not occur to me that such a bad example would be
given on the MDN website and I should therefore also apologise for
assuming you'd written anything that bad!

> https://developer.mozilla.org/en-US/docs/Web/API/document/cookie

-- 
Ben.

[toc] | [prev] | [next] | [standalone]


#35856

FromJulio Di Egidio <julio@diegidio.name>
Date2018-11-24 06:11 -0800
Message-ID<7722e7b9-8477-48ca-bc4a-9bec2a886234@googlegroups.com>
In reply to#35840
On Wednesday, 21 November 2018 08:34:01 UTC+1, gro...@cyberdude.com  wrote:

> I was trying to check whether a cookie is set to a particular value or not
> (on the client side, in JS), and found this code on MDN:

The code in those examples (and in technical examples in general) is *not*
meant to be *production-ready*.

For your benefit, follows an example of the code I am using in production:
it is not totally abstract nor particularly sophisticated, but I'd think at
least the cookie handling logic is correct to the standard:

--------------------------------------------------------------
function $SettingNeverExpires()
{
    // virtually unlimited
    var expires = new Date();
    expires.setFullYear(expires.getFullYear() + 1);
    return expires;
}

function $loadSettings(itemCb)  // calls itemCb per each name-value
{
    var cookies = $doc.cookie.split(";");
    
    for (var i = 0; i < cookies.length; ++i)
    {
        var pair = cookies[i].split("=");
        
        if (pair.length === 2)
        {
            var name = decodeURIComponent(pair[0]).trim();
            var value = decodeURIComponent(pair[1]).trim();
            
            itemCb(name, value);
        }
    }
}

function $saveSettings(dict)  // dict is simply an object
{
    var exp = $SettingNeverExpires().toUTCString();
    
    for (var key in dict)
    {
        var name = encodeURIComponent(key);
        var value = encodeURIComponent(dict[key]);
        
        $doc.cookie = name + "=" + value + "; expires=" + exp;
    }
}
--------------------------------------------------------------

Feel free to peruse.  And, everybody, please feel free to nitpick...

Thanks,

Julio

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.javascript


csiph-web