function escapeRegExp(string) {
return String(string).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
// для оптимизации неплохо бы завернуть в memoize-one
const toSpacedRegExp = (needle, ignoreCase = true) => new RegExp(
needle
.trim()
.split(/\s+/)
.map(chunk => '(' + escapeRegExp(chunk) + ')')
.join('(\\S*(?:\\s+\\S*)+?)'),
ignoreCase ? 'i' : ''
);
// для оптимизации неплохо бы завернуть в memoize-one
const toSomeRegExp = (needle, ignoreCase = true) => new RegExp(
needle
.trim()
.split(/\s+/)
.map(chunk => '(' + escapeRegExp(chunk) + ')')
.join('([\\S\\s]*)'),
ignoreCase ? 'i' : ''
);
// Возвращает либо false, либо массив разделённых совпадний
// smartFind('start found rest', 'found') // ['start ', 'found', ' rest']
// smartFind('start found rest', 'start') // ['', 'start', ' found rest']
// удобно для подсвечивания найденного тупо через i % 2
function smartFind(haystack, needle) {
if (!haystack) return false;
if (!needle) return ['', haystack, ''];
// ищем сначала разделённые пробелами: ва ся => ВАся СЯпкин
let result = haystack.split(toSpacedRegExp(needle));
if (result.length > 1) return result;
// ищем хоть какое-то совпадение: ва ся => ВАСЯ пупкин
result = haystack.split(toSomeRegExp(needle));
return result.length > 1 && result;
}
class CompatibleBounds {
northEast = [0, 0];
southWest = [0, 0];
constructor(bounds) {
Object.assign(this, bounds);
}
static new(bounds) {
return new this(bounds);
}
get south(){ return this.southWest[1] }
get west(){ return this.southWest[0] }
get north(){ return this.northEast[1] }
get east(){ return this.northEast[0] }
set south(value){ this.southWest[1] = value }
set west(value){ this.southWest[0] = value }
set north(value){ this.northEast[1] = value }
set east(value){ this.northEast[0] = value }
}
const compatibleBounds = CompatibleBounds.new({
"south": 43.106491921792255,
"west": 76.71745650634767,
"north": 43.4065384633472,
"east": 77.13974349365236
});
// или
const compatibleBounds = CompatibleBounds.new({
"northEast": [
76.92894332280319,
43.25695003829279
],
"southWest": [
76.92825667730312,
43.256449960663694
]
});
// на выходе универсальный динамический объект:
compatibleBounds.southWest = [1, 2];
console.log(compatibleBounds.south); // 2
compatibleBounds.south = 3
console.log(compatibleBounds.southWest); // [1, 3]
no-cors
на клиенте это не "отключение cors", иначе не было никакого смысла в cors, это метка "мне похрен на ответ, я просто отправляю". Соответственно с такой меткой ты не можешь читать ответ никак.allow-*
заголовков и cors не разрешён. Set-Cookie
ставит, очевидно, cookie
. Напрямую его читать в любом случае нельзя. cookie
HTTP-only
.HTTP-only
куки передаются браузером в запросе самостоятельно, из скрипта к ним доступа нет. Однако он и не нужен. Отправляйте все запросы с credentials: "include"
и значение автоматически будет присутствовать в заголовке Cookie
.. hours
, а h
, исправляешь и не отвлекаешь людей тупыми вопросами.Date
, время исполнения setInterval
может быть изменено со стороны браузера или из-за нагрузки. ContextReplacementPlugin
\NormalModuleReplacementPlugin
, чтоб пофиксить пути импорта как вам надо, в т.ч. относительные.alias
вида '@locale': path.resolve(__dirname, `src/${LOCALE}/js/register.js`)
'00:01'
проскакивает между вызовами setInterval
. 1000
в параметрах ничего не гарантирует, перерыв может быть больше - в двух случаях:<script>функция();</script>
, но раз не помогли предыдущие, то и этот не поможет.<script type="module">
import Parallax from "./js/parallax.js"
// или так import { Parallax } from "./js/parallax.js"
let scene = document.getElementById('scene');
let parallaxInstance = new Parallax(scene);
</script>
window.Parallax = Parallax;
) но лучше так не делать.item
, где одновременно были бы равны item.product.article
, item.size
и item.warehouse.id
, т.к. только в таком случае ветка уйдёт в нужную вам сторону. Если логика предполагалась какой-то другой - уточняйте.reactive
вместо ref
, код чище и приятней будет. @side-emit="(side, id) => {
this.players[id].side = side;
...
}"
this
, а внутри шаблона он не нужен, т.к. либо раскрывается неявно автоматически, либо, в случае со <script setup>
, не используется вовсе. Следует запомнить: никакого this
в шаблонах. @side-emit="(side, id) => {
players[id].side = side;
...
}"
this
в данном конкретном случае. Просто так совпало.@side-emit="someValue = $event ? 1 : 2"
, а что-то сложнее просто выносить в метод компонента\composition функцию: @side-emit="onSlideEmit"
.