2016-04-20 38 views
0

我有這段代碼,我用它來向用戶展示只有當他們以前沒有看到它時才彈出的facebook。代碼是非常簡單的,去如下:加載cookie後調用JavaScript函數

function setCookie(cname, cvalue, exdays) { 
    var now = new Date(); 
    var time = now.getTime(); 
    var expireTime = time + 1*36000; 
    now.setTime(expireTime); 

    document.cookie = 'seen_fb_like=true;cookie=ok;expires='+now.toGMTString()+';path=/'; 
} 

function getCookie(cname) { 
    var value = "; " + document.cookie; 
    var parts = value.split("; " + cname + "="); 
    if (parts.length == 2) return parts.pop().split(";").shift(); 
} 

window.onload = function() { 
    var seen = getCookie("seen_fb_like"); 
    if(!seen) { 
    document.getElementById('popup-container').style.display = ("block"); 
    setCookie(); 
} 
} 
我的本地機器驗證碼擔任希望在

,但將它部署到我的服務器後,我看到每一個現在,比我看到彈出看到它幾後甚至幾秒鐘前。我認爲這可能是因爲有時window.onload函數是在加載cookie之前執行的,但是我找不到任何文檔來表示同意......任何想法我該如何處理這個問題?

+3

「我認爲這是因爲有時window.onload函數在加載cookie之前執行」 - 不,不會發生。 – Quentin

+0

從cookie中刪除路徑。如果您導航出該路徑,那麼cookie將不再存在。如果路徑不存在,那麼它將被讀取爲整個域。 – Archer

+0

打印cookie的值?也許它沒有被設置或在某個地方被改變? – NickSlash

回答

-2

您可以提供getCookie的重載,它接受回調函數,並在檢索到所需的cookie後使該函數顯式執行。

+0

如果你還提供了對downvotes的解釋,我將不勝感激,這樣我也可以學到一些東西。 – DrinkBird

+0

鑑於cookie已經存在,也許你可以解釋「在檢索到所需的cookie之後」的意思,以及更多關於回調函數如何提供幫助的內容。基於OP代碼的示例代碼也是更有用的答案。 –

+0

謝謝你的幫助。我的回答是基於getCookie函數異步執行的錯誤假設。 – DrinkBird

0

讀取cookie值沒有任何異步。所以代碼的流程沒有問題。

您確定cookie是否存在缺陷的方式。如果cookie是第一個值,那麼您的代碼將不會檢測到它,因爲那裏不會有分號。所以也許這就是爲什麼它偶爾不能工作,因爲它是cookie中的第一項。

使用正則表達式方法檢查cookie。 MDN Simple Cookie Framework有例子。

var docCookies = { 
    getItem: function (sKey) { 
    if (!sKey) { return null; } 
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null; 
    }, 
    ... 
}; 
相關問題