// Data variables
var infiniteResponse;
var searchBResponse;
// Confirms that there are all the sites on the page
var confirmationOfFullSites;
var sitesOnPage = [];
var brLength= document.querySelectorAll("br").length;
var whereToAddIt= document.querySelectorAll("br")[brLength-1];
var observer = new IntersectionObserver(function(entries){
entries.forEach(function(entry) {
if (entry.isIntersecting) {
getDataInfiniteS();
}
});
});
observer.observe(whereToAddIt);
// XMLData -------
function xmrResponse() {
// Gets info
var xml= new XMLHttpRequest();
xml.onload= function() {
infiniteResponse= xml.responseXML.children[0].children;
};
xml.open("GET", "http://127.0.0.1:5500/JS/InfiniteScrolling/InfiniteScrollingInfo.xml");
xml.send();
}
function xmrResponse2() {
// Gets urls from database
var xml2= new XMLHttpRequest();
xml2.onload= function() {
searchBResponse= xml2.responseXML.children[0].children;
};
xml2.open("GET", "http://127.0.0.1:5500/JS/CentralSearchBarInfo/CSearchBarInfo.xml");
xml2.send();
}
// Data checker
function getDataInfiniteS() {
if (infiniteResponse === undefined) xmrResponse();
if (searchBResponse === undefined) xmrResponse2();
InfiniteScrolling();
}
// Actual script
function InfiniteScrolling() {
var section;
var language;
var code;
// Checks in what section of the site you're in
var sections= ["Important.html", "Games.html", "Strange.html", "Cool.html", "Useful.html", "Funny.html", "Edit.html", "Useless.html"];
for (let i= 0; i < sections.length; i++) {
if (location.href.includes(sections[i])) {
section = i;
break;
}
}
// Checks in what language
var languages= ["Espa%C3%B1ol", "Italiano", "Suomalainen", "Deutsch", "Fran%C3%A7ais"];
for (let i= 0; i < languages.length; i++) {
if (location.href.includes(languages[i])) {
language = i;
}
}
if (language === undefined) language = 0;
// It gets the first 5 sites that are already on the page and puts them inside sitesOnPage
if (sitesOnPage[0] === undefined) {
var h2s= document.querySelectorAll("h2");
var site= infiniteResponse[0].children[section].children;
for (var i=0; i < h2s.length; i++) {
if (h2s[i].innerHTML === site[i].textContent.replace(/["]/g, "'").split(", ")[0].replace(/[']/g, "")) sitesOnPage.push(i);
}
}
function randomSiteInfosF(section, siteN) {
// Checks if it's a number and not a string or something else
if (typeof siteN !== "number") return;
if (typeof section !== "number") return;
siteChecker_RNG(section, siteN)
// Infos about the site: desc, img, title
// section \/ the site infos \/
eval(`siteInfo${siteN}= infiniteResponse[0].children[${section}].children[${eval(`randomSite${siteN}`)}].textContent.replace(/["]/g, "'").split(", ")`);
eval(`siteTitle${siteN}= siteInfo${siteN}[0].replace(/[']/g, "")`);
eval(`siteDesc${siteN}= siteInfo${siteN}[1]`);
eval(`siteImg${siteN}= siteInfo${siteN}[2].replace(/[']/g, "")`);
eval(`siteURL${siteN}= siteInfo${siteN}[3]`);
}
function siteChecker_RNG(section, siteN) {
// Checks if it's a number and not a string or something else
if (typeof siteN !== "number") return;
if (typeof section !== "number") return;
// section \/ how many sites \/
var sitesAvailable= infiniteResponse[0].children[section].children.length;
var h2s= document.querySelectorAll("h2");
var randomSiteN= Math.floor(Math.random() * sitesAvailable);
// Return if all sites are loaded
if (h2s.length === sitesAvailable) return;
// Checks if the random number is a correct one
for (var i= 0; i < sitesOnPage.length; i++) {
if (randomSiteN === sitesOnPage[i]) {
siteChecker_RNG(section, siteN)
} else continue;
}
eval(`randomSite${siteN}= randomSiteN`);
}
var howManySitesPerLoad= 3;
for (let i= 0; i < howManySitesPerLoad; i++) {
randomSiteInfosF(section, i);
}
// Creates a new div for the sites loaded from the database
if (document.getElementById("InfiniteScrollingID") === null) {
whereToAddIt.insertAdjacentHTML("afterend", "<div id='InfiniteScrollingID'></div>");
}
for (let i= 0; i < howManySitesPerLoad; i++) {
if (eval(eval(`siteDesc${i}`)).includes('"; "')) {
var lines= eval(eval(`siteDesc${i}`)).split('"; "');
code= `<h2 class="lil" id="${eval(`siteTitle${i}`)}">${eval(`siteTitle${i}`)}</h2>\n<h3 class="lil">${lines[0].replace(/["|\\]/g, "")}</h3>\n<h3 class="lil">${lines[1].replace(/["|\\]/g, "")}</h3>\n<img src="${eval(`siteImg${i}`)}" alt="${eval(`siteImg${i}`).replace(".jpg", "")}" class="lul">\n</br>\n</br>\n<a href="${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}" target="_blank" class="lil">${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}</a>\n</br>\n</br>\n</br>\n</br>`;
continue;
}
code= `<h2 class="lil" id="${eval(`siteTitle${i}`)}">${eval(`siteTitle${i}`)}</h2>\n<h3 class="lil">${eval(eval(`siteDesc${i}`))}</h3>\n<img src="${eval(`siteImg${i}`)}" alt="${eval(`siteImg${i}`).replace(".jpg", "")}" class="lul">\n</br>\n</br>\n<a href="${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}" target="_blank" class="lil">${eval(eval(`siteURL${i}`)).replace(/["]/g, "")}</a>\n</br>\n</br>\n</br>\n</br>`;
document.getElementById("InfiniteScrollingID").insertAdjacentHTML("beforeend", code);
}
for (var i=0; i < howManySitesPerLoad; i++) {
sitesOnPage.push(eval(`randomSite${i}`))
}
brLength= document.querySelectorAll("br").length;
whereToAddIt= document.querySelectorAll("br")[brLength-1];
observer.disconnect()
observer.observe(whereToAddIt)
}
В основном я пытаюсь проверить, является ли сгенерированное число правильным или нет, когда оно вызывается, оно создает бесконечное l oop, которое является рекурсией, если я правильно понял.
"sitesOnPage" - это массив, который со временем заполняется числами (пустыми в начале).
Я знаю, что eval не следует использовать часто и тому подобное. Подсказки, чтобы найти другой способ обойти это, приветствуются тем, что я не использую это часто сам.
Я использую базу данных, чтобы получить все данные для сравнения с числами.
Это является частью кода, который используется для моего сайта в его разделах, http://www.coolwebsites.ml/
https://youtu.be/QDrn_9svt6Y
CodePen: https://codepen.io/Attisalva/pen/pojdZXr?editors=1010
в примере с кодом ручки он загружает дубликаты, которых там быть не должно, и некоторые, которые уже загружены, я упростил работу прототипа, но он создает те же проблемы