• Почему может не работать self.addEventListener('fetch', function(e) { }) в PWA?

    kellas
    @kellas
    веб-разработчик
    Этому сервсис-воркеру не передается управление обработкой запросов.
    В общем в activate нужно вызывать self.clients.claim()
    Вот так например:
    self.addEventListener('activate', event => {
      event.waitUntil(self.clients.claim())
    })

    после этого событие fetch начнет отлавливаться

    вот такой же вопрос: https://stackoverflow.com/questions/70331036/why-s...

    вот пример кэширования в сервис-воркере
    /*
     * Caching
     */
    const CACHE_NAME = 'v_17_' + __BUILD_TIME__
    const precacheResources = [__BASE_PATH__, __BASE_PATH__ + '/']
    
    self.addEventListener('install', event => {
      event.waitUntil((async () => {
        const cache = await caches.open(CACHE_NAME)
        await cache.addAll(precacheResources)
        self.skipWaiting()
      })())
    })
    
    self.addEventListener('activate', async event => {
      event.waitUntil(self.clients.claim())
      self.registration.unregister()
    
      // remove old cache from old versions of service worker
      const cacheNames = await caches.keys()
      await Promise.all(cacheNames.map(async cacheName => {
        if (cacheName !== CACHE_NAME) await caches.delete(cacheName)
      }))
    })
    
    self.addEventListener('fetch', async event => {
      event.respondWith(
        caches.match(event.request).then(cachedResponse => {
          if (cachedResponse) return cachedResponse
    
          return fetch(event.request).then(async response => {
            if (event.request.method === 'GET' && event.request.url.startsWith('http') &&
            !event.request.url.includes('/api/')) {
              const cache = await caches.open(CACHE_NAME)
              await cache.put(event.request, response.clone())
            }
            return response
          })
        })
      )
    })
    Ответ написан
    6 комментариев
  • Как динамически увеличить родительский блок в зависимости от градуса поворота дочернего?

    @historydev Куратор тега JavaScript
    Редактирую файлы с непонятными расширениями
    const rotate = document.querySelector("#rotate");
    const container = document.querySelector(".container");
    
    container.style.transform = `rotate(${45}deg)`;
    
    rotate.addEventListener('input', (e) => {
      const degree = +e.target.value;
      const scaleStep = degree*0.001;
      const scale = degree === 0 && 1 || degree === 360 && 1 || scaleStep > 1 && 1 || scaleStep < 0.75 && 0.75 || scaleStep;
      container.style.transform = `scale(${scale}, ${scale}) rotate(${degree}deg)`;
    });
    Ответ написан
    2 комментария
  • Можно ли через веб-сайт вызвать интерактивное окно apple wallet/google pay?

    chiliec
    @chiliec
    iOS-разработчик
    Для Эппл нужно сгенерировать для клиента файл .pkpass
    Есть прекрасная библиотека для генерации https://github.com/tinovyatkin/pass-js

    У Гугла свой формат https://developers.google.com/wallet
    Онлайн-генератор: https://developers.google.com/wallet/tickets/event...
    Ответ написан
    Комментировать
  • Как на canvas увеличить толщину линий картинки?

    @4ce
    Привет всем!
    автор вопроса я не совсем понял твой вопрос...


    Если задача увеличить толщину линии в canvas то наверное
    line width canvas
    https://www.google.com/search?q=line+width+canvas
    CanvasRenderingContext2D.lineWidth
    https://developer.mozilla.org/en-US/docs/Web/API/C...

    |||
    CanvasRenderingContext2D.lineWidth=16;

    где "16" толщина линии в пикселях...

    Пример похожей рисовалки можно найти на Хабре:
    https://habr.com/ru/company/vdsina/blog/523306/
    |||
    Код в виде .html страницы из статьи (это спойлер нажми на эту строчку чтобы развернуть)
    <canvas id="v">
    <script>
    d=document, // shortcut for document
    d.body.style.margin=0, // reset style
    f=0, // mouse-down flag
    c=v.getContext("2d"), // canvas context
    v.width=innerWidth, // make canvas element fullscreen
    v.height=innerHeight,
    //vvvvvvvvvvvvv
    c.lineWidth=16, //<= make lines a bit wider
    //^^^^^^^^^^^^^
    x=e=>e.clientX||e.touches[0].clientX, // get X position from mouse/touch
    y=e=>e.clientY||e.touches[0].clientY, // get Y position from mouse/touch
    d.onmousedown=d.ontouchstart=e=>{f=1,e.preventDefault(),c.moveTo(x(e),y(e)),c.beginPath()},
    d.onmousemove=d.ontouchmove=e=>{f&&(c.lineTo(x(e),y(e)),c.stroke())},
    d.onmouseup=d.ontouchend=e=>f=0
    </script>


    Но в вопросе уже готовая картинка возможно нужно увелечить линии именно в ней через canvas...
    ^эту часть ответа считаю сложной и не обязательной...
    |||
    Для этих целей я поместил картинку в canvas и написал(переписал) svg фильтр на основе этой статьи:
    https://tympanus.net/codrops/2019/01/22/svg-filter...
    ^если честно не уверен что составлю по памяти такой же не запутавшись...
    |||
    Для понятности значения в фильтре которые могут быть названы как угодно я отметил единичками в конце
    Код в виде .html странцы (изображение должно быть в той же папке что и исполняемый файл и это спойлер нажми на эту строчку чтобы развернуть)
    <title>canvas svg filter</title>
    <svg width="0" height="0">
    <filter id="outline1" color=red>
    <feMorphology result="shadowFiler1" operator="dilate" radius="4"/>
    <!--                                            filter radius ^-->
    <!--vvvvv if color no need you can delete this vvvvv-->
    <feFlood flood-color="#44CCEE"  result="shadowColor1"/>
    <!--     ^^^^^^^^^^^^^ color ^                      -->
    <feComposite in="shadowColor1" in2="shadowFiler1" operator="in" result="colorAndShadow1"/>
    <!--^^^^^^^^^^^^^^^^^^^^^^ if color not need you can delete this ^^^^^^^^^^^^^^^^^^^^^^-->
    <feMerge>
    <feMergeNode in="colorAndShadow1"/>
    <feMergeNode in="SourceGraphic"/><!-- this line not need if you want only filter color-->
    </feMerge>
    </filter>
    </svg>
    <canvas id="canvas1"></canvas>
    <img id="image1" src="6422b38e42f09806476147.png"  style="display:none">
    <script>
    canvas0=canvas1.getContext('2d');
    image1.onload=function(){
    canvas1.width=image1.width;
    canvas1.height=image1.height;
    canvas0.filter = 'url(#outline1)';// Draw image with filter
    canvas0.drawImage(image1,0,0,image1.width,image1.height);// Draw image with filter
    }
    </script>

    |||
    Кааартинки!!! (это спойлер нажми на эту строчку чтобы развернуть)

    |||
    Картинка с тенью из вопроса
    642580e7078aa916053395.png
    |||
    Картинка новым цветом и утолщённой линей из вопроса
    642580f4c6d68164763192.png
    |||
    Картинка с утолщённой линей из вопроса
    642581455877b798391550.png


    ~_^ Удачи!
    Ответ написан
    Комментировать
  • Как зашить анимацию в картинку на canvas?

    GavriKos
    @GavriKos
    То что там расширение PNG - не значит что внутри PNG. Внутри там обычный GIF, просто так переименовали. Это видно если открыть любым текстовым/HEX редактором. Браузеры и многие вьюверы на расширение не смотрят, а смотрят на заголовок файла - поэтому анимация и проигрывается
    Ответ написан
    Комментировать