2013-07-10 16 views
0

我創建了一個簡單的隨機短語生成器,每當用戶單擊「生成」按鈕時,將短語添加到空div。每次點擊都會導致重新生成該短語。這部分工作就像一個魅力。創建新的cookie或添加新的cookie,如果有人使用jquery/javascript(或php?)

我想顯示每個特定人員生成的最後5個短語(而不是最後5個網站生成的用戶)。也就是說,顯示每次用戶點擊「生成」按鈕時生成的最後五個短語的結果。

我想(或許不正確),最簡單的方法是爲每個生成的短語創建一個cookie,然後顯示每個cookie的內容。

所以,我發現了一個jquery.cookie plugin,我設法得到工作,當有人點擊使用該按鈕創建一個cookie:

$(document).ready(function(){ 
$("#button").click(function() { 
$.cookie('cookie_1', $('#phrase_here').text(), { expires: 7 }); 
}) 
}); 

的問題是,我想存儲最後五句話。使用上述內容,每次點擊都會覆蓋Cookie。所以,我認爲這樣的事情會起作用:

if($.cookie('cookie_1') == null) { 
$(document).ready(function(){ 
$("#button").click(function() { 
$.cookie('cookie_1', $('#phrase_here').text(), { expires: 7 }); 
}) 
}); 
} 
else{ 
$("#button").click(function() { 
$.cookie('cookie_2', $('#phrase_here').text(), { expires: 7 }); 
}) 
}; 

但是,這是發生了什麼事。我點擊按鈕,cookie_1被設置爲div中的文字「#phrase_here」。如果我再次點擊該按鈕,cookie_1將更改爲「#phrase_here」div中的新短語。我認爲我上面的陳述會檢查cookie_1是否存在,如果存在,則創建一個新的,不同的cookie(cookie_2)。如果我點擊按鈕並重新加載頁面,cookie_1仍然設置。但是,如果我點擊該按鈕,它會設置cookie_2而不是cookie_1。不知道爲什麼頁面重新加載是必要的,導致這種行爲(這是我想要的)。

最終,我想使用相同的邏輯存儲5個cookie,如果沒有cookie然後創建一個。有5個之後,然後覆蓋cookie_1。不知道之後會做什麼,因爲我不認爲我可以寫一些會覆蓋cookie_2的東西。

顯然,有一個更好的方法來做到這一點。試圖避免使用數據庫,並在瀏覽器中執行所有操作。我知道這限制了什麼是可能的,並不適合每個人,但沒關係。現在只是一個實驗。

我打算使用JavaScript,jQuery或必要時使用PHP。我只是不確定如何做到最好。希望這個問題有道理。

更新:This code可以很好地創建五個餅乾而不會覆蓋。現在的訣竅是如何在創建五個之後覆蓋第一個cookie,然後覆蓋第二個,等等。

+0

您是否需要最後5個值在瀏覽器會話之後持續存在? – Jon

+0

我會打電話給那個可選的,但不是必需的。 – jonmrich

+0

最近的研究似乎認爲'LocalStorage'可能是比Cookie更好的方式。我還沒有實現它自己,但看看這裏它有很好的瀏覽器支持:http://caniuse.com/localstorage,你可以很容易地存儲陣列,滿足您的要求。 – rtpHarry

回答

1

我已經完全取代了我原來的答覆與下面的代碼。

它在5之後自動循環回去並跟蹤最後一個回合。

$(document).ready(function(){ 
    $("#button").click(function() { 
     setPhraseCookie(); 
    }); 
}); 

function setPhraseCookie() { 
    var cookieIndex = getNextPhraseCookieIndex(); 
    var cookieName = 'cookie_'.concat(cookieIndex); 
    $.cookie(cookieName, $('#phrase_here').text(), { expires: 7 }); 
    $.cookie("next_cookie_index", ++cookieIndex, { expires: 7 }); 
} 

function getNextPhraseCookieIndex() { 
    // first check cookie index exists 
    var cookieIndex = $.cookie('next_cookie_index'); 
    if (cookieIndex != null) { 
     return cookieIndex % 5; // set to number of phrase slots in use 
    } 

    // then check for first empty slot 
    for(var i = 1; i <= 5; i++) { 
     if($.cookie('cookie_'.concat(i)) == null) { 
      return i; 
     } 
    } 

    // then fall back on first slot 
    return 1; 
} 

