Задать вопрос
  • Как правильно установить setTimeout() в расширении для хрома?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Пример:
    Развернуть код
    function waitElements(selector, regexp, where) {
    	
    	return new Promise(function(returnResult) {
    		
    		var search_result = false;
    		
    		var local_reactive_function = function() {
    			
    			var wait_elements = searchElements(selector, regexp, where);
    			
    			if (wait_elements.length > 0) {
    				
    				if (search_result === false) {
    					
    					search_result = true;
    					observer.disconnect(); 
    					
    					returnResult(wait_elements);
    					
    				}
    				
    			}
    			
    		}
    		
    		var observer = new MutationObserver(local_reactive_function);
    		
    		observer.observe(document.body, {
    			characterData: true,
    			attributes: true,
    			childList: true,
    			subtree: true
    		});
    		
    		local_reactive_function();
    		
    	});
    	
    }
    
    function searchElements(selector, regexp, where) {
    
    	var search_elements = [];
    	
    	if (typeof where !== 'undefined') {
    		
    		var all_elements = where.querySelectorAll(selector);
    		
    	}
    	
    	else {
    		
    		var all_elements = document.querySelectorAll(selector);
    		
    	}
    	
    	for (var n = 0; n < all_elements.length; n++) {
    		
    		if (typeof regexp == 'object') {
    			
    			if (typeof regexp.test == 'function') {
    				
    				if (regexp.test(all_elements[n].innerText.trim())) {
    					
    					search_elements.push(all_elements[n]);
    					
    				}
    				
    			}
    			
    			
    		}
    		
    		else {
    			
    			search_elements.push(all_elements[n]);
    			
    		}
    	}
    	
    	return search_elements;
    
    }

    Функция waitElements возвращает промис, который завершается при появлении указанных элементов.

    Например, чтобы дождаться появления на странице элемента с классом .class достаточно выполнить в консоли:
    elements = await waitElements('.class');
    
    console.log('Элементы успешно найдены:');
    console.dir(elements);
    Ответ написан
    Комментировать
  • Как создать свой шаблон ответа Rest Api в Nest js?

    dilikpulatov
    @dilikpulatov Автор вопроса
    веб-программист
    Решил вот так. Если у вас есть решения по лучше, напишите)
    614f7bd4244d4591401549.png
    Ответ написан
    Комментировать
  • Изображение и шрифты отображаются только при использовании плагина live server в VSCode. Почему?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Откройте в браузере консоль разработчика и посмотрите сообщения. Наверняка там будут записи о запрете доступа к файлам из-за схемы file://
    Ответ написан
    1 комментарий
  • Как использовать switch case в vue?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    <template>
        <i :class="getIconNameByType(type)"/>
      </template>


    setup () {
      function getIconNameByType (type) {
        const iconsMap = {
          'image/svg': 'fas file-icon fa-image',
          'image/jpeg': 'fas file-icon fa-image',
          'image/jpg': 'fas file-icon fa-image',
          'text/javascript': 'fas file-icon fa-image',
          // ....
        };
    
        return iconsMap[type];
      }
    
      return {
        getIconNameByType
      };
    }
    Ответ написан
    1 комментарий
  • Какой алгоритм работы с JWT token?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    При авторизации выдаются сразу оба токена, рабочий и refresh. Refresh-токен сохраняется в базе сервера вместе с идентификатором пользователя, рабочий токен хранить смысла нет.

    Срок жизни записан в самом токене, как одно из полей полезной нагрузки (payload). Прочитать это поле может и сервер и клиент. Сервер в любом случае должен контролировать срок жизни токена, клиент может это делать сам, а может просто реагировать на ответы сервера.

    Каждый запрос к серверу сопровождается рабочим токеном. Если срок жизни рабочего токена истёк, то сервер возвращает сообщение о необходимости обновления токена.

    Запрос на обновление сопровождается refresh-токеном.
    Если refresh-токен в базе помечен как уже использованный, то инактивируются (удаляются из базы) все refresh-токены данного пользователя и возвращается сообщение о необходимости повторной авторизации.
    Refresh-токен отмечается в базе как использованный .
    Если срок действия refresh-токена истёк или такого refresh-токена нет в базе сервера, то возвращается сообщение о необходимости повторной авторизации.
    Возвращается новая пара токенов.

    Где и как хранить токены на клиенте - вопрос предпочтений. Можно не хранить вообще, тогда при перезагрузке страницы пользователю придётся авторизоваться заново. Можно сохранять только refresh-токен, выполняя запрос на обновление при запуске приложения / открытии страницы.
    Ответ написан
    4 комментария
  • Аналог filezilla в убунту?

    shambler81
    @shambler81 Куратор тега Linux
    друг мой все очень просто до безобразия,
    1. вариант ты в обычном навигаторе коннектишся к FTP и сохраняеш ярлык, собственно все никаких клиентов не нужно все будет работать и так.
    611a00c0b39f1642530790.png
    Появится просто тут быстрая ссылка

    2. ты просто монтируешь нужные тебе сервер через
    https://help.ubuntu.ru/wiki/%D0%BC%D0%BE%D0%BD%D1%...

    3. монтируешь через фстаб
    curlftpfs#ftp.server.ru  /mnt/ftp  fuse  noauto,user=UsEr:PaSsWd,allow_other,default_permissions,umask=027,_netdev   0 0

    Во всех случаях ты получаешь локальный доступ бесшовный и безсофтверный, и можешь пользовать фтп как обычным локальным диском, куда тебе еще более удобный вариант ?
    Ответ написан
  • Все файлы формата кроме конкретного?

    PageAuditRU
    @PageAuditRU
    Senior SEO Анализатор
    Приоритеты location, но лучше в оригинальной доке почитать.
    location = my.jpg {
      ...
    }
    
    location ~* ^.+\.(...|ico|jpeg|jpg|...)$ {
      ...
    }


    или вот так

    location ~ ^my\.jpg$ {
      ...
    }
    
    location ~* ^.+\.(...|ico|jpeg|jpg|...)$ {
      ...
    }
    Ответ написан
    5 комментариев
  • Как изменить цвет шрифта для новых файлов Git?

    @jazzus Автор вопроса
    Все работает с addedResourceForeground, не те файлы смотрел)
    Ответ написан
    Комментировать
  • Как создать define для одного vue документа?

    SeaInside
    @SeaInside
    16 лет пилю все эти штуки
    Судя по всему, вам нужно просто заменять одну строку на другую?
    В webpack такие преобразования делаются с помощью лоадеров, например, вам может подойти string-replace-loader (сам не пользуюсь, но по тексту задачи - почему бы и не да).

    Но вообще это странно, на несуществующий в данном контексте SOMETHING будет ругаться и IDE, и линтеры, да и вообще это какая-то магия, а чем меньше магии, тем лучше.
    Если приведёте конкретный пример, а не абстрактный SOMETHING, то будет понятнее, чего вы хотите и, вероятно, можно будет посоветовать более очевидное решение.
    Ответ написан
    Комментировать
  • Как в service worker добавить заголовок X-Powered-By?

    @newaitix Автор вопроса
    var version='5.4.3.5';
    self.addEventListener('install',function(ev){
    	ev.waitUntil(caches.open(version).then(function(cache){
    		if(location.protocol=='http:'||location.protocol=='https:'){
    			return fetch('/resource.json').then(function(res){
    				return res.json();
    			}).then(function(files){
    				return cache.addAll(files);
    			});
    		}
    	}));
    	self.skipWaiting();
    });
    self.addEventListener('activate',function(ev){
    	ev.waitUntil(caches.keys().then(function(keyList){
    		return Promise.all(keyList.map(function(key){
    			if(version!=key){
    				return caches.delete(key);
    			}
    		}));
    	}));
    });
    self.addEventListener('fetch',function(ev){
    	ev.respondWith(caches.match(ev.request).then(function(res){
    		return res||fetch(ev.request).then(function(res){
    			var resToCache=res.clone(),
    				newHeaders=new Headers(resToCache.headers);
    			newHeaders.append('X-Powered-By','nginx');
    			var anotherResponse=new Response(resToCache.body,{
    					status: resToCache.status,
    					statusText: resToCache.statusText,
    					headers: newHeaders
    				});
    			caches.open(version).then(function(cache){
    				if(ev.request.method!='POST'&&(new URL(ev.request.url).protocol=='http:'||new URL(ev.request.url).protocol=='https:')){
    					cache.put(ev.request,anotherResponse);
    				}
    			});
    			return res;
    		}).catch(function(){
    			return caches.match('/offline.html');
    		});
    	}));
    });
    Ответ написан
    Комментировать
  • Как работает веб-сервер и node js в связке? Зачем нужен Nginx?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Самое простое - nginx отдаёт статику. На больших объёмах делать это через Ноду неэффективно.
    Посложнее - nginx позволяет управлять ходом запроса. Например, редиректить на https.
    Ещё сложнее - можно настроить nginx, чтобы он умно балансировал запросы между несколькими бэкендами и автоматом блокировал слишком частые попытки подключения.

    Nginx очень хорошо в промышленных масштабах делает определённую часть работы, связанной с http-запросом, поэтому ему эту часть работы и делегируют.
    Ответ написан
    Комментировать
  • Как с помощью JS автоматически повернуть экран пользователя на мобильном устройстве?

    Stalker_RED
    @Stalker_RED
    Lynn «Кофеман», неправда, не только сообщение. Можно сделать
    document.body.style.transform = 'rotate(90deg)'; // попробуйте в консоли

    И ширину с высотой подкорректировать.
    Ответ написан
    5 комментариев
  • Как прописывать типы для связывания их с библиотечным кодом?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Нужен код. Вопрос абстрактный слишком. (или ты не заключил код в тег <code></code> :) )
    Получить тип из имеющейся функции: type Fuc = typeof func;.
    Получить тип параметров передаваемых в функцию и тип возвращаемого значения: Parameters<Func> и ReturnType<Func> соответсвенно.
    Для сложных типов с дженериками - смотреть надо отдельно.
    Ответ написан
    1 комментарий
  • Как попасть в "Список организаций" при поисковом запросе Яндекса?

    deepblack
    @deepblack
    Настроить Обогащённые ответы:
    Обогащённые ответы — это разновидность сниппетов, или блоков поисковой выдачи. Такие сниппеты, помимо заголовка веб-страницы и её описания, содержат дополнительные данные: картинки, ссылки на разделы сайта, адреса и телефоны и так далее. Обогащённые ответы позволяют пользователям быстрее получить ответ на свой вопрос, а владельцам сайтов — привлечь больше посетителей на свой ресурс.
    Ответ написан
    Комментировать
  • Как в Nginx применить одни настройки сразу ко всем хостам?

    один раз придется все конфиги дополнить инструкцией include common.conf;

    Создать этот файл common.conf и в него помещать общие инструкции.

    Как вариант, скрипт написать, который вставит дополнение в каждый конфиг.
    Ответ написан
    1 комментарий
  • Есть ли возможность бесконечно увеличивать css свойство с помощью анимации?

    Stalker_RED
    @Stalker_RED
    Для CSS анимации обязательно нужно задать начальную и конечную точки, так что бесконечно не получится.
    Но на самом деле вам и не нужна бесконечность, т.к. браузер сломается примерно на 34 млн пикселей. Так что можете задать достаточно большое число, к примеру 30 млн, и подобрать нужную скорость. И ждите крэшрепорты от юзеров, у которых кончилась память)
    Ответ написан
    Комментировать
  • Как уникализировать массив объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Собираем ключ-значение, выдёргиваем значения:

    [...new Map(arr.map(n => [ n.value, n ])).values()]
    
    // или
    
    Object.values(arr.reduce((acc, n) => (acc[n.value] ??= n, acc), {}))

    Фильтрация, запоминаем кого встретили, первый раз пропускаем, остальные нет:

    arr.filter(function(n) {
      return !(this[n.value] = this.hasOwnProperty(n.value));
    }.bind({}))
    
    // или
    
    arr.filter(function({ value }) {
      return !this.set(value, this.has(value)).get(value);
    }, new Map)
    
    // или
    
    arr.filter(((picked, { value: n }) => !picked.has(n) && picked.add(n)).bind(null, new Set))

    Фильтрация, ищем элемент похожий на текущий, его же и нашли - окей:

    arr.filter((n, i, a) => n === a.find(m => m.value === n.value))
    
    // или
    
    arr.filter((n, i, a) => i === a.findIndex(m => Object.is(m.value, n.value)))

    Ну и чего-нибудь странного ещё добавим:

    Array.from(
      new Set(arr.map(n => n.value)),
      n => arr.find(m => m.value === n)
    )
    
    // или
    
    arr
      .slice()
      .sort((a, b) => a.value.localeCompare(b.value))
      .filter((n, i, a) => n.value !== a[i - 1]?.value)
    Ответ написан
    1 комментарий
  • Как заблокировать доступ к сайтам в NGINX?

    @dodo512
    location / {
        proxy_pass http://backend;
    }
    
    location ~ ^/(smokeping|pgadmin4) {
        allow 192.168.11.0/25;
        deny all;
        
        proxy_pass http://backend;
    }
    Ответ написан
    1 комментарий
  • Как реализовать SSR без использования глобального хранилища (на примере Vue 3)?

    @MEDIOFF
    Python Developer
    А причем у вас Vuex и SSR? Vuex просто хранит состояние - нет Vuex нет состояния, вы ничего не прокидываете на клиент с сервера, клиент каждый раз ходит к вам за новой страничкой, и вы ему отдаете ее уже наполненную со всеми данными - это и есть SSR, к примеру у вас обычно Vue получает список товаров с сервера, как получит показывает карточки, с SSR вы отдаете страничку сразу с карточками готовыми.
    По факту SSR нужен для SEO в большей части, так как я не знаю людей которые отрубают js в браузере

    Если нужен SSR, то рекомендую не изобретать велосипед, а посмотреть в сторону Nuxt
    Ответ написан