Ответы пользователя по тегу JavaScript
  • Создать объект на основе массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Суть также, без цикла не обойтись:
    const arr = [1,2,3];
    const objVal = { current: 0, deffault: 1 };
    
    const result = arr.reduce((p,c) => {p[c] = objVal; return p;}, {});
    // {"1":{"current":0,"deffault":1},"2":{"current":0,"deffault":1},"3":{"current":0,"deffault":1}}
    Ответ написан
    1 комментарий
  • Как составить такую регулярку на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var re = new RegExp('<p><br></p>', 'ig'); 
    // флаги:
    // i - игнорировать регистр, 
    // g - искать/заменять во всей строке много раз
    
    var test = '<p><br></p>-<p><br></p>+<p><br></p>//<p><br></p>##<p><br></p>';
    test.replace(re, '' ) // -+//##
    Ответ написан
    1 комментарий
  • Как перебрать такой массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создайте объект с ключами-словами, где значения будут частотой нахождения.
    var src = ["груша", "яблоко", "апельсин", "груша", "банан", "груша", "апельсин"];
    var dict = src.reduce( function(p,c){
      if( p.hasOwnProperty(c)) p[c]++;
      else p[c] = 1;
      return p;
    }, {});
    
    // теперь нужно вывести dict в порядке убывания значений:
    // создать массив объектов с двумя полями: слово и число
    // и отсортировать его по убыванию поля с числом.
    var arr = [], word;
    for( word in dict) arr.push({ w: word, n: dict[word] });
    arr.sort( function(a,b){ return b.n - a.n });
    
    // массив arr теперь отсортирован правильно, осталось вывести:
    for( var i = 0; i < arr.length; i++) console.log( arr[i].w +' - '+ arr[i].n );
    Ответ написан
  • Как сделать на сайте 2 изображения, перекрывающие друг друга через js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот 5 вариантов с примерами и кодом. Вкратце, названия/ссылки:

    1. TwentyTwenty
    2. Juxtapose
    3. imgSlider
    4. Cocoen
    5. Image Comparison Slider
    Ответ написан
    Комментировать
  • Как сделать вызов функций, по очереди?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для очереди из асинхронных штук есть Promise («Промисы» = обещания).

    Даже в jQuery, начиная с версии 1.8 можно возвращать из каждой анимации Promise и сложить цепочку A.then(B).then(C):
    $("#button").click( animate );
    
    function animate() {
    	number1().then( number2).then( number3);
    }
    
    function number1() { // асинхронная, вернет промис
    	return $('p').each( function(i) { $(this).delay((i++) * 500).fadeTo(2000, 1)} )
    		  .promise();
    }
    
    function number2() { // асинхронная, вернет промис
      return $('p').hide("fast").promise();
    }
    
    function number3() { // выполнится мгновенно
    	$('#result').html("Hello World");
    }

    Fiddle

    Старый ответ. Функции jQuery, выполнение которых занимает время, обычно принимают ещё одним параметром функцию, которая выполнится по завершении анимации. Например для .hide() см. параметр complete

    Поэтому можно так:
    $("#button").click( number1 );
    
    function number1() {
      var $p = $('p'), len = $p.length;
    	$p.each(function(i) {
    		$(this).delay((i++) * 500).fadeTo(2000, 1, function(){
    			if(i===len) $( "p" ).hide( "fast", number2); // выполнить только для последнего из всех
    		});
    	})
    }
    
    function number2() {
    	var number2func = document.getElementById('result');
    	number2func.innerHTML = "Hello World";
    }
    Ответ написан
    Комментировать
  • Как вернуть значение из цикла each?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Т.к. кликнут ещё неизвестно, когда, а код срабатывает сразу при загрузке страницы, не обойтись без асинхронности и отлова событий. По клику сработает одна функция, которая получит значение data-атрибута кликнутого элемента. И, чтобы усложнить всё, запустит ещё одно событие – на этот раз глобального объекта window, который «видно» из любого участка кода. И уже событие на window можно слушать где угодно, и получить значение из data кликнутого элемента.
    $(".image-portfolio").on( 'click', function(){
    	window.dispatchEvent(
    		new CustomEvent( 'sect', { detail: $(this).data("section")} )
    	);
    });
    
    // где-то далеко далеко ловим данные из события
    window.addEventListener('sect', function(e) {
    	$('body').append('<div>кликнули на ' + e.detail + '</div>');
    });

    попробовать

    На деле достаточно правильно распорядиться полученным значением сразу в первой части кода. Просто захотелось вспомнить, как «бросать» собственные события.
    Ответ написан
    Комментировать
  • Обрезать разрядность числа?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если надо «просто отрезать» без округлений, можно работать с текстовой строкой:
    function trimmer(n) {
      var s  = n.toString(), pos = s.indexOf('.');
      return parseFloat( s.substr( 0, !!~pos ? pos+4 : s.length));
    }
    
    trimmer(32.0123456) // 32.012
    trimmer(32.000000001) // 32
    trimmer(32.1000000001) // 32.1
    trimmer(32) // 32
    trimmer(.001) // 0.001
    trimmer(32.987654) // 32.987
    trimmer(32.9999999999) // 32.999


    Если нужны округления, то использовать toFixed() ?
    parseFloat( (32.3).toFixed(3)) // 32.3
    parseFloat( (32.12345).toFixed(3)) // 32.123
    parseFloat( (32.98765).toFixed(3)) // 32.988
    parseFloat( (32.99999).toFixed(3)) // 33
    Ответ написан
    Комментировать
  • Как преобразовать HTML-код в указанный формат?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    ascii-коды, разделённые воскл. знаком.

    Напр., у вас есть <div> с каким-то содержимым, которое вы хотите «закодировать».
    Нужно взять его и посимвольно перевести в ascii-коды примерно так:
    function encode(s) {
      var i, out = [];
    	for(i=0;i<s.length;i++) out.push(s.charCodeAt(i));
    	return out.join('!');
    }

    Попробовать

    А вот шифровка и расшифровка в одном.
    Ответ написан
    2 комментария
  • Как сделать чтобы функция повторилась N количество раз?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно поместить в массив функции, и каждый раз при срабатывании заменять на следующую:
    var button = document.getElementById('btn');
    
    function f1() {
      button.disabled = true;
      button.onclick = todo.shift(); // заменили обработчик на следующий из очереди
      var timeoutID = setTimeout( /* запуск таймера */
      	function() { button.disabled = false},
      	1000
      );
    }
    
    var todo = []; // очередь одноразовых задач
    todo.push(f1,f1,f1); // три раза f1, потом добавьте "другие" - f2, f3
    button.onclick = todo.shift(); // зарядить первую


    Fiddle
    Ответ написан
    2 комментария
  • Как из js коллекции обратиться к элементу над которым произошло событие?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно ловить клики на элементе body (они «пузырьком» поднимаются наверх), и смотреть, содержит ли класс кликнутого элемента list-group-item:
    document.body.addEventListener('click', function(e) {
    	if( e.target.classList.contains('list-group-item'))
    		e.target.style.backgroundColor = 'red';
    });

    Fiddle

    В отличие от перебора найденных и прикреплении слушателя на каждый, этот способ – «живой»: при появлении в документе новых элементов с искомым классом, клики по ним также отработают.

    Вместо <body> можно повесить слушателя ниже, например, на <ul>, чтобы ловить события только в его дочерних элементах (и глубже).
    Ответ написан
    3 комментария
  • Как вывести данные из Localstorage в консоль?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • localStorage.length – число хранящихся ключей
    • localStorage.key(i) – i-й ключ
    • localStorage.getItem(key) – значение по ключу


    На странице того домена, где устанавливались значения, в консоли:
    for(let key,i=0;i<localStorage.length;i++) key=localStorage.key(i),console.log(key,':', localStorage.getItem(key));


    Если хотите распарсить JSON и выводить только имена:
    const L=localStorage;for(let k,v,i=0;i<L.length;i++) {k=L.key(i);try{v=JSON.parse(L.getItem(k)).name}catch(e){};console.log(k,' => ',v)}
    Ответ написан
    Комментировать
  • Как извлечь элементы из данного массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function pairs( arr) {
      var result = {};
      for( var i = 1; i<arr.length; i+=2) result[ arr[i-1]] = arr[i];
      return result;
    }
    
    pairs(["item1","black","item2","black","item3","black","item4","black","item5","black"]) // {
      "item1": "black",
      "item2": "black",
      "item3": "black",
      "item4": "black",
      "item5": "black"
    }
    Ответ написан
    Комментировать
  • Как получить значение введенное в данное поле для ввода?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var value = document.getElementById("betAmount").value;


    Вопрос в том, когда это делать.
    Ответ написан
    Комментировать
  • Как жертве JQuery получить всех "детей" (элемент.childNodes[все дети]), неужели поочередным перебором?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Выбрать дочерние узлы первого уровня можно через contents(). Но понадобится рекурсия. Когда очередной узел текстовый, в нём можно менять содержание, но если он элемент, то надо внутрь него лезть тем же contents()

    RegExp'ы с глобальной заменой лучше простого replace на случай вставки Copy-Paste текста с большим количеством двойных дефисов, например. Поэтому же событие input, а не клавиатурные.

    Кроме того жо.. сложность выскочила с позицией курсора: при замене содержимого он сползает в начало узла. Ок, можно получить Selection и запомнить Range до всех замен и потом восстановить. Но тут кроется вторая засада: при замене меняется длина текста: два дефиса на одно тире. Поэтому нужно ещё и ловить изменение длины текста при замене в узле, в котором находится курсор.

    Вроде, получилось. Fiddle. Код:
    var curNode
    	  , startOffset
    	  , arrIN = ['--','<<','>>','->','<-']
    	  , arrOUT = ['—','«','»','→','←']
    	;
    	arrIN = arrIN.map(function(s){ return new RegExp(s,'g')});
    
    	$('#edit').on('input', onInput);
    	
    	function onInput() {
    		var selObj = window.getSelection()
    		  , range  = selObj.getRangeAt(0)
    		;
    		curNode = range.startContainer;
    		startOffset = range.startOffset;
    		$(this).contents().each(walk);
    		range.setStart(curNode, startOffset);
    	}
    
    	function walk(i, node){
    		var len
    		  , diff
    		;
    		if( node.nodeType === Node.TEXT_NODE) {
    			len = node.textContent.length;
    			node.textContent = replacer(node.textContent);
    			diff = len - node.textContent.length;
    			if( node === curNode && diff) {
    				startOffset -= diff;
    			}
    		} else if( node.nodeType === Node.ELEMENT_NODE) {
    			$(node).contents().each(walk);
    		}
    	}
    
    	function replacer(s) {
    		var i;
    		for( i = 0; i < arrIN.length; i++) s = s.replace( arrIN[i], arrOUT[i]);
    		return s;
    	}
    Ответ написан
    5 комментариев
  • Клики по ссылкам в сортировке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно в глобальной переменной хранить значение активного элемента, а в data-атрибуте переключаемых пунктов записывать их текущее состояние сортировки.
    var active = undefined; // здесь будет jQuery( активный пункт )
    var $sortable = $('a.sortable'); // пунктов с сортировкой потом может быть больше 1
    $sortable.data('sort', true); // true == asc, false == desc
    
    $('a.clickme').on('click', function() {
      var $el = $(this);
    	$sortable.removeClass('asc').removeClass('desc'); // у всех убрать сортировку
    	if( $el.hasClass('sortable')) { // кликнули переключаемый пункт
    	  if( active && $el[0] === active[0]) { // он был уже активен
    			$el.data('sort', !$el.data('sort')); // изменили сортировку на другую
    			$el.addClass( $el.data('sort') ? 'asc' : 'desc') // переключили классы соотв.
    		  	.removeClass( $el.data('sort') ? 'desc' : 'asc');
    		} else {
    			$el.addClass( $el.data('sort') ? 'asc' : 'desc'); // просто добавили правильный класс
    		}
    	}
    	
    	if( active) active.removeClass('active'); // выключить предыдущий активный эл.
    	active = $el.addClass('active'); // включить активность кликнутого
    });


    Fiddle
    Ответ написан
    3 комментария
  • Как вычислить координаты кривой?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Есть ли понимание того, какого вида функция должна в итоге получиться?
    Построил ваши точки на графике:
    1c9ba3cc0d9a4021b3c90e9d51532ba2.png
    То ли это экспериментальные данные, стремящиеся к линейной функции - тогда решать линейной регрессией.
    То ли кривая должна лечь точно по точкам, и тогда это может быть сумма синусоиды и линейной, или кривой какого-нибудь 6-го порядка.
    Ответ написан
    3 комментария
  • Как очистить массив не трогая свойства и методы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Очистить массив, не трогая добавленные свойства и методы:
    ar.length = 0

    С вашими значениями (вы забыли return в методе sum()):
    var ar = [1, 2, 3];
    ar.sum = function() {
        return this.reduce(function(a, b) {
            return a + b;
        });
    }
    
    ar.length = 0;    // значений больше нет, но метод sum() остался
    ar.push(5, 6, 7); // добавляем новые значения
    ar.sum()          // 18
    Ответ написан
    Комментировать
  • Почему не работает такая конструкция?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Тернарный оператор возвращает значение. Это не то же самое, что if .. else

    условие ? выражение_1 : выражение_2 – эта конструкция принимает то или иное значение: выражение_1 или выражение_2.

    Нельзя ставить в тернарный оператор continue или return потому, что это не выражения, принимающие какие-то значения, а управляющие структуры.

    Если бы вы выбирали, что вернуть, можно было бы написать return isItTrue ? A : B;

    В вашем же случае выбора между return и continue годится только старый добрый if .. else
    Ответ написан
    4 комментария
  • Как получить значение id из объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробуйте this.tracker.id
    Ответ написан
    1 комментарий
  • Как отобразить на сайте курсоры мышек посетителей?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Mozilla TogetherJS

    И забавная онлайн игра, где видны курсоры всех посетителей, и надо пройти лабиринт: cursors.io:
    4fc42d6cb91f4021a00100ef60bc116e.png
    Ответ написан
    Комментировать