• Как напечатать .docx документ через js?

    @zkrvndm
    Софт для автоматизации
    Файл .docx на самом деле представляет с собой обычный zip-архив. Внутри архива разные xml -файлы, можно спокойно найти нужное место в тексте и поменять на то, что нужно. Как поменять и чем поменять? Для JavaScript существует много архиваторов, лично я сам, когда у меня возникла такая же задача, как у вас, использовал этот:
    https://stuk.github.io/jszip

    P. S. Если вы под напечатать имейте в виду отправку на принтер, то тогда забудьте все, что я написал выше, вам сюда:
    https://yandex.ru/search/?text=%D0%9E%D0%BF%D1%80%...
    Ответ написан
    Комментировать
  • Как передать чистый base64?

    @zkrvndm
    Софт для автоматизации
    Если вы хотите данный base64-файл вставить в поле input, то вы неправильный вопрос задали, потому что удаление приставки вам тут никак не поможет, а вставка выполняется совсем по другому.
    Ответ написан
  • Как сортировать таблицу с ценами в JQuery?

    @zkrvndm
    Софт для автоматизации
    Пример сортировки строк таблицы по цене на jQuery от большего к меньшему:
    $('table#price-table > tbody > tr').sort(function(a, b) {
        var one = Number($(a).children().eq(6).text().replace(/[^0-9]/g, ''));
        var two = Number($(b).children().eq(6).text().replace(/[^0-9]/g, ''));
        return two - one;
    }).each(function(n, tr) {
        $('table#price-table > tbody').append(tr);
    });

    Если цена будет указана с копейками, работать НЕ будет.
    Ответ написан
    2 комментария
  • Как прослушать XHR-запрос?

    @zkrvndm
    Софт для автоматизации
    Вы можете подменить метод XHR на свой и смотреть, что отправляется:
    var original = {
    	open: XMLHttpRequest.prototype.open,
    	send: XMLHttpRequest.prototype.send
    };
    
    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
    	console.log(method, url, async, user, password);
    	return original.open.call(this, method, url, async, user, password);
    };
    
    XMLHttpRequest.prototype.send = function (data) {
    	console.log(data);
    	return original.send.call(this, data);
    };
    Ответ написан
    Комментировать
  • Какую js-библиотеку можно взять для такой стилизации селектов?

    @zkrvndm
    Софт для автоматизации
    Да любой. Например можешь взять UIkit: https://3uikit.ru/form
    Ответ написан
    Комментировать
  • В чем отличие Deferred.always / Deferred.done / Deferred.fail от Deferred.then?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Оказалось есть принципиальная разница в поведении.

    Методы Deferred.always / Deferred.done / Deferred.fail возвращают тот же самый Deferred на котором были вызваны, а вот метод Deferred.then работает чуть посложнее.

    Deferred.then - возвращает НОВЫЙ объект Deferred. Если функция обработчик который вы передали в Deferred.then возвращает Deferred, то Deferred.then вернет именно этот самый Deferred. Если функция обработчик который вы передали в Deferred.then возвращает значение, то Deferred.then вернет выполненый Deferred с этим значением.

    Соответственно, принципиальное различие между методами Deferred.always / Deferred.done / Deferred.fail и Deferred.then в том, что на втором можно построить цепочки вызовов для последовательного асинхронного выполнения своего кода, а вот на первых так не получится.

    Пример
    d = $.Deferred(function(def) {
        setTimeout(function() {
            console.log(1);
            def.resolve();
        }, 1000);
    });
    
    d.then(function() {
        var def = $.Deferred();
        setTimeout(function() {
            console.log(2);
            def.resolve();
        }, 1000);
        return def;
    })
    
    .then(function() {
        var def = $.Deferred();
        setTimeout(function() {
            console.log(3);
            def.resolve();
        }, 1000);
        return def;
    })
    
    .then(function() {
        var def = $.Deferred();
        setTimeout(function() {
            console.log(4);
            def.resolve();
        }, 1000);
        return def;
    })
    
    .then(function() {
        var def = $.Deferred();
        setTimeout(function() {
            console.log(5);
            def.resolve();
        }, 1000);
        return def;
    });
    Ответ написан
    Комментировать
  • JavaScript для новичков?

    @zkrvndm
    Софт для автоматизации
    Самый популярный учебник по JavaScript:
    https://learn.javascript.ru
    Поковыряйте на досуге. Если получается и вам удается понимать темы, значит шансы у вас есть, но если даже сильно разжеванных объяснений с этого сайта не хватает, чтобы въехать в тему, возможно программирование это не ваше.

    P. S. Учебник бесплатен при просмотре на сайте, платить там ничего не надо!
    Ответ написан
    Комментировать
  • Как определить номер строки вызвавший Deferred.reject?

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

    Сделал обёртку для $.Deferred() - это работает. Ниже пример, если кому надо:

    Развернуть пример
    $(function() {
    	
    	// Логирование всех reject-событий:
    	
    	var original_deferred = $.Deferred;
    	$.Deferred = function() {
    		var deferred = original_deferred.apply(this, arguments);
    		var original_reject = deferred.reject;
    		deferred.reject = function() {
    			try { throw Error(); } catch(err) {
    				var mod_args = $(arguments).toArray();
    				var str_num = err.stack.split(':').reverse()[1];
    				mod_args.unshift(str_num + ' строка:');
    				console.error.apply(this, mod_args);
    				original_reject.apply(this, arguments);
    			}
    		}
    		return deferred;
    	}
    	
    	init(); // Проверка
    	
    });
    
    function init() {
    	
    	var deferred = $.Deferred();
    	
    	setTimeout(function() {
    		deferred.reject('Тестовая ошибка!');
    	}, 1000);
    	
    	return deferred;
    	
    }
    Ответ написан
    Комментировать
  • С помощью какого расширения для браузера Google Chrome можно искать вхождения в его адресной строке?

    @zkrvndm
    Софт для автоматизации
    Вадим Соловьёв, то что вы указали называется параметрами GET-запроса. Для их получения никакие браузерные расширения не нужны. На целевом сайте откройте консоль, это делается комбинацией клавиш Ctrl + Shift + J.

    Уже там в консоли введите следующую команду:
    new URLSearchParams(location.search).get('size');
    И нажмите Enter.

    size - это имя параметра, значение которого вам надо получить, можете заменить на свое.
    Ответ написан
    Комментировать
  • Как выполнить удаленный код на Manifest V3?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Решение найдено. Выполнить удаленный код на Manifest V3 можно следующим образом:

    1. В манифесте расширения прописываем контент-скрипт для нужного вам сайта.

    2. В файле контент-скрипта выполняем вставку тега script со ссылкой src на локальный файл из папки расширения. Это важный момент, на этом этапе нельзя сразу вставить удаленный код, так как расширение просто не даст это сделать ссылаясь на Content Security Policy. Поэтому сначала вставляем скрипт загрузчик, который должен обязательно присутствовать локально внутри с папкой расширения. Не забываем, что для загрузки локального скрипта у вас должны стоят правильные разрешения в манифесте в параметре web_accessible_resources.

    3. Уже внутри этого локального скрипта загрузчика, который мы вставили на этапе 2, можно загрузить удаленный код со своего сервера и вставить его инлайново на страницу. Он будет гарантированно выполнен в контексте страницы словно это родной скрипт сайта. Для кого-то это не важно в каком контексте мы выполняем код, но для меня важно, так как иногда чтобы сгенерировать корректный Event надо это делать именно из контекста страницы.
    Ответ написан
    Комментировать
  • Почему не парсится строка в JSON?

    @zkrvndm
    Софт для автоматизации
    Вы передаете массив, а надо передавать строку. Изучите типы данных в JavaScript, чтобы больше так не ошибаться.

    https://learn.javascript.ru/types
    Ответ написан
    Комментировать
  • Как сделать так, чтобы информация с одной страницы передавалась на другие?

    @zkrvndm
    Софт для автоматизации
    Вот так записываешь данные:
    localStorage.testovik = 'Здесь данные, которые ты хочешь сохранить...';

    Где testovik это ключ по которому ты позже будешь получать доступ, он может быть почти любой.

    А вот так потом извлекаешь на другой странице:
    infa = localStorage.testovik;
    console.log(infa); // Выводим в консоли

    Только предупреждаю, что так можно хранить только строки, т. е. только текст.
    Объекты и массивы надо сначала перегнать в текст, прежде чем пихать в хранилище localStorage.
    Ответ написан
    Комментировать
  • Как получить путь к файлу из input type="file"?

    @zkrvndm
    Софт для автоматизации
    Пути получить можно, но только если выбирается папка.

    Например, введите в консоли:
    var input = document.createElement('input');
    input.setAttribute('type', 'file');
    input.setAttribute('webkitdirectory', 'true');
    
    input.addEventListener('change', function() {
        
        console.log('Выбраны файлы', input.files);
    
        console.log('Пути файлов относительно выбранной папки:');
    
        for (var n = 0; n < input.files.length; n++) {
            console.log(input.files[n].webkitRelativePath);
        }
        
    });
    
    input.click();

    И выберите какую-нибудь папку, где будет хотя бы несколько файлов (любых).

    Также при большом желании можно получить путь в виде Data URL - это такой формат адреса, когда файл сам весь целиком помещается непосредственно в адрес (в ссылку). Ниже пример Data URL, попробуйте его открыть:
    data:image/png;base64,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

    Просто скопируйте и вставьте в адресную строку.
    Ответ написан
    Комментировать
  • Как синхронно дождаться данных с сервера?

    @zkrvndm
    Софт для автоматизации
    Если вам надо обработать все запросы словно это один запрос используйте промисы для оборачивания запросов и метод Promise.all - он разом вернет результаты всех запросов.
    Ответ написан
    Комментировать
  • Как спарсить pdf файлы с сайта?

    @zkrvndm
    Софт для автоматизации
    Это делается элементарно, через консоль браузера. Зайдите на эту страницу:
    https://codernet.ru/media

    Нажмите, комбинацию CTRL + SHIFT + J и в открывшейся консоли введите:
    // Получаем список всех ссылок со страницы:
    
    links = document.querySelectorAll('a[href]');
    
    // Перебираем найденные ссылки в цикле:
    
    for (var n = 0; n < links.length; n++) {
    	
    	// Если ссылка ведет на текущий сайт (внутренняя):
    	
    	if (new URL(links[n].href)['host'] == location.host) {
    		
    		// Скачиваем html-код по этой ссылке:
    		
    		html = await (await fetch(links[n].href)).text();
    		
    		// Парсим этот html-код:
    		
    		doc = new DOMParser().parseFromString(html, 'text/html');
    		
    		// Ищем в спарсеном коде все pdf-ки:
    		
    		pdfs = doc.querySelectorAll('a[href$=".pdf"]');
    		
    		// Перебираем найденные pdf-ки в цикле:
    		
    		for (var i = 0; i < pdfs.length; i++) {
    			
    			// Выводим ссылку в консоли:
    			console.log(pdfs[i].href);
    			
    		}
    		
    	}
    	
    }
    Ответ написан
    6 комментариев
  • Как создать бота для windows?

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

    @zkrvndm
    Софт для автоматизации
    Комментировать
  • Как создать свой тип данных в Joomla?

    @zkrvndm
    Софт для автоматизации
    Дополнительные поля в Joomla:
    joom4all.ru/sites-creation/basics/custom-fields
    Ответ написан
    1 комментарий
  • Можно ли в цикле foreach взаимодействовать с элементами цикла?

    @zkrvndm
    Софт для автоматизации
    vegs.forEach((veg, index) => {
        if (index === 0) {
            veg.classList.add('active');
        }
    });
    Ответ написан
    Комментировать
  • Как сделать переход между страницами без перезагрузки?

    @zkrvndm
    Софт для автоматизации
    Ниже пример функции для загрузки контента страниц по AJAX и без перезагрузки страницы:
    async function pageUpdate(event) {
    	
    	// Если функция вызвана без аргументов:
    	
    	if (typeof event == 'undefined') {
    		
    		// Устанавливаем обработчики
    		// на все ссылки на странице:
    		
    		$('body a[href]').click(pageUpdate);
    		
    	}
    	
    	// Если функция вызвана
    	// в результате клика
    	// по ссылке:
    	
    	else {
    		
    		// Берём адрес с нажатой ссылки
    		// и записываем в переменную link:
    		
    		var link = event.target.href;
    		
    		// Если ссылка ведет на наш сайт:
    		
    		if (new URL(link)['host'] == location.host) {
    			
    			// Предотвращаем переход:
    			
    			event.preventDefault();
    			
    			// Блокируем страницу, чтобы
    			// больше нельзя было кликать:
    			$('body').css('pointer-events', 'none');
    			
    			// Активируем анимацию исчезновения (полупрозрачности):
    			
    			var hide = $('body').animate({ opacity: 0.2 }, 500).promise();
    			
    			var ajax = $.ajax(link); // Запускаем загрузку новой страницы
    			
    			await hide; // Ждем окончания анимации исчезновения
    			
    			// Вставляем данные на страницу беря их с ново-скачанной страницы:
    			
    			var doc = new DOMParser().parseFromString((await ajax), 'text/html');
    			var html = $('body', doc).html();
    			$('body').html(html);
    			
    			// Скролим в самый вверх:
    			$('body, html').animate({scrollTop: 0}, 0);
    			
    			// Меняем адрес в адресной строке:
    			history.pushState(null, null, link);
    			
    			// Заново ставим
    			// обработчики:
    			
    			pageUpdate();
    			
    			// Активируем анимацию
    			// постепенного появления:
    			
    			await $('body').animate({ opacity: 1 }, 500).promise();
    			
    			// Снимаем блокировку с документа:
    			
    			$('body').css('pointer-events', '');
    			
    		}
    		
    	}
    	
    }
    
    pageUpdate();

    Функция перехватывает клики по ссылкам, добавляет анимацию и обновляет контент страницы без перезагрузки.

    Важно! Если на сайте есть какой-то сложный функционал, данный скрипт скорее-всего их сломает!
    Ответ написан
    Комментировать