Ответы пользователя по тегу JavaScript
  • Где используется canvas, помимо игрушек?

    @dimentimor
    Вот, например, редактор svg. Вполне утилитарно)
    Вообще, если нужен сложный интерфейс, с визуализацией данных и интерактивностью, то, конечно, canvas.
    Простые примеры: проложить маршрут на карте, и предоставить возможность изменять ключевые точки маршрута простым перетаскиванием; Или на сайте производителя мебели нужно сделать "картинку", в которой можно изменить (подобрать) цвет любого объекта.
    Ответ написан
    Комментировать
  • Как симулировать scroll event?

    @dimentimor
    Событие scroll- не изменяет значение scrollTop. Это придется делать самому.
    Но само событие можно генерировать и "отлавливать", в том числе, передавать с ним нужные значения.

    var body = document.getElementsByTagName('body')[0];
    
    // по клику 
    window.addEventListener('click', function (e) {
    
      // создадим кастомное событие типа scroll
      var event = new CustomEvent("scroll", {
        detail: {
          scrollTop: 200 // передадим нужные значения
        }
      });
      // "вызовем" событие
      window.dispatchEvent(event);
    });
    
    // добавим слушателя события scroll
    window.addEventListener('scroll', function (e) {
      console.log(e);
      // если событие не настоящее
      if (!e.isTrusted) {
        body.scrollTop = e.detail.scrollTop; // изменяем scrollTop на переданное значение
      }
    });


    Теперь по клику страница будет скролиться на 200 px. И все слушатели scroll "услышат" событие.
    Ответ написан
    2 комментария
  • Как вставить json объекты в таблицу?

    @dimentimor
    Превратить json в объект можно так:
    // json
    var json = '{"foo": "bar", "lorem": "ipsum"}';
    
    // Парсим в объект
    var obj = JSON.parse(json);
    
    // в цикле обходим свойства объекта
    // добавляя значения в таблицу
    for (var i in obj) {
    	var td = document.createElement('td');
    	td.innerHTML = obj[i];
    	tr.appendChild(td);
    }


    В реальности алгоритм чуть сложней, т.к. надо из ключей составить заголовки столбцов, а из значений- ячейки. Но это уже другая тема)
    p.s.
    Если у вас массив объектов, то надо массив обходить в одном цикле, и для каждого объекта в массиве выполнять обход в вышеприведенном цикле.
    Ответ написан
  • Как на подгружаемые данные навесить функцию?

    @dimentimor
    Надо "обновить".
    Все, что происходит внутри обработчика load - вынести в функцию, и вызывать ее при load событии и после того, как добавили новые блоки.
    function slider () {
      // ...
    }
    
    window.onload = function () {
      slider();
    };
    
    ajax( function (r) {
      div.html(r);
      slider();
    });
    Ответ написан
    Комментировать
  • Как исправить перебор в скрипте?

    @dimentimor
    А если при создании кнопки поместить в data-* атрибут какой-нибудь идентификатор. Например позицию элемента в массиве, и идентификатор элемента на странице.
    Тогда по клику мы получим эти данные, и удалим по ним все, что нужно.
    // <div data-task_elem="12">...</div>
    // <button class="remove" data-task="12">...</button>
    // ...
    $('.remove').on('click', function (e) {
      var id = e.target.dataset.task; // 12
      delete arr[id];
      $('[data-task_elem="'+ id +'"]').remove();
    });
    Ответ написан
    4 комментария
  • Как сделать выполнение двух событий одновременно при зажатии?

    @dimentimor
    var events = {};
    var w = 0, h = 0;
    
    // когда кнопка зажата
    document.addEventListener('keydown', function (e) {
    	events[e.keyCode] = true; // добавляем код кнопки в объект
    	action(); // вызываем функцию "действия"
    });
    
    document.addEventListener('keyup', function (e) {
    	// удаляем код кнопки из объекта только когда клавиша отпущена
    	events[e.keyCode] = false; 
    	console.log(w, h);
    });
    
    // а тут теперь можно писать инструкции для любых комбинаций
    function action () {
    	if (events[38]) w++;
    	if (events[39]) h++;
    	if (events[38] && events[39]) console.log('обе кнопки');
    }
    Ответ написан
  • Как сделать так чтобы при вводе данных в два input(text), в другой Input(button) передавался массив данных?

    @dimentimor
    jsfiddle.net/hwovzbfz/4

    var data = {};
    var div = $('#res');
    
    $('#imin, #imax').on('change', function (e) {
    	
    	data[e.target.id] = e.target.value;
    
    	if (data.imin && data.imax) div.html(data.imin + ' - ' + data.imax + ' m3');
    	else if (data.imin && !data.imax) div.html('от ' + data.imin + ' m3');
    	else if (!data.imin && data.imax) div.html('до ' + data.imax + ' m3');
    	else if (!data.imin && !data.imax) div.html('m3');
    });


    <input type="" class="form-control" id="imin" placeholder="от">
    <input type="" class="form-control" id="imax" placeholder="до">
    <div class="input-group-addon" id="res">м²</div>
    Ответ написан
    5 комментариев
  • Почему не работает cross domain ajax jquery?

    @dimentimor
    На сервере в htaccess должна быть строка
    Header add Access-Control-Allow-Origin "*"

    Данный заголовок вы должны ПОЛУЧИТЬ от домена, на который обращаетесь, а не слать его туда.
    Ответ написан
    5 комментариев
  • Как парсить и выводить JSON в HTML с помощью JavaScript?

    @dimentimor
    Например:
    var data = {
    	name: 'Jack',
    	items: {
    		dog: 1,
    		car: 1,
    		phone: 2,
    	},
    };
    
    // объект в json
    var json = JSON.stringify(data); // {"name":"Jack","items":{"dog":1,"car":1,"phone":2}}
    
    // json в объект
    var obj = JSON.parse(json); // объект


    Когда получаем json- преобразуем его в объект, а дальше уже в зависимости от структуры данных
    var data = JSON.parse('{"name":"Jack","items":{"dog":1,"car":1,"phone":2}}');
    
    var header = '<h2>My name is ' + data.name + '</h2>';
    var list = '';
    
    for (var i in data.items) {
    	list += '<li>' + i + ': ' + data.items[i] + ' шт. </li>';
    }
    
    document.getElementById('div').innerHTML += header;
    document.getElementById('div').innerHTML += '<ul>' + list + '</ul>';
    
    // Конечно, лучше создавать элементы через
    // var div = document.createElement('div');
    // наполнять через div.innerHTML = "text";
    // и добавлять их через element.appendChild(div);

    1978d2a5f51544268810b11dc1357ee7.jpg
    Ответ написан
    Комментировать
  • Как можно оперативно получить расчет площади?

    @dimentimor
    На все инпуты вешается слушатель "change" события, и в обработчике пишем, что если переменные "длина", "ширина", "количество" определены, то высчитываем площадь.
    Тогда при изменении значения любого инпута будет происходить перерасчет.

    var data = {num: 1};
    
    $('#wid, #len, #num').on('change', function (e) {
    
    	data[e.target.id] = e.target.value;  // имена свойств объекта совпадают с айдишниками инпутов  для простоты
    
    	if (data.wid && data.len && data.num) {
    		$('.res').html(data.wid * data.len * data.num);
    	}
    });


    <input type="text" id="wid">
    <input type="text" id="len">
    <input type="text" id="num" value="1">
    
    <div class="res"></div>
    Ответ написан
    Комментировать
  • Как сделать простановку пробелов с конца в моей регулярке?

    @dimentimor
    Вот так еще можно:
    var str = "12345678";
    var res = "";
    
    for (var i = str.length; i >= 0; i -= 3) {
    	var sub = i > 3 ? str.substr(i - 3, 3) : str.substr(0, i);
    	res = sub + " " + res;
    }
    
    res = res.slice(0, res.length -1);
    // 12 345 678
    Ответ написан
    Комментировать
  • Как сделать редирект при нажатии на button?

    @dimentimor
    document.getElementById('btn').addEventListener('click', function () {
      window.location.href = 'http://site.ru';
    });
    Ответ написан
    2 комментария