Ответы пользователя по тегу JavaScript
  • Как оптимизировать процесс загрузки большего объема данных?

    @zkrvndm
    Софт для автоматизации
    Вот:
    https://github.com/localForage/localForage
    Можно хранить в браузере файлы и данные любого объема.
    Ответ написан
    1 комментарий
  • Как правильно спарсить JSON содержащий комментарии?

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

    https://github.com/json5/json5
    Ответ написан
    6 комментариев
  • Можно ли переопределить свойство Location в браузере?

    @zkrvndm
    Софт для автоматизации
    Можно запретить фрейму менять location родителя, если ты об этом. Вот так ты можешь изолировать фрейм:
    <iframe sandbox="allow-scripts allow-forms allow-same-origin" referrerpolicy="no-referrer" src="https://yousite.com"></iframe>

    С данными атрибутами фрейм не будет видеть на каком сайте он загружен, а sanbox ограничит фрейм.
    Ответ написан
    Комментировать
  • Почему не срабатывает querySelectorAll()?

    @zkrvndm
    Софт для автоматизации
    Это вам не jQuery) Надо в цикле перебрать все элементы массива и отдельно на каждый элемент навесить обработчик. Если хотите, чтобы по волшебству обработчик на все элементы сам приклеился, используйте jQuery.
    Ответ написан
    Комментировать
  • Как прервать window scroll?

    @zkrvndm
    Софт для автоматизации
    Вот железобетонный вариант запретить скролл:
    // Фиксируем начальную позицию прокрутки:
    
    let initialScroll = window.pageYOffset;
    
    // Функция возврата к начальной позиции:
    
    const resetScroll = () => {
      window.scrollTo(0, initialScroll);
    }
    
    // Автовозврат к началу при попытке скрола:
    
    window.addEventListener('scroll', resetScroll);
    Ответ написан
    Комментировать
  • Как сохранить старое значение для input type file?

    @zkrvndm
    Софт для автоматизации
    Вы можете программно вставить изображение в поле input[type="file"] за пользователя следующим способом:
    (async function () {
    
        // Ссылка на целевое изображение:
    
        var link = 'https://yousite.ru/image.jpg';
    
        // Скачиваем изображение, как Blob:
    
        var blob = await (await fetch(link)).blob();
    
        // Из ссылки достаем имя файла (он идет после слеша):
    
        var file_name = new URL(link)['pathname'].replace('/', '');
    
        // Преобразуем Blob в File используя имя файла и MIME-тип:
    
        var file = new File([ blob ], file_name, { type: blob.type });
    
        // При помощи DataTransfer создадим коллекцию файлов FileList с файлом:
    
        var dt  = new DataTransfer(); dt.items.add(file); var file_list = dt.files;
    
        // Вставим созданную коллекцию файлов с нашим файлом в input:
    
        document.querySelector('input[type="file"]').files = file_list;
    
        // Заставим сработать обработчики изменения на поле вставки, если они есть:
    
        document.querySelector('input[type="file"').dispatchEvent(new Event('change'));
    
        // После завершения операции выведем уведомление в консоли:
    
        console.log('Коллекция файлов вставлена в поле:', file_list);
    
    })();
    Ответ написан
  • Как получить значение select после загрузки страницы?

    @zkrvndm
    Софт для автоматизации
    Если в select уже установлено значение, то это значение сразу после загрузки страницы можно получить так:
    $(window).on('load', function() {
        console.log('Значение:', $('#country-list').val());
    });
    Ответ написан
    Комментировать
  • Где можно хорошо выучить js самостоятельно?

    @zkrvndm
    Софт для автоматизации
    Используй ChatGPT как репетитора.
    Ответ написан
    Комментировать
  • Браузерное расширение перестает работать после перезагрузки страницы?

    @zkrvndm
    Софт для автоматизации
    Ты похоже не понимаешь, как работает content.js

    Скрипт content.js запускается по новой всякий раз, когда страница обновляется.

    На реакте этого не происходит лишь потому, что реакт грузит контент без обновления страницы.
    Ответ написан
    Комментировать
  • Есть ли бесплатные аналоги плагина introjs.com?

    @zkrvndm
    Софт для автоматизации
    Ответ предоставлен чат-ботом https://claude.ai

    Да, существуют бесплатные аналоги плагина Intro.js для создания обучающих подсказок на сайте. Вот несколько вариантов:

    1) Driver.js - простой в использовании JS плагин с открытым исходным кодом. Позволяет создавать подсказки и обучающие туры по сайту.

    2) Hopscotch - еще одна библиотека для создания подсказок с открытым кодом. Легко настраиваемая и кастомизируемая.

    3) Joyride - плагин на jQuery для пошаговых инструкций по сайту. Прост в интеграции.

    4) Tourist.js - реализует подсказки в стиле попапов с подсветкой элементов. Небольшой размер.

    5) Bootstrap Tour - создан на основе популярного фреймворка Bootstrap. Интуитивно понятный интерфейс.

    Посмотрите демо этих плагинов, выберите понравившийся по функционалу и простоте использования. Для быстрого старта оптимально подойдут Driver.js или Hopscotch. Удачи!


    P. S. Пользуйтесь поиском или чат ботами прежде, чем спрашивать что-то очевидное!
    Ответ написан
    1 комментарий
  • Как выполнить импорт и экспорт аннотаций в pdf.js?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Всем спасибо, самостоятельно нашел ответ. Оказывается дейтсвительно существует API для доступа к пометкам:
    PDFViewerApplication.pdfDocument.annotationStorage.getAll(); // Вытащит все аннотации из текущего документа
    PDFViewerApplication.pdfDocument.annotationStorage.setAll(); // Запишет аннотации в документ (или хранилище?)

    Правда это в текущем виде мне вряд ли подойдет, так как это все не сериализованные данные, буду копать дальше.
    Ответ написан
    Комментировать
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Софт для автоматизации
    Если ты отправляешь не файлы, то нет смысла использовать FormData, просто отправляй JSON-строку напрямую.

    let xhr = new XMLHttpRequest();
    
    xhr.open('POST', 'mail.php', true);
    
    xhr.setRequestHeader('Content-Type', 'text/plain');
    
    xhr.onreadystatechange = function() {
    
        if (xhr.readyState === 4) {
    
            if (xhr.status === 200) {
    
                console.log('Ответ сервера:', xhr.responseText);
    
            }
    
        }
    
    }
    
    console.log('Отправляем:', array);
    
    xhr.send(JSON.stringify(array));


    На стороне PHP принимаешь данные так:
    <?php
    
    header('Content-Type: text/plain');
    
    $array = json_decode(file_get_contents('php://input'), true);
    
    echo 'Из браузера получены данные: ' . print_r($array, true);
    Ответ написан
  • Как получить соседние элементы?

    @zkrvndm
    Софт для автоматизации
    Это нативный аналог jQuery метода siblings:
    https://basicweb.ru/jquery/jquery_method_siblings.php
    Находит все соседние (смежные) элементы, кроме самого элемента.
    Ответ написан
    Комментировать
  • Как найти на странице все элементы имеющие заданные стили на чистом jQuery?

    @zkrvndm
    Софт для автоматизации
    Конечно можно. В jQuery имеется встроенный метод .filter, который фильтрует найденные элементы по заданному условию, также в jQuery есть метод .css который позволяет узнать то или иное свойство у элемента, итого, объединив 2 этих метода получим то, что вам нужно. Вот пример, найдем все абзацы имеющие строго черный цвет:
    $('p').filter(function(n, el) { return $(el).css('color') == 'rgb(0, 0, 0)'; });

    Разумеется вместо абзацев можно искать что угодно, просто поставьте звездочку, а свойства можно сравнивать любые.
    Ответ написан
    Комментировать
  • Promise executor, почему нельзя уловить ошибку внутри executor с помощью try-catch?

    @zkrvndm
    Софт для автоматизации
    Ну так правильно ошибку выбрасывай, ты должен разрешить промис ошибкой, тогда она выбросится:
    try {
      new Promise((success, error) => {
        console.log('run promise')
        error('custom error');
      });
    } catch(err) {
      console.error(err)
    }
    
    console.log('after test')
    Ответ написан
  • Как в Firefox открывать стартовую страницу в popup?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Мое решение:
    (async () => {
    	
    	var url = new URL(browser.runtime.getURL('start.html'));
    	url.searchParams.set('time', new Date().getTime());
    	
    	var new_window = await browser.windows.create({
    		'url': url.href,
    		'type': 'popup',
    		'focused': true
    	});
    	
    	var windows = await browser.windows.getAll();
    	
    	for (var i = 0; i < windows.length; i++) {
    		
    		if (windows[i].id != new_window.id) {
    			
    			await browser.windows.remove(windows[i].id);
    			
    		}
    		
    	}
    	
    	console.log('Приложение открыто');
    	
    })();

    Это код для background.js, который при запуске браузера создаст popup без элементов управления.

    Если вам известны какие-то другие варианты, то с удовольствием бы почитал.
    Ответ написан
    Комментировать
  • Как выполнить авто установку временного дополнения при запуске Firefox?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Спустя сутки колупаний методом тыка нашел решение.

    Вот инструкция, как установить расширение из папки так, чтобы оно НЕ удалялось при закрытии браузера.

    1. Нужен портативный Firefox редакции Developer:
    https://portableapps.com/apps/internet/firefox-dev...
    Нужен он по той простой причине, что в обычный Firefox неподписанные расширения ставит нельзя.

    2. Дальше надо разрешить установку не подписанных разрешений, для этого перейдите в about:config, там найдите xpinstall.signatures.required и выключите.

    3. Запакуйте ваш расширение в zip архив без сжатия, убедитесь, что в манифесте имеется обязательный пункт:
    "applications": {
    	"gecko": {
    	  "id": "YouExtension@Name",
    	  "strict_min_version": "111.0"
    	}
    }

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

    4. После успешной установки расширения, идем в папку \Data\profile\extensions, там находим xpi файл с именем расширения, типа такого YouExtension@Name.xpi - распаковываем этот архив в папку с именем YouExtension@Name там же рядом, а сам xpi удаляем.

    5. Готово! Перезапускаем браузер, теперь расширение грузится из папки \Data\profile\extensions\YouExtension@Name - вы можете редактировать файлы расширения в режиме реального времени, без необходимости переустанавливать расширение.
    Ответ написан
    Комментировать
  • Как исправить ошибку fetch post - "multipart: NextPart: bufio: buffer full"?

    @zkrvndm
    Софт для автоматизации
    При передачи в теле запроса объекта FormData тип контента указывать не нужно, браузер сам пропишет тип контента.
    Ответ написан
    Комментировать
  • Как передать массив в массиве через строку запроса JSON?

    @zkrvndm
    Софт для автоматизации
    Комментировать
  • Как получить xpath у this элемента?

    @zkrvndm
    Софт для автоматизации
    Перебираешь вверх до документа и составляешь путь:
    https://stackoverflow.com/questions/2420970/how-ca...

    Ну а вообще, так не делают. У тебя this и есть ссылка на элемент, просто передай его куда нужно. Если нужно именно по селектору этот элемент уметь находить, ну назначить этому this произвольный id и уже на него опирайся.
    Ответ написан
    Комментировать