Ответы пользователя по тегу JavaScript
  • Какую библиотеку javascript можно использовать для создания элементов выбора периода, как в Booking или на подобие того?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Нужная вам штука называется датапикер, гуглите плагины датапикеры их великое множество.
    Ответ написан
    Комментировать
  • Как из iframe обратиться к родителю?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Чтобы послать сигнал из фрейма в родительской документ, в родителе ставите обработчик message:
    window.addEventListener('message', function(event) {
    	var message = event.data;
    	console.log('Получено сообщение из фрейма: ' + message);
    });

    Далее внутри фрейма попробуйте выполнить:
    window.parent.postMessage('Какое-нибудь произвольное сообщение', '*');

    И увидите, как сработал обработчик в родителе. Разумеется вместо сообщения, вы можете послать наружу, например, высоту фрейма или вовсе какой-нибудь произвольный JS-код, который потом можно выполнить внутри обработчика.

    Больше информации вы можете добыть самостоятельно, через поиск Яндекса:
    https://yandex.ru/search/?text=JavaScript%20postMe...
    Если мой ответ помог, отметьте его решением.
    Ответ написан
    Комментировать
  • Как сделать определённые div-элементы в contenteditable неудаляемыми через backspace?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Неудалямые элементы попробуйте разместить во вне редактора и отпозиционировать абсолютно, как вам нужно. Также вы можете перехватывать событие предшествующее удалению, отменять его и уже затем решать, разрешать удаление или нет.
    Ответ написан
    Комментировать
  • Как с помощью html страницы открытой в компе отправить запрос на активный порт localhost?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Создайте на странице фрейм, поместите в него форму и иницируйие его отправку внешним скриптом. Этот способ не требует прописывания заголовков CORS, хотя у него конечно есть минус, ответ сервера вы прочитать не сможете. Подходит чисто для того, чтобы передать инфу в один конец.

    Если хотите совершить классический AJAX запрос на свой локалхост, с чтением ответа, то вам сначала надо настроить заголовок Access-Control-Allow-Origin в NodeJS.
    Ответ написан
    Комментировать
  • Как отменить заморозку фоновых вкладок Google Chrome?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Запретить заморозку вкладок можно при помощи Chrome API.

    Создайте пустое расширение и в background.js разместите следующие обработчики:
    chrome.tabs.onCreated.addListener(function(tab) {
        chrome.tabs.update(tab.id, {
            autoDiscardable: false
        });
    });
    
    chrome.tabs.onReplaced.addListener(function(tabId) {
        chrome.tabs.update(tabId, {
            autoDiscardable: false
        });
    });
    
    chrome.runtime.onInstalled.addListener(function(details) {
        chrome.tabs.query({}, function(tabs) {
            tabs.forEach(function(tab) {
                chrome.tabs.update(tab.id, {
                    autoDiscardable: false
                });
            });
        });
    });


    Также имеет смысл отключить опцию:
    chrome://flags/#enable-heavy-ad-intervention
    Она отвечает за блокировку фреймов создающих слишком большую нагрузку по мнению Google и похрен, что бывают в природе сайты, в которых весь основной функционал предоставлен через фреймы.
    Ответ написан
  • Загрузка изображений с камеры на сервер?

    zkrvndm
    @zkrvndm
    Архитектор решений
    После прикрепления фотки посмотрите, что там в инпуте на стороне клиента, вдруг каких-то параметров не хватает или фотка имеет нулевой размер. Если на первый взгляд все в порядке, попробуйте форму отправлять не аяксом, а обычным способом. Если даже это не поможет, тогда вижу два решения в лоб: отправить файл строкой или упаковать его сначала в zip архив перед отправкой и отправлять уже сам архив. Для генерации архива на стороне браузера можно использовать плагин JSZip, он вам выдаст Blob который уже можно спокойно переслать на сервер аяксом.
    Ответ написан
    Комментировать
  • Как имитировать ввод сообщения в WhatsApp Web?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Написал функцию для эмуляции ввода сообщения в WhatsApp Web:
    // Вызываем функцию для набора текста и отправки:
    
    textEnter('Проверка события ввода сообщения в мессенджере WhatsApp. Смотрим, отсылается ли информация о том, что собеседник в данный момент печатает сообщение.');
    
    // Функция для имитации ввода сообщения и его отправки:
    
    function textEnter(text) {
    	
    	var array = text.split(''); // Разбиваем текст по символам в массив
    	
    	// Ищем поле вввода сообщения и записываем ссылку на него в переменную:
    	
    	var div = document.querySelector('div#main div[contenteditable="true"]');
    	
    	div.focus(); // Передаём фокус на поле ввода
    	
    	// Запускаем эмулятор посимвольного ввода:
    	
    	var emulator = setInterval(function() {
    		
    		// Пока есть символы в сообщени:
    		
    		if (array.length > 0) {
    			
    			// Вводим символ:
    			var symbol = array.shift();
    			div.innerHTML = div.innerHTML + symbol;
    			
    			// Передаём клавиатурные события отвечающие за ввод:
    			div.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true }));
    			div.dispatchEvent(new KeyboardEvent('keypress', { bubbles: true }));
    			div.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true }));
    			div.dispatchEvent(new InputEvent('input', { bubbles: true }));
    			
    		}
    		
    		// Если все символы введены:
    		
    		else {
    			
    			clearInterval(emulator); // Отключаем эмулятор ввода
    			
    			// Ищем и жмем кнопку отправки сообщения собеседнику:
    			document.querySelector('span[data-icon="send"]').click();
    			
    		}
    		
    	}, 100);
    
    }

    Наверняка многим пригодится. Спасибо Mikhail Osher за наводку на правильный алгоритм действий)
    Ответ написан
    Комментировать
  • Как вставить текст (html) в конец страницы?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Нужно пользоваться поиском хотя бы иногда:
    code.mu/ru/javascript/manual/dom/insertAdjacentHTML

    Рабочий пример вставки в конец страницы:
    var html = '<script src="server.com/someScriptName.js"></script><div class="someClass">Hello world</div>';
    document.body.insertAdjacentHTML('beforeEnd', html); // Вставка перед </body>
    Ответ написан
  • Можно ли сохранить файл внутри приложения React?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ваш вопрос не имеет никакого отношения к Reac, так как не React, но JavaScript в целом позволяет сохранять файлы из полей в локальную базу данных и хранить их там неограниченно долго.

    Сохранить файл в память можно вот так:
    // Берем первый попавшийся файл из поля input:
    save_file = document.querySelector('input[type="files"]').files[0];
    
    // И сохраняем в памяти браузера до востребования:
    localforage.setItem('file', save_file, function(err, val) {
      console.log('Файл успешно сохранен:');
      console.dir(val);
    });

    Обратите внимание, что у вас должна быть подключена библиотека localForage:
    <script src="localforage/dist/localforage.js"></script>

    Скачать библиотеку можно с гитхаба, смотрите папку dist.

    Чтобы потом извлечь сохраненный файл, попробуйте для теста перегрузить страницу и выполнить:
    localforage.getItem('file', function(err, val) {
      console.log('Ранее сохраненный файл:');
      console.dir(val);
    });

    Увидите, что он ни куда не исчез, не смотря на перезагрузку страницы, а остался в памяти.

    Если возникнет необходимость потом сохраненный файл отправить на сервер, то используйте FormData и XHR:
    // Вытаскиваем файл из памяти и шлем на сервер:
    localforage.getItem('file', function(err, val) {
    
      // Адрес для отправки файла POST-ом:
      var url = 'https://qna.habr.com/q/847927';
    
      // Создаем форму в конструкторе:
      var formData = new FormData();
    
      // Добавляем наш файл в форму:
      formData.append('file', val, val.name);
    
      // Отправляем форму на сервер:
    
      var xhr = new XMLHttpRequest();
      xhr.open('POST', url);
      
      xhr.onreadystatechange = function() {
        if (xhr.readyState === XMLHttpRequest.DONE) {
          if (xhr.status === 200) {
            alert('Запрос выполнен успешно, ответ сервера: ' + xhr.responseText);
          }
          else {
            alert('При выполнении запроса произошла неизвестная ошибка!');
          }
        }
      }
      
      xhr.send(formData);
    
    });
    Ответ написан
  • Как найти input под фокусом?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Найти элемент под фокусом можно вот так:
    document.querySelector('input:focus');
    Способ простой, но не все о нём знают.
    Ответ написан
    Комментировать
  • Как открыть диалог в WhatsApp Web при помощи JavaScript?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Нашел на иностранном сайте, как симулировать клики на React. Ниже пример, который подходит и для WhatsApp:
    const mouseClickEvents = ['mousedown', 'click', 'mouseup'];
    
    function simulateMouseClick(element){
      mouseClickEvents.forEach(mouseEventType =>
        element.dispatchEvent(
          new MouseEvent(mouseEventType, {
              view: window,
              bubbles: true,
              cancelable: true,
              buttons: 1
          })
        )
      );
    }
    
    // Ищем диалог по номеру телефона:
    var element = document.querySelector('span[title="+7 905 837-96-43"]');
    simulateMouseClick(element); // Симулируем событие клика

    Данный способ оказался рабочим, можно использовать. В целом оказалось достаточно одного события mousedown:
    // Ищем диалог с по номеру телефона:
    dialog = document.querySelector('span[title="+7 905 837-96-43"]');
    
    // Вызываем событие mousedown на найденном элементе:
    dialog.dispatchEvent(
      new MouseEvent('mousedown', {
          bubbles: true
      })
    );

    При этом bubbles является параметром обязательным, без него не работает.
    Ответ написан
    Комментировать
  • Можно ли подменить скрипт?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Можно. Способа тут три:
    1. Подменить через обратный прокси (реверс прокси)
    2. Подменить используя расширение для браузера
    3. Просто перезаписать скрипт в консоли браузера
    Ответ написан
  • Как скрывать колонки в DataTables jQuery, а не удалять их из DOM?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Данный подход не верный. Вам надо вешать обработчики на чекбоксы и просто запоминать все отмеченные строки куда-нибудь в переменную, а уже потом при отправке формы добавлять эту информацию к форме.
    Ответ написан
    1 комментарий
  • Граждане гении, хорошо ли это, если сайт состоит из одной динамической страницы?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Для поисковых систем конечно плохо, хотя они в принципе и умеют парсить динамический контент.
    Ответ написан
  • Как получить audio файл с сайта?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Blob - это и есть ваш звук!

    Для его отправки на сервер нужно использовать конструктор форм FormData и отослать форму посредством AJAX.

    На сервере потом смотрите глобальный массив $_FILES там и будет лежать ваш звук.

    // Пример функции для отправки файла в виде Blob на сервер:
    
    function send_blob_to_server(blob, url) {
      
      var formData = new FormData();
      formData.append('file', blob, blob.name);
    
      var xhr = new XMLHttpRequest();
      xhr.open('POST', url);
      
      xhr.onreadystatechange = function() {
        if (xhr.readyState === XMLHttpRequest.DONE) {
          if (xhr.status === 200) {
            alert('Запрос выполнен успешно, ответ сервера: ' + xhr.responseText);
          }
          else {
            alert('При выполнении запроса произошла неизвестная ошибка!');
          }
        }
      }
      
      xhr.send(formData);
    
    }
    
    // Для использовани функции первым параметром передаете Blob,
    // а вторым параметром адрес куда надо отослать ваш Blob:
    send_blob_to_server(audioBlob, 'https://qna.habr.com/q/846401');
    Ответ написан
  • Как сохранять ассеты и ресурсы игры на смартфоне для игры на Phaser?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Есть, как не быть. Данные веб-игр можно хранить в:
    https://learn.javascript.ru/indexeddb
    Ответ написан
    8 комментариев
  • Почему ajax не работает с предзагрузкой файла картинок FileReader?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Удалите этот код:
    $(document).on('submit', '#commentform', function(e) {
      e.preventDefault();
      var filter = $(this);
      $.ajax({
        url: filter.attr('action'),
        data: filter.serialize(),
        type: filter.attr('method'),
        success: function(data) {
          $('#review-thanks').addClass('active');
        },
        error: function() {}
      });
    });


    Вместо него используйте чистый JavaScript:
    // По готовности страницы, вешаем на форму обработчик onsubmit инлайново:
    
    document.addEventListener('DOMContentLoaded', function() {
    	document.querySelector('form#commentform').setAttribute('onsubmit', 'event.preventDefault(); form_send(this);');
    });
    
    // Функция для отправки формы на чистом JavaScript:
    
    function form_send(form) {
    	form.setAttribute('onsubmit', 'event.preventDefault();');
    	var url = form.getAttribute('action') + '?nocache=' + new Date().getTime();
    	var xhr = new XMLHttpRequest(); xhr.open('POST', url);
    	xhr.onreadystatechange = function() {
    		if (xhr.readyState === XMLHttpRequest.DONE) {
    			form.setAttribute('onsubmit', 'event.preventDefault(); form_send(this);');
    			if (xhr.status === 200) {
    				document.querySelector('#review-thanks').classList.add('active');
    				alert('Форма успешно отправлена, ответ сервера: ' + xhr.responseText);
    			}
    			else {
    				console.log('При отправке формы произошла ошибка, ниже объект с деталями ошибки:');
    				console.dir(xhr);
    				alert('При отправке формы произошла ошибка, детали смотрите в консоли.');
    			}
    		}
    	}
    	xhr.send(new FormData(form));
    }

    Алерты по желанию можете убрать.
    Ответ написан
    4 комментария
  • Как проверить на JS введен номер телефона в Input или нет?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Сначала удаляйте все символы, кроме цифр, только затем проверяйте длину номера телефона.
    Ответ написан
    Комментировать
  • Как получить данные тела по ключу в объекта в localStorage?

    zkrvndm
    @zkrvndm
    Архитектор решений
    То что у вас записано в хранилище называется JSON, почитайте в интернете что это такое и с чем его едят. Ниже ответ на ваш вопрос:
    // Преобразуем JSON в объект:
    obj = JSON.parse(localStorage.getItem('cart'));
    // Получаем массив ключей из объекта:
    keys = Object.keys(obj);
    // Выводим сообщение в консоли:
    console.log('Найдено ключей: ' + keys.length);
    console.dir(keys);
    Ответ написан
    Комментировать
  • Как получить переменную из get/post?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Просто используйте localStorage.
    Ответ написан
    Комментировать