注意:如果不能找出填補其中一個和所有的5個插槽都滿是默認使用插槽1。我正要張貼此,看到我的回答您的評論 - 它不目前不檢查現有cookie的日期以查看哪個是最早的,它只是使用插槽1.

我可以看到此代碼的潛在問題。理論上,應該總是有一個跟蹤下一個cookie的next_cookie_index,但我想也許在第7天可能會有一些問題,即cookie已經過期,但其他cookie仍然存在。例如,如果他們在前三天之後幾天添加了短語4,則前三個將在7天后過期,然後當添加新的時候,您將有第1,4,5號槽被填滿,因爲它會將其放入第一空閒槽中。這是關心你還是這足以達到目的?

+0

謝謝你。如果有五個cookie,然後覆蓋第一個,然後覆蓋第二個,如何處理該問題的任何想法?也就是說,一旦有五個,覆蓋最舊的cookie。 – jonmrich

+1

非常感謝您的更新。只是試了一下,它的作品完美。聰明的方式來解決問題。你指出的問題總是有意義的,它不會成爲這個目的的問題(雖然很好)。 – jonmrich

+0

對不起......只是想到了一件事。我顯示了通過將jQuery文本添加到div中生成的最後五個短語。你將如何去顯示它們,以最新的頂部和最底部的順序顯示它們?這完全是另一個問題。 – jonmrich

0

你的代碼似乎有點怪我...... 如果你嘗試這樣的:

$(document).ready(function() { 

    $("#button").click(function() { 
     if ($.cookie('cookie_1') == null) { 
      $.cookie('cookie_1', $('#phrase_here').text(), {expires: 7}); 
     } 
     else { 
      $.cookie('cookie_2', $('#phrase_here').text(), {expires: 7}); 
     } 
    }); 
}); 
0

下面的代碼可以幫助你,

$(document).ready(function(){ 
    $("#button").click(function() { 
     if($.cookie('cookie_1') == null) {//if cookie 1 is not set 
      $.cookie('cookie_1', $('#phrase_here').text(), { expires: 7 }); 
     } 
     else if($.cookie('cookie_2') == null){//if cookie 2 is not set 
      $.cookie('cookie_2', $('#phrase_here').text(), { expires: 7 }); 
     } 
     else if($.cookie('cookie_3') == null){//if cookie 3 is not set 
      $.cookie('cookie_3', $('#phrase_here').text(), { expires: 7 }); 
     } 
     else if($.cookie('cookie_4') == null){//if cookie 4 is not set 
      $.cookie('cookie_4', $('#phrase_here').text(), { expires: 7 }); 
     } 
     else if($.cookie('cookie_5') == null){//if cookie 5 is not set 
      $.cookie('cookie_5', $('#phrase_here').text(), { expires: 7 }); 
     } 
    }); 
}); 
+0

這是更好的代碼,但不符合OP要求循環返回以覆蓋cookie_1(如果全部存在)的要求。 – rtpHarry

+0

這工作完美。但是,如果設置了全部五個Cookie,我希望腳本覆蓋第一個Cookie。這似乎很容易。訣竅之後呢?腳本如何知道cookie_1因爲已經有5個cookie而被重寫,所以它應該重寫cookie_2(等等)? – jonmrich

0

由於您不需要在瀏覽器會話之後保留最後5個短語(根據您的評論),您是否可以將這些值存儲在內存中?

$(document).ready(function() { 

    var game = (function() { 

     var phrases = []; 

     return { 

      store: function (phrase) { 
       phrases.push(phrase); 
       game.refresh(); 
      }, 

      refresh: function() { 
       // clear your container displaying the last 5 phrases 
       // loop over phrases 0-5 and display in your container 
      } 
     }; 

    }()); 

    $('#button').click(function (e) { 
     e.preventDefault(); 
     var phrase = $('#phrase_here').text(); 
     game.store(phrase); 
    }); 

}); 
+0

不知道在這裏,這是拉生成的短語(文本在div「短語在這裏」),並保存,然後保存新短語,當點擊按鈕生成另一個短語。 – jonmrich

+0

它是僞代碼。在jQuery點擊功能中,您可以在這裏找到您的短語,例如var phrase = $('#yourDivOrWherever')。text();找到的值最終存儲在該閉包中的「短語」變量中。與Cookie不同,此關閉可防止其他人更改最近生成的短語。如果您希望將這些值保留在瀏覽器會話之外,則可以將「存儲」中的邏輯替換爲使用Cookie或本地存儲。 – Jon