Ответы пользователя по тегу JavaScript
  • Как установить фокус на поле?

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

    Делайте так:
    $('.header-search__popup').click(function() {
        setTimeout(function() {
            $('input.aws-search-field').focus();
        }, 200);
    });
    Ответ написан
    Комментировать
  • Как получить значения chrome storage в content script?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Если вы вот так сохраняйте контент:
    var mail = document.getElementById("mail").value;
    То я вам скажу, что он так не сохраняется.

    Нужно так:
    chrome.storage.local.set({mail: document.getElementById("mail").value}, function() {
        console.log('Сохранено' );
    });
    Ответ написан
  • JS. Как из массива объектов сделать объект с параметрами из свойств?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Старый добрый for вам поможет:
    var obj = {};
    
    for (var n = 0; n < array.length; n++) {
        obj[array[n]['name']] = array[n]['value'];
    }
    
    console.dir(obj);
    Ответ написан
    Комментировать
  • Как подключить recapcha v3 к форме на ajax?

    zkrvndm
    @zkrvndm
    Архитектор решений
    В большинстве случаев, для защиты от спама рекапча просто не нужна и избыточна.

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

    Но если хотите заморочится с установкой именно рекапчи, вот вам инструкции с примерами:
    https://yandex.ru/search/?text=php%20recaptcha%20v...
    Ответ написан
  • Как лучше реализовать плеер видео?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Чтобы не нагружал сайт - это нужно размещать свои видео на youtube.
    Для понимания, попробуйте открыть там любой видеоролик и нажать Поделиться -> Встроить
    Полученный html-код вставьте на своем сайте и получите современный плеер, который не нагружает ваш сайт.
    Ответ написан
    Комментировать
  • Как писать приложение на js?

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

    Далее, задачу разбейте на блоки и по частям пишите функционал. В случае с блокнотом деление на блоки выглядело бы примерно так:
    1. Научится создавать поля для ввода текста,
    2. Научится программно читать текст из полей
    3. Научится сохранять данные в памяти браузера
    4. Научится извлекать данные из памяти браузера
    5. Научится выводить текстовую информацию на странице

    Как только есть решение по всем составляющим блоки, остаётся лишь объединить все в готовое единое решение.

    В общем, для создания приложений достаточно следовать обычному здравому смыслу и логике. Пот этом не забывать гуглить, если не понятно как реализовать ту или иную микрозадачу - в программровании это самое важное (умение гуглить).
    Ответ написан
    5 комментариев
  • Как получить элементы по классу из ajax ответа?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Используйте DOMParser. Применительно к вашему коду распарсить ответ можно вот так:
    $.ajax({  
    	url: my_url,  
    	method: "GET",
    	dataType: "html",
    	success: function(html){
    		var doc = new DOMParser().parseFromString(html, 'text/html');
    		var txt = $('селектор_для_поиска', doc).text();
    		alert(txt);
    	}
    });

    Как видно из примера, чтобы что-то найти в полученном html, мы его сначала должны превратить в документ при помощи DOMParser, а затем банально передаем полученный документ вторым аргументом в функцию jQuery и в итоге jQuery искать элементы будет не на текущей странице, а конкретно в переданном документе.
    Ответ написан
    Комментировать
  • Как сделать плавный набор текста в input?

    zkrvndm
    @zkrvndm
    Архитектор решений
    На input вы это не сделайте никак, так как невозможно применить CSS-эффекты к отдельным буквам в обычном тексте, но это возможно сделать, если бы каждая вводимая буква была бы внутри элемента span. В общем, вам поможет обычный div с атрибутом contenteditable="true" стилизованный под поле ввода.

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вы можете использовать AlertifyJS. Для начала подключите его:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/alertifyjs-alertify.js/1.0.11/js/alertify.js"></script>


    Далее просто вызывайте одну из этих функций:
    alertify.alert('Произвольный текст');
    alertify.success('Произвольный текст');


    То есть для вызова их при клике, нужно банально прописать в атрибуте onckilck:
    <a href="#box" onclick="alertify.alert('Оставьте свой номер и мы с вами свяжемся')">
      <div id="containercall">
        <img src="resource/call.png" alt="" id="call">
      </div>
      </a>


    Официальный сайт плагина, где можно найти более свежие версии:
    https://alertifyjs.com
    Ответ написан
  • Что означает свойство event?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Event это событие, специальный объект в свойствах которого содержится вся возможная информация об событии. Например, в свойстве target хранится ссылка на html-элемент в котором произошло событие.

    При желании, внутри события можно найти и кординаты мыши и многое другое. Используйте console.dir(event); чтобы посмотреть что там вообще есть.
    Ответ написан
  • Как сделать онлайн для своей игры на сайте?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Чтобы сделать такой функционал нужно знать:
    1. Как делаются POST / GET запросы на JavaScript, а лучше разбираться в WebSocket и уметь его готовить
    3. Иметь базовые навыки на каком-нибудь северном языке программирования, допустим тот же php
    4. Также нужно уметь работать с базами данных (MySQL для php), чтобы хранить комнаты и пользователей
    5. Дополнительно надо понимать, как при помощи JavaScript вообще взаимодействовать со страницей (ну там просчитать что-то, добавить, изменить, вывести и так далее)

    Лично мне не жалко было бы вам предоставить пример создания такого сервиса, вот только для этого мне сначала надо будет его написать, минимально протестировать, а это задача минимум на пару часов, а скорее-всего и на весь день, если делать с учетом разных мелких нюансов. Ни я, ни кто либо другой здесь, вряд ли готов потратить столько времени ради ответа на ваш вопрос - ведь надо будет кроме создания самого сервиса еще и писать мануал / гайд поэтапно конспектируя все свои действия, что тоже потребует дофига много времени.
    Ответ написан
    2 комментария
  • Как отправить корректно форму через ajax внутри iframe?

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

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

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

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

    Первый способ позволяет вставить произвольный Blob в поле <input type="file">. Итак, способ создания коллекции файлов FileList:
    var info = 'Какой-нибудь текст';
    
    var dt  = new DataTransfer();
    dt.items.add(new File([info], 'primer.txt', {type: 'text/plain'}));
    var file_list = dt.files;
    
    console.log('Коллекция файлов создана:');
    console.dir(file_list);
    
    // Вставим созданную коллекцию в реальное поле:
    document.querySelector('input[type="file"]').files = file_list;

    Можно просто пересоздать коллекцию, если надо что-то удалить из поля.

    Второй вариант позволяет получать заранее подготовленные коллекции файлов и далее их вставлять и использовать их где угодно. Для начала нам нужно подключить библиотеку 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;

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

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Лайфхак для создания коллекции файлов FileList:
    var info = 'Какой-нибудь текст';
    
    var dt  = new DataTransfer();
    dt.items.add(new File([info], 'primer.txt', {type: 'text/plain'}));
    var file_list = dt.files;
    
    console.log('Коллекция файлов создана:');
    console.dir(file_list);
    
    // Вставим созданную коллекцию в реальное поле:
    document.querySelector('input[type="file"]').files = file_list;

    В переменную info вместо текста, можно положить в том числе и Blob - это особенность функции new File() которая первым параметром может принять как массив из текстов, так и массив из Blob.

    Фактически лайфхак выше позволяет нам JavaScript-ом скачать любой какой угодно файл со своего сайта и вставить его абсолютно в любое поле <input type="file"> - что просто архиполезно для браузерных ботов.

    Также способ выше можно применить для редактирования уже выбранных пользователем файлов. Например, если надо из поля выбора файлов убрать какие-то определенные файлы и при этом сделать не фиктивно, а реально.

    Огромное спасибо пользователю Mmx Symfony, который нарыл это решение где-то в недрах иностранных сайтов. Сам я, в свое время сколько не искал, везде был ответ, что это невозможно, а оказалось, что нихрена подобного =)
    Ответ написан
    Комментировать
  • Как клонировать один конкретный файл из коллекции FileList?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Лайфхак для создания коллекции файлов FileList:
    var info = 'Какой-нибудь текст';
    
    var dt  = new DataTransfer();
    dt.items.add(new File([info], 'primer.txt', {type: 'text/plain'}));
    var file_list = dt.files;
    
    console.log('Коллекция файлов создана:');
    console.dir(file_list);
    
    // Вставим созданную коллекцию в реальное поле:
    document.querySelector('input[type="file"]').files = file_list;

    В переменную info вместо текста, можно положить в том числе и Blob - это особенность функции new File() которая первым параметром может принять как массив из текстов, так и массив из Blob.

    Фактически лайфхак выше позволяет нам JavaScript-ом скачать любой какой угодно файл со своего сайта и вставить его абсолютно в любое поле <input type="file"> - что просто архиполезно для браузерных ботов.

    Также способ выше можно применить для редактирования уже выбранных пользователем файлов. Например, если надо из поля выбора файлов убрать какие-то определенные файлы и при этом сделать не фиктивно, а реально.

    Огромное спасибо пользователю Mmx Symfony, который нарыл это решение где-то в недрах иностранных сайтов. Сам я, в свое время сколько не искал, везде был ответ, что это невозможно, а оказалось, что нихрена подобного =)
    Ответ написан
    Комментировать
  • Как программно вставить файлы в input?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Лайфхак для создания коллекции файлов FileList:
    var info = 'Какой-нибудь текст';
    
    var dt  = new DataTransfer();
    dt.items.add(new File([info], 'primer.txt', {type: 'text/plain'}));
    var file_list = dt.files;
    
    console.log('Коллекция файлов создана:');
    console.dir(file_list);
    
    // Вставим созданную коллекцию в реальное поле:
    document.querySelector('input[type="file"]').files = file_list;

    В переменную info вместо текста, можно положить в том числе и Blob - это особенность функции new File() которая первым параметром может принять как массив из текстов, так и массив из Blob.

    Фактически лайфхак выше позволяет нам JavaScript-ом скачать любой какой угодно файл со своего сайта и вставить его абсолютно в любое поле <input type="file"> - что просто архиполезно для браузерных ботов.

    Также способ выше можно применить для редактирования уже выбранных пользователем файлов. Например, если надо из поля выбора файлов убрать какие-то определенные файлы и при этом сделать не фиктивно, а реально.

    Огромное спасибо пользователю Mmx Symfony, который нарыл это решение где-то в недрах иностранных сайтов. Сам я, в свое время сколько не искал, везде был ответ, что это невозможно, а оказалось, что нихрена подобного =)
    Ответ написан
    3 комментария
  • Как сохранить обработчики событий jQuery после применения к элементу .wrap()?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Объедениете и переносите все обработчики на самый верхний уровень на body и уже в зависимости от того, что внутри event.target запускать тот или иной скрипт.

    Также можно не так радикально, просто вывести обработчики в соответствующие атрибуты у элементов.

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Проверил, действительно не работает:
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393');
    xhr.setRequestHeader('X-Yandex-API-Key', '04aa3404-32a8-4baf-a280-db8a58bb908a');
    
    xhr.onreadystatechange = function() {
    	if (xhr.readyState === XMLHttpRequest.DONE) {
    		if (xhr.status === 200) {
    			var obj = JSON.parse(xhr.responseText);
    			console.log('Успех:');
    			console.dir(obj);
    		}
    		else {
    			console.log('Ошибка:');
    			console.dir(xhr);
    		}
    	}
    }
    
    xhr.send();

    Происходит это из-за отсутствия заголовка Access-Control-Allow-Origin на стороне Яндекса. Вам необходимо связаться с технической поддержкой Яндекса и уточнить почему отсутствует этот заголовок - возможно они просто недоглядели и это ошибка с их стороны, а возможно так и заудмано, что с фронта нельзя запросить погоду. В последнем случае, вам нужно проксировать запрос через свой сервер используя либо CURL либо file_get_contents()

    Если не знаете, что именно писать в Яндекс, просто дайте им ссылку на мой ответ, их спецы поймут о чем речь.
    Ответ написан
    Комментировать