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

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

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

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

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

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

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

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

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

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

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ты похоже не понимаешь, как работает content.js

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

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

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

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

    zkrvndm
    @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
    @zkrvndm
    Архитектор решений
    Это нативный аналог jQuery метода siblings:
    https://basicweb.ru/jquery/jquery_method_siblings.php
    Находит все соседние (смежные) элементы, кроме самого элемента.
    Ответ написан
    Комментировать
  • Как найти на странице все элементы имеющие заданные стили на чистом jQuery?

    zkrvndm
    @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
    @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
    @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
    @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
    @zkrvndm
    Архитектор решений
    При передачи в теле запроса объекта FormData тип контента указывать не нужно, браузер сам пропишет тип контента.
    Ответ написан
    Комментировать