Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как правильно выполнить запрос перед закртием/загрузкой другой страницы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    А других официальных вариантов и нет. Только синхронно.

    Перед закрытием дергается onbeforeunload, в котором вы что-то делаете, и далее, после передачи управления, никаких гарантий существования страницы больше нет. То есть в случае асинхронного запроса ответ может вернуться в никуда или быть прерванным.

    Более правильно не выполнять запрос вообще. Вместо этого нужно записать куда-нибудь в куки или localStorage информацию, и при следующем посещении сайта отправлять её туда-сюда, сколько угодно раз. Если же нужно детектить именно само закрытие, то можно раз в N секунд делать ajax или другим способом поддерживать соединение, и по таймауту считать пользователя "отвалившимся".

    Код, который может помочь
    window.addEventListener("beforeunload", e => {
    	if (is_test_passed) {
    		return;
    	}
    	let message = "Вы уверены, что хотите закончить тест?";
    	if (typeof e == "undefined") {
    		e = window.event;
    	}
    	if (e) {
    		e.returnValue = message;
    	}
    	return message;
    }
    Ответ написан
    7 комментариев
  • При обработки ответа в формате JSON происходит ошибка SyntaxError, как исправить?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно обойтись своими силами. Однажды я уже отвечал на подобный вопрос.
    Надеюсь, сможете сами переписать на JavaScript, ну или хотя бы ухватить идею и сделать что-то похожее. Но вообще, конечно, надо продолжать давить на бекендеров.
    Ответ написан
    6 комментариев
  • Почему возвращается false?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Оператор || выводит первое значение, если оно истинно, иначе второе.
    Но -2 истинно.
    Ответ написан
  • Как сделать что бы скрипт работал после другого скрипта?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Примерно так:
    let timer_wait_4 = setInterval(e=>{
      let arr = document.querySelectorAll(".jp-playlist ul li");
      if (!arr || arr.length < 4) return;
      clearInterval(timer_wait_4);
    
      $('.jp-playlist ul').each(function(i, el) {
        console.log($(el).children('li'));
      });
    
    },200);

    Но учтите, что это не самое элегантное решение, своеобразное, костыльное. Зато решение.
    Ответ написан
    Комментировать
  • Как считает цикл for?

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

    Далее следует уделить внимание логике работы программы, то есть ее описанию. Сейчас описание у вас такое, что глаза можно сломать, пытаясь понять, что же должна делать программа. Нужно подтянуть оформление вопроса в плане русского языка, пунктуации, падежей. В самой программе переменные должны иметь говорящие названия. То есть не qwe, а осмысленное имя, про start и out нужны комментарии, что они делают и т.д.

    Если это не поможет, то можно на выбор:
    1. Заняться отладкой программы, то есть пошагово смотреть, как программа выполняется, и соотносить это с логикой её работы.
    2. Попытаться доказать работу программы чисто математически, как учили в школе. То есть из-за использования циклов и рекурсии понадобится применить метод математической индукции.
    Ответ написан
    Комментировать
  • Снижает ли производительность множество addEventListner?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если в большинстве случаев стоит не очень сложная проверка, то нагрузки не будет. Точнее, она будет незначительной. Собственно, такая проверка и нужна, чтобы не было нагрузки от (холостой) работы модуля (к примеру, перерисовывания, что и так нормально нарисовано).

    Если у вас в каждом модуле одним и те же проверки, и они довольно сложные (например, поиск, сортировка), то стоит задуматься о смене архитектуры.

    Но всё равно, конечное решение (ответ на вопрос) зависит от текущих замеров производительности. Даже если убрав все модули, вы снизите нагрузку в 1000 раз, то есть время работы всех этих обработчиков упадёт с 1 мс до 1 нс, то оно того не стоит. А вот если время лага уменьшится всего лишь в 10 раз, то есть с 1 с до 100 мс, то это уже полезно.

    Попробуйте воспользоваться функцией:
    performance.now()
    Для измерения производительности. Можно делать замеры до и после работы кода, которого вы считаете достаточно тяжелым, и потом считать разницу.
    Ответ написан
    1 комментарий
  • Как правильно написать это регулярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Всё меняет. Легко проверить в консоли:
    5dcff51033564306707279.png
    Возможно, у тебя помимо (или вместо) \n есть также \r
    Попробуй так:
    str.replace(/@tag(.|\n|\r)*?@tag/gm, 'replace')
    Или так (универсально):
    str.replace(/@tag[\s\S]*?@tag/gm, 'replace');
    Ответ написан
    1 комментарий
  • Как лучше всего строить сетки и клеточные автоматы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Canvas, например.

    Рисовать игру типа жизнь, да и вообще любую игру, в виде таблицы с помощью тега <table> - это очень странное решение.
    Ответ написан
    Комментировать
  • Как округлить число до десятой доли?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Math.floor(2.453690 * 10) / 10
    Math.floor(2.99 * 10) / 10
    //Соответственно для вывода
    (Math.floor(2.99 * 10) / 10).toFixed(1)
    Ответ написан
  • Отслеживание количества table row (ряда таблиц) на странице. Работа с куки?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Лучше генерировать таблицу на сервере, на случай отключенного у пользователя JS. Даже если кнопки не будут работать, т.к. походу жестко завязаны на JS, то хоть инфа будет отображена для чтения, а не пустая страница.

    Получить все строки можно чем-то вроде этого:
    var rows = document.querySelectorAll('tbody tr');

    Далее можно обработать по-всякому. Желательно, конечно, чтобы смысловые ячейки имели какие-то знаки - id или class, иначе придется по номеру считать:
    rows.forEach(tr=>{
      let td2 = tr.children[1];
      let td6 = tr.children[5];
      let button = td6.querySelector('button');
      console.log(td2.innerText, button); //В цикле выводим всё, что нужно
    });

    Далее там же, в конце forEach добавьте вашу логику, ветвление, работу с куки и пр.
    spoiler
    rows.forEach(tr=>{
      let td2 = tr.children[1];
      let td6 = tr.children[5];
      let button = td6.querySelector('button');
      button.addEventListener("click", e=>{ //Например, обработчик кликов
        console.log('Кнопка ' + td2.innerText + ' нажата!');
        // ...............
      });
    });
    Ответ написан
  • Как проверить localStorage и заполнить input-ы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Попробуйте так.
    Немного переписал, но не проверял на работоспособность:
    Код
    //document.addEventListener('DOMContentLoaded', () => { //faster
    window.addEventListener('load', () => {
    	//Set localStorage
    	let el = {
    		userName: document.getElementById("nameField"),
    		userEmail: document.getElementById("emailField"),
    		userDateOfBirth: document.getElementById("dateField"),
    	};
    
    	//Wnen out of focus - set localStorage
    	let addFocusEvent =
    		s => el[s].addEventListener("focusout",
    			e => localStorage[s] = el[s].value);
    	for (let k in el) addFocusEvent(k);
    
    	//Get localStorage
    	for (let k in el) el[k].value = localStorage[k] || "";
    });
    Ответ написан
    5 комментариев
  • Какими способами и технологиями можно реализовать сайт строительной компании?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Backend здесь будет тупо базой данных с минимальной логикой.
    Вся красота ложится на frontend, и здесь уже используется такая технология, как JavaScript. Если точнее, то WebGL, хотя можно и старый добрый Canvas. В любом случае, это всё JavaScript. И других вариантов, в общем-то, нет.

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

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

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

    Так что вам нужно смотреть, в первую очередь, дизайн (в смысле, проектирование), маркетинг, контроль качества. Либо просто выбрать исполнителя за вменяемые деньги, который все тонкости возьмет на себя.
    Ответ написан
    5 комментариев
  • Как запретить вывод однотипных данных?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Кешировать вывод где-нибудь.
    Примерно так:
    window.my_cache = window.my_cache || {};
    if (my_cache[items[i].name]) continue; // or return if inside a function
    my_cache[items[i].name] = true;

    Можно навести красоту и оптимизировать под разные хотелки, если есть нужда.
    Ответ написан
    1 комментарий
  • К какому условию привязывается ELSEв JAVASCRIPT, если они идут подряд?

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

    Например, если temperature будет 20, то первое не выполнится, второе выполнится и присвоит minutes = 40, а затем третье снова не выполнится, но т.к. третье не выполнено, то сработает else конкретно для него, поэтому внезапно произойдет обнуление minutes = 0.

    Нужно делать цепочку из if else, тогда все проверки будут связаны логически, и последний else будет относится как бы ко всем сразу.
    Ответ написан
    Комментировать
  • По клику изменить цвет кнопки без залипания?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для мобильных нужна мобильная версия сайта. И в ней не должно быть hover. А там уж как решите, можно повесить событие на onclick и во время клика повесить через setTimeout еще одно событие на срабатывание через 1 секунду, которое и будет убирать.

    Только там хитрее. Ведь пользователь может нажимать несколько раз с интервалом в 0.5 сек. Это нужно будет учесть.
    Ответ написан
    Комментировать
  • Как создать пустой массив с undefined?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Какую проблему вы решаете?
    В JavaScript пустой массив из n элементов можно создать просто:
    new Array(n)

    Да, в консоли вы увидите, что массив заполнен некими "empty", а не "undefined", но в самом языке JavaScript нет пустых значений типа "empty". На самом деле это и есть undefined. То, что отображается в консоли, никак нельзя почувствовать и пощупать кодом. А значит эта особенность никак не влияет на код и не может быть причиной никаких ошибок.

    Поэтому я повторю вопрос: какую проблему вы решаете? Ведь empty значения не могут мешать вашим скриптам.

    Если хотите, проверьте свой код не в Chrome, а в Firefox, там в консоли нет никаких empty. И не должно быть. То, как там выделяется и освобождается память, скрыто даже в консоли, чтобы не сбивать с толку начинающих программистов.
    Ответ написан
  • Как получить все возможные фрагменты из строки?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var str = "1234567890";
    var e, r = /.{4}/g; // одно-единственное регулярное выражение
    while(e=r.exec(str)) {
    	console.log(e[0]);
    	r.lastIndex -= 3;
    }
    Ответ написан
    Комментировать
  • Почему при попытке привести строку к числу получаю undefined?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что Array.forEach не имеет собственного результата и возвращает undefined.
    Array.forEach используют, когда нужно сделать какие-то действие с каждым элементом массива, при этом новый массив не получается. Если нужен новый массив внутри именно forEach, то его нужно формировать вручную типа такого:
    let abc = [];
    arr.forEach(element=>abc.push(Number.parseInt(element)));
    console.log(abc)
    Ответ написан
    Комментировать
  • Почему сторонний скрипт получает доступ к cookie?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Запустить на другом домене в iframe. Тогда это будет окно на другую страницу. Как бы браузер в браузере. И ваша страница не будет знать, что внтури iframe, что бы он ни показывал, будет знать только размеры и адрес. А сам iframe, соответственно, не будет знать, что там во внешней странице.

    А просто при подключении скрипта, он имеет полный доступ ко всему, как родной. И здесь нет смысла ставить палки в колеса. Если запретить куки, то в теории скрипт всё равно сможет их прочитать, если они как-то отражаются на странице. Например, на странице есть тест "Здравствуй, %username%", а скрипт имеет доступ к DOM, так что сможет спарсить имя и прочие переменные. Более логично разделять по принципу "всё или ничего" или по жестко определенному API.
    Ответ написан