2016-04-20 7 views
0

У меня есть эта часть кода, которую я использую, чтобы показать пользователям facebook, как всплывающее окно, только если они не видели его раньше. код довольно прямо вперед, и идет следующим образом:вызов функции JavaScript после загрузки файла cookie

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. 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; 
    }, 
    ... 
}; 
Смежные вопросы