Добавить функцию cookie / no-repeat для случайного обновления страницы
Я использовал этот код Java для вызова случайной HTML-страницы из списка 49 по заданному таймеру (или при обновлении страницы). Я хотел бы преобразовать его так, чтобы cookie - или что-то еще - сохраняло страницы, которые уже были показаны, чтобы при обновлении пользователь всегда получал новую страницу до тех пор, пока список не будет завершен, после чего файл cookie будет удален / удален,
Я нашел этот код для массива изображений cookie. Могу ли я использовать это с этим? Вариант этого также появляется здесь. Извините, мое кодирование довольно плохое. Любой совет приветствуется:
<script type="text/javascript">
var sites = [
"name1.html",
"name2.html",
"name3.html",
"name...etc.html",
"name49.html",
]
$(document).ready(function() {
newPage();
});
function newPage()
{
setTimeout(newPage, 60000);
var min = 0;
var max = 48;
var num = Math.floor(Math.random() * (max - min + 1)) + min;
$('#target').attr('src',sites[num]);
}
</script>
2 ответа
var numSites = 49;
var seen = new Array(numSites);
$(document).ready(function() {
var cookie = unescape(getCookie("seen"));
seen = cookie ? cookie.split(',') : seen;
setTimeout(gotoNext, 60000);
});
function gotoNext() {
var num = getRandom();
var count = 0;
while (seen[num] == 1) {
num++;
if (num >= numSites) {
num = 0;
count++;
if (count > 1) {
resetSeen();
num = getRandom();
}
}
}
seen[num] = 1;
setCookie("seen", escape(seen.join(',')), 365);
window.location = "name" + num + ".html";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length, c.length);
}
return "";
}
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
function resetSeen() {
for (var i=0; i<numSites; i++) {
seen[i] = "";
}
}
function getRandom() {
return Math.ceil(Math.random() * numSites);
}
Похоже, вы используете jQuery, поэтому я рекомендую использовать плагин jquery для более аккуратного управления файлами cookie.
Скопируйте и вставьте содержимое этого URL в новый файл js на вашем сервере и добавьте его после файла jquery: https://raw.githubusercontent.com/carhartl/jquery-cookie/master/jquery.cookie.js
Или вы могли бы использовать функции получения / установки cookie из другого упомянутого вами ответа.
Главное помнить, что куки хранятся в виде строки, поэтому вы будете join()
и split()
в массиве.
Еще одна вещь, на которую стоит обратить внимание, это то, что, поскольку мы хотим получить случайный элемент из предметов, которые мы еще не посетили, более эффективно отслеживать их, а не те, которые мы посетили.
Это означает, что мы всегда выбираем случайный элемент из того, что осталось, вместо того, чтобы зацикливаться на всем и каждый раз проверять, были ли мы там уже, так как это очень неэффективно.
var sites = [ 'name1.html', 'name2.html', 'name3.html', ...etc... ],
unvisited = sites.slice(0); // .slice(0) clones the array
// if the cookie has a value then make it into the unvisited array
if ( $.cookie( 'unvisited' ) )
unvisited = $.cookie( 'unvisited' ).split( ',' );
$(document).ready(function() {
newPage();
});
function newPage() {
setTimeout( newPage, 60000 );
// check if the unvisited array needs resetting
if ( unvisited.length == 0 ) {
unvisited = sites.slice(0);
$.removeCookie( 'unvisited' );
}
// get a new index from the unvisited array
var num = Math.floor( Math.random() * unvisited.length );
// remove the item from the array and save the cookie
var site = unvisited.splice( num, 1 )[ 0 ];
// save the unvisited array minus the site we just spliced out
$.cookie( 'unvisited', unvisited.join( ',' ) );
$( '#target' ).attr( 'src', site );
}