API вызывает linkpreview и как убедиться, что все извлечено
Сено,
Я пытаюсь создать веб-приложение для публикации внешнего интерфейса, где вы можете помещать URL-адреса непосредственно из внешнего интерфейса в базу данных.
Содержимое базы данных вызывается в веб-приложении и отображается как новостной поток на Facebook. Для извлечения контента (изображений, описания и т. Д.) Из URL я использую API.
Пока что все работает нормально, ожидая функциональности Linkpreview. Я пытался сделать это несколькими способами, но каждый раз, когда страница загружается, извлекается только одна ссылка / просмотр / ссылка. "Обходной путь" должен обновляться, пока все URL извлечены. Это означает, что для 5 сообщений, около 5 обновлений.
Я собираюсь избежать такого поведения и хочу, чтобы все URL-адреса были извлечены после посещения пользователем.
Каково ваше мнение по этому вопросу? Это что-то вроде кеширования?
Это JS-код, вызывающий контент из базы данных, создающий новые div и вставляющий контент. "GuteUrls.execute();" это метод, который вызывается для вставки URL-адреса и выполнения предварительного просмотра ссылки:
let invRef = database.ref('innovation');
let desRef = database.ref('design');
let tecRef = database.ref('tech');
let worRef = database.ref('work');
let ref = [invRef, desRef, tecRef, worRef];
for(let j = 0; j < ref.length; j++)
ref[j].on("child_added", function(snapshot, prevChildKey) {
let newPost = snapshot.val();
let card = document.createElement('div');
card.setAttribute('class', 'linkprev');
$('#content').prepend($(card));
card.append(newPost.link);
guteUrls.execute();
Это HTML (я полагаю, это не требуется для этой проблемы, но для того, чтобы сделать его более прозрачным):
<!DOCTYPE html>
<html manifest="cache.appcache" lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>the daily repost – a front end publishing platform</title>
<!--Webapp manifest-->
<link rel="manifest" href="webapp/manifest.json">
<script src="https://cdn.rawgit.com/GoogleChrome/pwacompat/v1.0.3/pwacompat.min.js"></script>
<!--Caching manifest-->
<script>
window.applicationCache.update(); // try to refresh the cache
window.applicationCache.status // refreshed?
window.applicationCache.swapCache // set new cache
</script>
<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!-- firebase -->
<script src="https://www.gstatic.com/firebasejs/4.6.2/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.6.2/firebase-auth.js"></script>
<script>
var config = {
apiKey: "…",
authDomain: "…",
databaseURL: "…",
projectId: "…",
storageBucket: "…",
messagingSenderId: "…"
};
firebase.initializeApp(config);
var database = firebase.database();
</script>
<!-- Linkpreview API -->
<script
src="https://guteurls.de/guteurls.js"
selector='.linkprev'
gif="http://loading.io/assets/img/default-loader.gif"
callback-a="(function(jqueryElement,url,$){console.log('url:'+url)})"
callback="(function($){$('#loader-wrapper').fadeOut()})"
init="(function($){console.log('JS will start to search URLs now')})">
</script>
<!--material-design lib-->
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
<!--AOSlib-->
<link href="css/aos.css" rel="stylesheet">
<script src="js/aos.js"></script>
<!--Tagfunctionality-->
<script src="js/jquery.tagsinput.js"></script>
<link rel="stylesheet" type="text/css" href="css/jquery.tagsinput.css" />
<!--Document stylesheet-->
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" />
<!--Loadinganimation on entering-->
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
</div>
<!--AddToHomeScreen for IOS-->
<script src="js/addtohomescreen.js"></script>
<script src="js/addtohomescreen.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/addtohomescreen.css">
<script>
addToHomescreen();
</script>
</head>
<body>
<!--Authentification formular-->
<div id="authfield">
<div class="authcontent">
<h5>Hey, welcome to daily repost</h5>
<div class="msg">Please log-in or create an account</div>
<form action="#">
<div class="mdl-textfield mdl-js-textfield">
<input class="mdl-textfield__input" type="text" id="txtEmail" placeholder="e-mail">
</div>
</form>
<form action="#">
<div class="mdl-textfield mdl-js-textfield">
<input class="mdl-textfield__input" type="password" id="txtPassword" placeholder="password">
</div>
</form>
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect" id="btnlogin">
Log-in </button>
<button id="btnsignup" class="txtbutton">Create a new account with this credentials</button>
</div><!--/authcontent-->
</div><!--/authfield-->
<!--LogOutbutton-->
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect" id="btnlogout">Log-out</button>
<!--Addbutton for new posts-->
<button id="show" class="show mdl-button mdl-js-button mdl-button--fab" onclick="funcShow(this); + funcHide(this);">
<i class="material-icons">add</i>
</button>
<!--/Inputfield for new posts-->
<div id="Overlay" name="Overlay" class="overlay">
<div id="inputwrapper">
<div id="close" class="close" onclick="funcClose(this);">X</div>
<!-- Textfield with Floating Label Materialdesign-->
<form action="#" method="post" name="contactForm" id="form" autocomplete="off">
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" id="url" type="url" required name="url" class="input" value="">
<label class="mdl-textfield__label" for="sample3">Share a great post...</label>
</div><!--/mdl-textfield…-->
<!-- Input for Tags-->
<input name="tags" id="tags" value=""/>
</form>
<!--Buttons for pushing into DB-areas-->
<div class="category">
<button id="button" class="f f1" >innovation</button>
<button id="button" class="f f2" >design</button>
<button id="button" class="f f3" >tech</button>
<button id="button" class="f f4" >work</button>
</div><!--/category-->
</div><!--/inputwrapper-->
</div><!--/Overlay-->
<!--<button id="btntest" onclick = "displayLoginBox()">check</button>-->
<!--Contentarea, where JS will put the content from the DB-->
<div id="content" class="listcontent inactiveLink"></div>
<!-- Scripts -->
<script src="js/script.js"></script>
<script src="js/signupform.js"></script>
<script>$('#tags').tagsInput();</script>
</body>
<!--Service-worker script-->
<script>
/*if ('serviceWorker' in navigator) {
console.log("Will the service worker register?");
navigator.serviceWorker.register('service-worker.js')
.then(function(reg){
console.log("Yes, it did.");
}).catch(function(err) {
console.log("No it didn't. This happened: ", err)
});
}*/
if ('serviceWorker' in navigator) {
navigator.serviceWorker
.register('./service-worker.js')
.then(function() { console.log('Service Worker Registered'); });
}
let cacheName = 'weatherPWA-step-6-1';
let filesToCache = [];
self.addEventListener('install', function(e) {
console.log('[ServiceWorker] Install');
e.waitUntil(
caches.open(cacheName).then(function(cache) {
console.log('[ServiceWorker] Caching app shell');
return cache.addAll(filesToCache);
}));
});
self.addEventListener('activate', function(e) {
console.log('[ServiceWorker] Activate');
e.waitUntil(
caches.keys().then(function(keyList) {
return Promise.all(keyList.map(function(key) {
if (key !== cacheName) {
console.log('[ServiceWorker] Removing old cache', key);
return caches.delete(key);
}
}));
})
);
return self.clients.claim();
});
let filesToCache = [
'/',
'/index.html',
'css/style.css',
'css/aos.css'
];
</script>
</html>
console.log("Link: " + newPost.link);
console.log("Tag: " + newPost.tags);
console.log("Previous Post ID: " + prevChildKey);
});
Спасибо Бен