Ответы пользователя по тегу JavaScript
  • Через что лучше отправлять форму обратной связи?

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Загуглите про CORS. Если коротко, то сайт с которого вы запрашивайте данные должен явным образом дать разрешение на чтение ответа, иначе будет ошибка CORS. Разрешение дается посредством добавления заголовка Access-Control-Allow-Origin к ответу, вы должны модифицировать код на стороне своего сайта таким образом, чтобы он добавлял к своему ответу этот заголовок.

    https://yandex.ru/search/?text=Access-Control-Allo...
    Ответ написан
  • Почему не работает MutationObserver?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ставьте наблюдателя уровнем выше, либо вовсе цепляйте на body.
    Ответ написан
    Комментировать
  • Как загрузить видео по url у input[type="file"]?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Набросал вам небольшую функцию для вставки файла в поле по ссылке:
    // Функция для вставки файла в поле input:
    
    async function setFile(input, name, url) {
    	try {
    		var blob = await (await fetch(url)).blob();
    		var dt  = new DataTransfer();
    		dt.items.add(new File([blob], name, {type: blob.type}));
    		input.files = dt.files;
    		console.log('Файл успешно вставлен:');
    		console.dir(input.files);
    		return true;
    	}
    	catch(err) {
    		console.log('Ошибка при вставке файла:');
    		console.dir(err);
    		return false;
    	}
    }

    Первым параметром в функцию передаёте ссылку на само поле, вторым параметром желаемое название для файла, а третьим параметром ссылку на файл. Например:
    // Входные параметры:
    var input_element = document.querySelector('input[type="file"]');
    var file_name = 'Мое музло.mp3';
    var file_link = 'https://ваш-сайт.рф/music.mp3';
    
    // Вызовем функцию для вставки файла:
    setFile(input_element, file_name, file_link);

    Работать это будет при условии, что файл находится на том же домене, что и форма с полем. Иными словами, бесполезно вставлять ссылки на сторонние сайты! Поэтому прежде чем вставлять видео, озаботьтесь тем, что загрузить это видео на свой сайт.

    Дополнительная информация
    Также вместе третьего параметра можно передавать не ссылку на файл, а уже сам файл в представлении base64 - это когда файл конвертируется в длинный-длинный зашифрованный текст. Чтобы перегнать какой-нибудь файл в base64, вы можете использовать онлайн сервисы, вам наверное так будет проще всего.

    Только зачем так заморачиваться, если можно просто положить файл внутри своего сайта и при вставке банально указывать ссылку на него?
    Ответ написан
    8 комментариев
  • Как переписать XMLHttpRequest в fetch?

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

    Пример простого GET-запроса на fetch:
    async function get() {
      var response = await (await fetch('https://test-test.com/sub?channel=system:fb:advc')).json();
      console.dir(response);
    }

    Просто вызовите функцию get()

    P. S. Обработку ошибок делайте через try / catch.
    Ответ написан
    Комментировать
  • Как сделать из src файл?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Это делается намного проще. Вот пример, вставь его в консоли:
    async function getFile(link) {
        var blob = await (await fetch(link)).blob();
        var file = new File([blob], link.replace(/^.*\//g, ''), {type: blob.type});
        return file;
    }
    
    fff = await getFile('./image-name.png');
    console.log('Файл скачан:');
    console.dir(fff);

    Предполагается, что ты знаешь что такое асинхронные функции, так как пример выше надо существенно дорабатывать, чтобы предусмотреть ошибки.
    Ответ написан
    Комментировать
  • Как заглянуть "под капот" JavaScript?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ищите информацию про протопы, в JavaScript все построено на них. Как реализован .toUpperCase() посмотреть через прототипы нельзя, но можно через прототипы изменить сам метод, написав что-то свое, т. е. переписать методы вы вполне можете.

    https://learn.javascript.ru/native-prototypes

    Кстати, существует атаки использующую это особенность JavaScript.

    https://habr.com/ru/company/huawei/blog/547178/
    Ответ написан
    Комментировать
  • Как очистить localStorage после закрытия всех вкладок с сайтом?

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

    P. S. Это лишь один из способов. Также вы можете использовать sessionStorage.
    Ответ написан
    Комментировать
  • Вопрос с собеседования. Вывести сумму транзакций за период, используя один цикл?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ваше задание с собеседования это не про умение работать с циклам, а скорее про умение сравнивать время.
    1. Для начала приводите даты к виду ГГГГ-ММ-ДД это можно легко сделать используя методы split / reverse / join
    2. Далее полученную дату скармливайте new Date и извлекайте из него Unix-время в миллисекундах (метод getTime)
    3. Полученное время в миллисекундах уже можно легко сравнивать между с собой используя операторы сравнения
    Ответ написан
    9 комментариев
  • Как сделать отправку ajax формы?

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

    В моем видении все это можно реализовать так:
    1. При отправке первой формы создаем в БД определенную запись
    2. При отправке второй формы эту запись дополняем новыми данными
    3. Каждую минуту проверяем кроном БД на наличие новых записей и если есть записи старше 3 минут (с момента последнего изменения), то шлем инфу по этой записи на почту
    Ответ написан
    Комментировать
  • Какой есть софт для написания мобильных приложений на JavaScript?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Apache Cordova / PhoneGap Build - можно создавать приложения на смартфон используя JavaScript.
    Ответ написан
    Комментировать
  • Замена конкретного текста на странице с помощью JS?

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

    Для автозамены текста просто перебирайте все текстовые узлы на странице и конкретно их (текстовые узлы) уже меняйте и корректируйте как вам надо.

    Это вам поможет:
    Как перебрать все текстовые узлы на странице?
    Ответ написан
    1 комментарий
  • Как узнать на каком домене находится iframe?

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

    Допустим на сайте site1.ru нам нужно вставить фрейм показывающий сайт site2.ru

    Для этого просто добавляем обработчик, который после подгрузки фрейма отправит в него URL на котором данный фрейм просматривается:
    <iframe onload="this.contentWindow.postMessage(location.href, '*');" src="https://site2.ru"></iframe>

    Чтобы site2.ru (который находится внутри фрейма) мог получить сообщение с адресом, нужно на нем (на сайте site2.ru) разместить обработчик для просушивания сообщений:
    window.addEventListener('message', function(event) {
    	console.log('Поступило сообщение с адреса '+event.origin+' текст сообщения: ' + event.data);
    });
    Ответ написан
  • Как вернуть результат асинхронного запроса?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Используйте промисы:
    async function dictionary(word) {
        var response = await $.ajax({
            type: "POST",
            url: "php/post.php",
            data: {'word':word},
            dataType: 'json'
        });
        console.log('Получен ответ сервера:');
        console.dir(response);
        return response;
    }

    Но нужно понимать как все это работает, иначе прострелите себе ногу, образно.
    Ответ написан
    Комментировать
  • CORS ошибка при отправке запроса к CDEK API?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Во первых, заголовок "Access-Control-Allow-Origin": "*" должен присылать CDEK, а не ВЫ. Во вторых, раз уж он этот заголвок не отдает, то тут ничего не поделать - из браузера напрямую вы инфу не запросите никак. Вы должны обратится на свой сайт (сервер), а ваш сайт уже должен сделать запрос, получить данные и отдать их в браузер - вот в таком в виде это будет работать. В общем, проксируйте запрос через свой сервер.
    Ответ написан
  • Почему возникла ошибка No 'Access-Control-Allow-Origin' header is present on the requested resource?

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

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

    Материалы по теме:
    https://habr.com/ru/company/nordavind/blog/212709/
    https://html5.by/blog/localforage/
    Ответ написан
    Комментировать
  • JS. Как правильно синхронизировать события?

    zkrvndm
    @zkrvndm
    Архитектор решений
    1. Допишите в конце первого события, чтобы по выполнению запускал все остальные
    2. Используйте промисы, а конкретно вам поможет Promise.all() - при помощи нее можно сделать так, чтобы нужное событие стартовало последним, только после завершения всех других событий
    Ответ написан
    Комментировать
  • Не исполняется script вставленный с помощью append?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Для выполнения кода из строки вы можете использовать eval()
    Берете текст из поля и пихайте в eval()
    Ответ написан
    Комментировать
  • Нужно ли отключать JavaScript в даркнете?

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