Ответы пользователя по тегу JavaScript
  • Как работает этот код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Чтобы понять, что происходит, нужно просто посмотреть. Например, так:
    Пример
    var q = (function(x,foo = () => x) {
    	console.log('a)',x,y,foo()); //2 undefined 2
    	var x;
    	console.log('b)',x,y,foo()); //2 undefined 2
    	var y = x;
    	console.log('c)',x,y,foo()); //2 2 2
    	x =3;
    	console.log('d)',x,y,foo()); //3 2 2
    	return [x,y,foo()];
    })(2)
    console.log(q) // [3,2,2]
    Более подробный пример
    var q = (console.log('init q',typeof x), //init q undefined
    	function(x,foo = (console.log('init foo',x),() => x)) { //init foo 2
    		console.log('a)',x,y,foo()); //2 undefined 2
    		var x;
    		console.log('b)',x,y,foo()); //2 undefined 2
    		var y = x;
    		console.log('c)',x,y,foo()); //2 2 2
    		x =3;
    		console.log('d)',x,y,foo()); //3 2 2
    		return [x,y,foo()];
    	}
    )(2)
    console.log(q) // [3,2,2]

    В общем, там на момент инициализации функции foo видна область видимости анонимной функции. Но этих локальных областей видимости у анонимной функции как бы две на самом деле. Первая содержит параметры функции, а вторая - уже локальные переменные функции. И вот эта var x сидит во второй и перекрывает первую область видимости. То есть foo не видит var x, а видит только тот x, который в параметрах, потому что сама foo тоже сидит в первой области видимости. Надеюсь, доступно.
    Ответ написан
    Комментировать
  • Как связать добавление и удаленные данных с бэка при клике на checkbox?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Данные с бэка должны приходить с некоторыми уникальными id, которые нужно запоминать на клиенте. Если приходят повторно данные с теми же id, то игнорировать их заменять ими существующие данные. Если новые id, то тогда уже добавлять.

    В соответствии с галочкой можно поставить либо массив id, либо определенный тип данных (по логике вещей галка обычно означает категорию в фильтре данных). Соответственно, в этом случае помимо id с бэка должен приходить также тип данных. Так что можно будет легко удалять данные на основе типа галки.
    Ответ написан
    Комментировать
  • Как обойти CORS со стороны клиента?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А при чем здесь VLC? Это отдельное приложение. Там может вообще не быть (скорее всего) проверки CORS, потому что это актуально только в браузере.

    Для браузера, соответственно, нужно создать браузерное расширение с правами доступа к нужным сайтам - оно сможет игнорировать CORS, имея такие права. А обычная вкладка не может просто обращаться к другим сайтам по другим адресам.
    Ответ написан
    Комментировать
  • Как реализовать оповещения в браузере?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Чтобы показать оповещения в браузере средствами JavaScript, достаточно загуглить два слова: javascript и notification.
    Попадёте на документацию: https://developer.mozilla.org/en-US/docs/Web/API/n...

    Далее в самом yii нужно разобраться с календарем. Информация должна как-то попадать на страницу, либо во время загрузки страницы, либо через ajax. Это уже полноценная задача.
    Ответ написан
    Комментировать
  • Как скрыть iframe после отправки формы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    iframe не может контролировать свои размеры.
    Равно как и внешнее окно не может получить доступ к тому, что творится в iframe.

    Поэтому iframe должен каким-то образом передать информацию об авторизации основному окну. Сделать это можно, например, через postMessage. Или любыми другими путями, которые вам покажутся удобными.

    Но если iframe не хочет делиться информацией, то её нельзя узнать. Разве что через браузерное расширение, но это уже придётся прибегать к помощи пользователя, а в этом случае можно и просто сделать кнопку "Скрыть iframe" для пользователя, которую он сможет нажать по желанию.
    Ответ написан
    Комментировать
  • С чем связана ошибка в Promise?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вы не понимаете, как работают промисы и JS. Это самая главная ошибка.

    Попробую чуть-чуть объяснить.
    fn(a,b,c).then(fn(k,m,n))
    Вот так вы пишете. Что здесь происходит.
    fn срабатывает и сразу же возвращает объект типа промис, в котором вы вызываете метод then. Этот метод принимает две функции - для успеха и для фейла. В качестве функции успеха вы указываете выражение fn(k,m,n). Окей, далее JS вычисляет это выражение, то есть буквально выполняет эту функцию и в качестве результата получает новый промис, который используется в качестве callback функции успеха для первого промиса.

    Внимательно перечитайте документацию.
    https://learn.javascript.ru/promise

    Исправлением ошибки будет что-то вроде этого:
    animation(1, 500, log)
        .then(e=>animation(2, 1000, log))
        .then(e=>animation(3, 2000, log))
        .then(e=>animation(4, "500", log));
    Ответ написан
    Комментировать
  • Передать модальное окно по ссылке?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно через #анкор
    JS код анализирует текущий URL и создаёт модальное окно, если его нет.

    А в общем случае, если нужно по ссылке, то лучше не делать модальное окно, имхо.
    Ответ написан
  • Как в массиве с разными ключами вывести данные на страницу?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    $('button').click(function() {
        
        let button = $(this).next();
      
        let arr = {
           'nameOneItem' : 'Name one',
           'nameTwoItem' : 'Name two'
        };
      
        let out = '';   
      
        for (let i in arr) {
           out += '<span>' + arr[i] + '</span>';
        }
      
        button.append(out);
    });
    Ответ написан
    4 комментария
  • Как добавить знаки к выборке регулярного выражения?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    document.querySelector('#bet').oninput = function(e){
        var s = e.target.value;
        s = s.replace(/([^0-9.,]|^[.,]*|[.,]*$)/g,'').replace(/,/g,'.');
        var parts = s.split('.');
        e.target.value = parts.slice(0,-1).join('') + '.' + parts.slice(-1);
    }
    Ответ написан
    2 комментария
  • Что прописать нужно чтобы файл html автоматически чистилcя в кэше браузера и показывал последние изменения?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вам нужно не смотреть в сторону кеша браузера, а использовать подконтрольный разработчику кеш - например, localStorage. Вашему сайту бесплатно доступно 5Мб на стороне пользователя. Теоретически можно даже превысить этот лимит, побеспокоив пользователя.

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

    Можно даже по-умному это всё делать. Например, так:
    1) Мини скрипт проверяет актуальность базы (когда она была загружена).
    2) Дальше шлет мини запрос (ajax) на сервер с указанием этой даты.
    3) Сервер проверяет, что изменилось с той даты.
    4) Сервер высылает новые данные только с изменениям. Например: товар 555 удалить, товар 777 добавить, товар 999 изменить цену на 14.99
    5) Клиент принимает небольшую порцию данных и актуализирует локальную базу в localStorage
    Ответ написан
    Комментировать
  • Как отследить закрытие PWA?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В случае убийства, PWA ничего не успеет сделать. С таким же успехом можно буквально прострелить телефон огнестрельным оружием или бросить в кислоту.

    Просто найдите сбалансированную цифру, сколько держать сессию. Зависит от цены создания и поддержания сессии.

    Чуть более умный вариант, если создание сессии дорогое - сделать кеш на стороне сервера конкретно для сессий, чтобы не сразу их удалять, но и не поддерживать полноценно. А если юзер вернётся, то с минимальными затратами восстановить сессию.

    И ещё более умный вариант - как-то отслеживать (условно) "характер" пользователя. Например, если зашёл и закрыл, то сессия удаляется довольно быстро. А если вернулся через час, или на следующий день, то перевести пользователя в статус "активный", и для него вообще таймаут можно на пару дней поставить. Ну, опять же, в случае высокой цены создания сессии. Честно говоря, мне сложно представить задачу, где цена настолько высока, чтобы так заморачиваться.
    Ответ написан
    Комментировать
  • Как заставить нормально работать динамически подключенный js код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var jq = document.createElement('script');
    jq.src = "js/jquery-3.3.1.min.js";
    document.querySelector('body').appendChild(jq);
    
    jq.onload = e => {
        var script = document.createElement('script');
        script.src = "js/scripts.js";
        document.querySelector('body').appendChild(script);
    };
    Ответ написан
  • Как создать строку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var str = "<scr"+"ipt></scr"+"ipt>";
    Ответ написан
    Комментировать
  • Как учить JS и не сойти с ума?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    JS - громоздкий и довольно запутанный язык (исторически так сложилось).
    Основы языка понять - как раз довольно просто. А вот постичь все тонкости, я бы сказал, не просто сложно, а даже не нужно. У разработчика главная цель - чтобы код работал. Оптимизация, как правило, достигается знанием алгоритмов, а это за пределами знания самого языка. Так что как вариант - просто писать то, что вам нужно, и периодически поглядывать в спецификацию, гайды, гугл, тостер. Вот и весь секрет.
    Ответ написан
    Комментировать
  • Как превратить объекты со ссылками в JSON?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Дело в том, что в JSON не может быть циклических ссылок по определению. Там даже нет переменных.

    Лучше всего вам перейти на немного другой формат данных. А именно, хранить не ссылки на объекты, а их ключи в виде строк. Такие строки-ссылки спокойно сериализуются.
    leader.soldier = "soldier";
    soldier.leader = "leader";

    Автоматически лучше не конвертировать, а именно взять такой формат за основу. Но если очень хочется, то как-то так:
    for (let key in obj) {
      if (window[key]) obj[key] = key; //любой ваш критерий
    }

    В будущем для проверки, правда, понадобится чуть усложнённый код:
    var test_leader = soldier.leader && window[soldier.leader];
    //Конечно, вместо window у вас будет свой объект-обертка

    Чтобы избавится от этого вам нужно будет всего лишь "чинить" объект после JSON.parse
    Ответ написан
    Комментировать
  • Как выдернуть _id из структуры список объектов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    msg.map(e=>e.item._id)
    Ответ написан
    Комментировать
  • Почему функция не объявлена?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что закавыченный код выполняется в глобальной области видимости. Так устроены функции setInterval и setTimeout, увы и ах. Пример:
    function test() {
    	let x = 123;
    	setTimeout("alert(x)",0); // x не видна
    }
    test();

    Если нужна именно строка, то оберните код в функцию eval, она выполняется в локальной области видимости:
    function onload() {
    	function f(){
    		console.log('12');
    	}
    	setInterval(e=>eval("f()"), 1000)
    }
    onload();

    Иначе просто используйте ссылку на саму функцию, то есть f вместо "f()"
    Ответ написан
    9 комментариев
  • Можно ли на JS писать музыку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Наберите в гугле "piano online".
    Ответ написан
    Комментировать
  • Что может помешать перехватить нажатие?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В другом месте может быть повешен другой обработчик, который монополизирует событие и предотвращает передачу события дальше по цепочке.
    event.preventDefault();
    Ответ написан
    1 комментарий
  • Как заблокировать доступ к сайту определённому клиенту?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно. Всем без исключения пользователям не показывать контент, пока не заработает метрика. Затем можно перевести в куки, но дальше стратегия очевидна. Другой вопрос, устроит ли вас подход, когда сайт блокируется для всех, у кого не работает метрика (например, стоит блокировщик рекламы).
    Ответ написан
    9 комментариев