Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как дать боту статус "на телефоне"?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Я ранее не сталкивался с дискордом, но если вдруг у него есть веб-версия корректно работающая в браузерах на смартфонах, то нужного вам бота можно создать как расширение Chrome. Подменяем при помощи расширения User-Agent и встраиваем управляющий код в веб-версию, после чего внешними командами рулим им как нужно.
    Ответ написан
    Комментировать
  • Как вызвать переход на страницу благодарности после отправки формы jquery?

    zkrvndm
    @zkrvndm
    Архитектор решений
    $.ajax({
      url: 'send.php',
      type: 'post',
      data: {},
      success: function(result) {
        location.href = 'https://qna.habr.com';
      }
    });
    Ответ написан
    Комментировать
  • Как мониторить процент загрузки при использовании AJAX?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Неожиданно много человек подписалось) Распишу результаты экспериментов. Код предложенный Владлен Хеллсайт у меня не сработал, хрен знает в чем дело, но глубоко копать не стал, так как мне на глаза попался вот такой jQuery-плагин как раз добавляющий нужный функционал. Для использования подключаем jq-ajax-progress.js у себя на сайте, а дальше используем его функционал следующим образом:
    jQuery.ajax({
    	type: 'POST',
    	url: '/',
    	data: { get : 'table' },
    	cache: false,
    	success: function(result) {
    		console.log(result);
    	},
    	error: function(result) {
    		console.log('Ошибка!');
    	},
    	progress: function(e) {
    		procent = (e.loaded * 100 / e.total).toFixed();
    		console.log(procent); // Процент приема файла
    	}
    });

    Думаю всем понятно, что в e.loaded лежит кол-во загруженных байт, а e.total размер файла.

    Если вдруг у вас не работает, гляньте значение e.total - хоть это и размер файла, но лично у меня он почему был равен нулю, в итоге расчеты процента загрузки были неверными, даже пробовал в php-скрипте (что отдает файл) прописать заголовок header с размером файла в байтах, но не помогло. Пришлось делать обходной манер: сначала отдельным запросом запрашивать с сервера размер файла, а потом загружать сам файл и уже зная его размер вычислять процент, по мере загрузки.
    Ответ написан
    Комментировать
  • Существует ли обработчики срабатывающие, когда элемент попал в зону видимости страницы?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Удалось реализовать ленивую отрисовку высоты textarea - элементы идут в обработку по мере прокрутки страницы и входа в область видимости (с запасом, сверху на 100% и снизу на 300%). Решение следующее:
    observer = new IntersectionObserver(onView, { threshold: [0], rootMargin: '100% 0px 300% 0px' });
    
    textarea = document.querySelectorAll('textarea');
    
    for (l = 0; l < tarrr.length; l++) {
    	observer.observe(textarea[l]);
    }
    
    function onView(massiv) {
        
        for (j = 0; j < massiv.length; j++) {
            
            if (massiv[j].isIntersecting === true) {
                
                autosize(massiv[j].target);
                
            }
            
        }
        
    }

    Спасибо Алексей Тен за наводку =)
    Ответ написан
    Комментировать
  • Как передать сообщение из popup-окна расширения во все запущенные content-скрипты?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Все, я разобрался. Оказалось, что для передачи сообщения в content-скрипт нужно использовать другой метод:
    chrome.tabs.query({}, function(tabs) {
        for (var i=0; i<tabs.length; i++) {
            chrome.tabs.sendMessage(tabs[i].id, "наше сообщение");
        }
    });

    Прием сообщения через chrome.extension.onMessage.addListener() корректно работает.
    Ответ написан
    Комментировать
  • Что необходимо знать, чтобы парсить сайты?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Чтобы парсить на JavaScript достаточно знать этот самый JavaScript, так как он СПЕЦИАЛЬНО создан, чтобы работать с контентом на сайтах (вот неожиданность).
    Ответ написан
    8 комментариев
  • Как с помощью jquery искать элементы с псевдоклассом?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Псевдо элементы напрямую не отредактировать, вы можете предопределить их добавив новые стили инлайново:
    jQuery('head').append('<style> .hamburger__menu_icon:before { border: 2px dashed #FF0000; } </style>');

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вы неправильно храните данные. В идеале данные надо представить в виде объекта со всей исчерпывающей информацией (данные полей, дата сохранения и так далее), перегнать этот объект в JSON и уже потом сохранить в localStorage. Смысл плодить кучу ключей?
    Ответ написан
  • Ошибка DOM. Как получить элемент из iframe?

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

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Нашел решение. Оказывается, существует событие paste, которое происходит, когда мы вставляем что-то в блок. Соответственно, можно повесить обработчик на него, отменить действие по умолчанию, а затем перехваченный текст обработать как душе угодно:
    document.querySelector('div[contenteditable="true"]').addEventListener("paste", function(e) {
            e.preventDefault();
            var text = e.clipboardData.getData("text/plain");
            document.execCommand("insertHTML", false, text);
    });
    Ответ написан
    Комментировать
  • Как сгруппировать элементы массива по значению одного из свойств?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Рекомендую ознакомится, полезно и интересно:
    https://habr.com/ru/company/ruvds/blog/480354/
    Ответ написан
    Комментировать
  • Как делать пошаговые действия?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Самый простой вариант, использовать запуск действий по таймеру, гуглите setTimeout()
    также загуглите как работают условия if else с помощью них можно проверять текущий адрес и в зависимости от адреса выполнять нужные действия.
    Ответ написан
    Комментировать
  • Как вставить элемент несколько раз во все элементы с заданным классом?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вставить нужно на странице? И если да, то вставить как, в начало найденных элементов или конец?
    Ответ написан
  • Как скачать музыку с браузера с сайта vk?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ответ написан
    Комментировать
  • Как передовать свои элементы через iframe или js-скрипты?

    zkrvndm
    @zkrvndm
    Архитектор решений
    В чем собственно проблема? Просто напишите скрипт, который будет по AJAX запрашивать таблицу и выводить ее.
    Ответ написан
  • Как победить погрешность при умножении в javascript?

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    На картинке ниже в общих чертах показано, что доступно для JavaScript в браузерном окружении:
    5e079acc31335240553096.png
    https://learn.javascript.ru/browser-environment
    Ответ написан
    Комментировать
  • Как вставить blob в поле выбора файла?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Я нащупал два решения для этой проблемы.

    Первый способ позволяет вставить произвольный Blob в поле <input type="file"> и для обработчиков на целевом сайте все будет выглядеть, будто в поле реально присутствуют файлы, хотя это конечно будет не так.

    Итак, функция для вставки:
    // Пример функции для вставки Blob в поле input:
    
    function pasteBlobToInput(blob, input) {
    	
    	// Конвертируем Blob в File:
    	var file = new File([blob], blob.name);
    	
    	// Создаем коллекцию файлов для последующий вставки:
    	var file_list = {0: file, length: 1, '__proto__': input['files']['__proto__']};
    	
    	// Сохраняем прототип поля:
    	var proto = input['__proto__'];
    	
    	// Подменяем прототип для разблокировки св-ства files на запись:
    	input['__proto__'] = document.createElement('div')['__proto__'];
    	
    	// Записываем коллекцию файлов:
    	input['files'] = file_list;
    	
    	// Возвращаем прототип на место:
    	input['__proto__'] = proto;
    	
    	// Выводим уведомление:
    	console.log('Коллекция успешно вставлена:');
    	console.dir(file_list);
    	
    	// Заставляем сработать обработчики на поле выбра файлов:
    	input.dispatchEvent(new InputEvent('change', { bubbles: true }));
    	
    }

    Первым параметром функции передаем Blob, а вторым элемент input куда нужно его вставить. Обратите внимание, что Blob должен иметь имя в свойстве name. Если у вас Blob без названия, то добавьте его. К сожалению, коллекция файлов способом выше создается неполноценная, но даже этой неполноценной коллекции достаточно чтобы обмануть обработчики. Я писал это решение для WhatsApp-бота и там у меня реально все работает)

    Второй вариант позволяет получать полноценные коллекции файлов и далее их вставлять и использовать их где угодно. Для начала нам нужно подключить библиотеку localforage:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/localforage/1.9.0/localforage.js"></script>

    Далее, мы можем выбрать файлы для коллекции и сохранить их в памяти браузера:
    var input = document.createElement('input');
    input.setAttribute('type', 'file');
    input.setAttribute('multiple', 'multiple');
    input.addEventListener('change', async function() {
    	var files = await localforage.setItem('files', this.files);
    	console.log('Коллекция файлов успешно сохранена:');
    	console.dir(files);
    });
    input.click();

    Сохраненную коллекцию мы позднее сможем использовать даже после перезагрузки страницы или закрытия / открытия браузера. Для извлечения сохраненной коллекции достаточно выполнить:
    var files = await localforage.getItem('files');
    console.log('Коллекция файлов успешно извлечена:');
    console.dir(files);

    Эта коллекция полноценная и мы легко можем ее прицепить в любое поле:
    var files = await localforage.getItem('files');
    document.querySelector('input[type="file"]').files = files;

    При этом файлы в поле будут выглядеть точно так же, будто выбраны с компа, никаких отличий.
    Ответ написан
  • Есть 2 формы как понять какая заполнена и отправить данные этой формы?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Обработчики переделайте в функции. У вас должно быть 2 разных функции для отправки. Далее, внутри кнопок отправки просто впишите в атрибуте onclick вызов нужной функции.
    Ответ написан
  • Как защитить приложение?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Делайте защиту на стороне сервера, чтобы какие-то ключевые элементы кода выполнялись удаленно, а на клиент приходил только результат.
    Ответ написан
    Комментировать