Итак, я новичок в PWA и JS, поэтому мне жаль, если мой вопрос и / или моя терминология будут звучать глупо ...
У меня есть TYPO3 -Extention ajaxselectlist , и это простой список выбора с вызовом AJAX, и я хочу перевести его в автономный режим с помощью Service Worker. Это мой сервисный работник:
**sw.js**
var dataCacheName = 'pwa-typo3-dynamic-v1';
var cacheName = 'pwa-typo3-v2';
var filesToCache = [];
self.addEventListener('install', e => {
e.waitUntil(
caches.open(cacheName).then(cache => {
return cache.addAll([
'/',
//HTML/JS
'/fileadmin/templates/index.html',
'/fileadmin/templates/artikel.html',
'/fileadmin/templates/js/bootstrap.min.js',
'/fileadmin/templates/js/holder.min.js',
'/fileadmin/templates/js/custom.js',
'/fileadmin/templates/js/jquery-slim.min.js',
'/fileadmin/templates/js/popper.min.js',
//CSS
'/fileadmin/templates/css/bootstrap.min.css',
'/fileadmin/templates/css/blog.css',
//Fonts
//Images
])
.then(() => self.skipWaiting());
})
)
});
self.addEventListener('fetch', (event) => {
event.respondWith(async function() {
const cache = await caches.open('pwa-typo3-dynamic-v1');
const cachedResponse = await cache.match(event.request);
if (cachedResponse) return cachedResponse;
const networkResponse = await fetch(event.request);
event.waitUntil(
cache.put(event.request, networkResponse.clone())
);
return networkResponse;
}());
});
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 && key !== dataCacheName) {
console.log('[ServiceWorker] Removing old cache', key);
return caches.delete(key);
}
}));
})
);
return self.clients.claim();
});
и шаблон для списка выбора Ajax с вызовом AJAX:
<f:layout name="Default"/>
<f:section name="main">
<f:if condition="{optionRecords}">
<f:then>
<f:form
action="ajaxCall"
object="{optionRecord}"
name="optionRecord"
id="ajaxselectlist-form">
<f:form.select
options="{optionRecords}"
optionLabelField="title"
class="ajaxFormOption"
name="optionRecord"/>
<f:form.hidden name="action" value="ajaxCall"/>
<input type="hidden" name="type" value="{settings.typeNum}">
<input type="hidden" name="L" value="{sysLanguageUid}">
</f:form>
</f:then>
<f:else>
<f:translate key="tx_ajaxselectlist_domain_model_optionrecord.noEntriesFound"/>
</f:else>
</f:if>
<f:comment>The record entry is loaded inside this element.</f:comment>
<div id="ajaxCallResult"></div>
<script>
jQuery(document).ready(function ($) {
var form = $('#ajaxselectlist-form');
var selectForm = $('.ajaxFormOption');
var resultContainer = $('#ajaxCallResult');
var service = {
ajaxCall: function (data) {
$.ajax({
url: 'index.php',
cache: true, // default: false
data: data.serialize(),
//success: function (result) {
//resultContainer.html(result).fadeIn('fast');
// IMPORTANT! When using a lightbox for images, you'll need to call it again after Ajax is done adding the new DOM to the document:
// $('.lightbox').magnificPopup({
// type: 'image'
// });
//},
success: function(result) {
console.log(typeof(result));
resultContainer.html(result).fadeIn('fast');
},
error: function (jqXHR, textStatus, errorThrow) {
resultContainer.html('Ajax request - ' + textStatus + ': ' + errorThrow).fadeIn('fast');
}
});
}
};
form.submit(function (ev) {
ev.preventDefault();
service.ajaxCall($(this));
});
selectForm.on('change', function () {
resultContainer.fadeOut('fast');
form.submit();
});
selectForm.trigger('change');
});
</script>
</f:section>
Я просто не понимаю, как правильно кэшировать запросы XHR. Результаты, кажется, кешируются, я имею в виду структуру HTML и содержание:
Не уверен, почему он получил длину содержимого 0, хотя
Должен ли я переписать Service Worker или AJAX Call, чтобы он как-то не выполнялся в автономном режиме?
Буду признателен за каждый вклад! Большое спасибо!