2011-05-06 53 views
10

Cách tiếp cận cụ thể nhất của JS hoặc JQuery để giám sát cookie thông qua trang cuộc sống trên trình duyệt và kích hoạt sự kiện là gì khi cookie được 'thay đổi?Trình theo dõi cookie của Jquery

Trả lời

14

Theo như tôi biết, không thể liên kết sự kiện change (hoặc tương tự) với cookie trực tiếp. Thay vào đó, tôi sẽ đi theo phương pháp này:

Tạo một con trỏ so sánh giá trị cookie với giá trị đã biết trước đó mỗi X mili giây.

// basic functions from the excellent http://www.quirksmode.org/js/cookies.html 
function readCookie(name) { 
    var nameEQ = name + "="; 
    var ca = document.cookie.split(';'); 
    for(var i=0;i < ca.length;i++) { 
     var c = ca[i]; 
     while (c.charAt(0)==' ') c = c.substring(1,c.length); 
     if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 
    } 
    return null; 
} 

///////////////////////////////// 
// ACTUAL FUN STUFF BELOW 
///////////////////////////////// 

var cookieRegistry = []; 

function listenCookieChange(cookieName, callback) { 
    setInterval(function() { 
     if (cookieRegistry[cookieName]) { 
      if (readCookie(cookieName) != cookieRegistry[cookieName]) { 
       // update registry so we dont get triggered again 
       cookieRegistry[cookieName] = readCookie(cookieName); 
       return callback(); 
      } 
     } else { 
      cookieRegistry[cookieName] = readCookie(cookieName); 
     } 
    }, 100); 
} 

Cách sử dụng sau đó sẽ là một cái gì đó như thế này:

listenCookieChange('foo', function() { 
    alert('cookie foo has changed!'); 
}); 

Lưu ý: đây chưa được thử nghiệm và chỉ là một bản demo nhanh chóng như thế nào tôi sẽ tiếp cận vấn đề.

EDIT: Tôi đã thử nghiệm tính năng này ngay bây giờ và nó hoạt động.See example :)

+1

Lưu ý: Điều này chỉ được kích hoạt trên các sự kiện thay đổi cookie. Tôi cũng cần kiểm tra ** tạo cookie ** và do đó sửa đổi mã như sau: '... if (cookieRegistry [cookieName] || readCookie (cookieName)! = Null) {...' –

+0

Hi Aron, cảm ơn vì điều này! Rất cảm ơn. Đó là 2017 và Im phải đối mặt với một vấn đề với quy tắc eslint về 'return-return' cho' listenCookieChange() 'trong đó' setInterval' là. Bạn có thể cập nhật câu trả lời của bạn để làm cho eslint hạnh phúc không? Vô hiệu hóa các tác vụ eslint. – Sylar

-1

Có một plugin jQuery cho cookies.

http://plugins.jquery.com/project/Cookie

Nó không phải là khó khăn để truy cập các tập tin cookie trong một tài liệu html, họ sống trong document.cookie.

<!-- Add cookie --> 
$.cookie('cookieName':'cookieValue'); 

<!-- get cookie --> 
$.cookie('cookieName'); 

<!-- removecookie --> 
$.cookie('cookieName', null); 

Ngoài ra còn có các đối số tùy chọn để thêm cookie, ví dụ: hết hạn.

Tuy nhiên, để trả lời câu hỏi của bạn, tôi không thực sự nghĩ rằng bạn có thể áp dụng trình xử lý sự kiện vào cookie không may.

+1

Mã của bạn có cú pháp không đúng. Bạn đang sử dụng nhận xét html trong javascript và dấu hai chấm giữa ''cookieName'' và'' cookieValue'' trong ví dụ đầu tiên cần phải là dấu phẩy. Đó có thể là lý do cho downvote. – benekastah

1

Biết điều gì đã giúp ích cho điều gì đó kỳ lạ. Tôi đã cố gắng sử dụng Google Dịch (http://translate.google.com/translate_tools?hl=vi) trên một ứng dụng web di động và mọi lúc ngôn ngữ được thay đổi, nó vẫn tiếp tục chèn một thanh ở trên cùng làm con đầu tiên của tài liệu. thân hình . Hiện tại, tôi đang theo dõi cookie 'googtrans' và thực hiện việc này

listenCookieChange('googtrans', function() { 
    $(document.body).css('top','0px'); 
}); 
Các vấn đề liên quan