Задать вопрос
  • Как записать рекурсию (функц. глубокого копирования) в виде цикла?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Самый простой вариант клонировать обьект это конвертировать его в JSON, а потом обратно. Другое дело, что это не подойдет, если в объекте есть типы данных, которые нельзя представить внутри JSON. Вам обязательно цикл нужен?
    Ответ написан
    2 комментария
  • Есть альтернатива jQuery Form Plugin без jQuery?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Это делается в один абзац кода на чистом JavaScript:
    <script>
    	
    	// Обрабочик для отслеживания готовности страницы:
    	
    	document.addEventListener('DOMContentLoaded', function() {
    		
    		// Ставим на форму обработчик срабатывающий при отправке формы:
    		
    		document.querySelector('form').addEventListener('submit', async function() {
    		
    			var this_form = this; // Получаем ссылку на форму
    			event.preventDefault(); // Отменяем обычную отправку
    			
    			// Блокируем нажатия по форме:
    			
    			this_form.style.opacity = '0.5';
    			this_form.style.pointerEvents = 'none';
    			
    			// Блок кода для отправки формы:
    			
    			try {
    				
    				// Отправляем форму без перезагрузки страницы и выводим ответ сервера на месте формы, как обычный текст:
    				
    				this_form.outerHTML = await (await fetch(this_form.action, { method: 'POST', body: new FormData(this_form) })).text();
    				
    			}
    			
    			// Блок кода для обработки ошибок:
    			
    			catch(err) {
    				
    				// Вывод ошибки, если вдруг отправка неудачная:
    				console.error(err); this_form.outerHTML = err.toString();
    				
    				// Разблокируем форму:
    				
    				this_form.style.opacity = '';
    				this_form.style.pointerEvents = '';
    				
    			}
    			
    		});
    		
    	});
    	
    </script>
    Ответ написан
    Комментировать
  • Как напечатать .docx документ через js?

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

    zkrvndm
    @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
    @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
    @zkrvndm
    Архитектор решений
    Да любой. Например можешь взять UIkit: https://3uikit.ru/form
    Ответ написан
    Комментировать
  • В чем отличие Deferred.always / Deferred.done / Deferred.fail от Deferred.then?

    zkrvndm
    @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
    @zkrvndm
    Архитектор решений
    Самый популярный учебник по JavaScript:
    https://learn.javascript.ru
    Поковыряйте на досуге. Если получается и вам удается понимать темы, значит шансы у вас есть, но если даже сильно разжеванных объяснений с этого сайта не хватает, чтобы въехать в тему, возможно программирование это не ваше.

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

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

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

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

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

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

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

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

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

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вот так записываешь данные:
    localStorage.testovik = 'Здесь данные, которые ты хочешь сохранить...';

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

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

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

    zkrvndm
    @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
    @zkrvndm
    Архитектор решений
    Если вам надо обработать все запросы словно это один запрос используйте промисы для оборачивания запросов и метод Promise.all - он разом вернет результаты всех запросов.
    Ответ написан
    Комментировать
  • Как спарсить pdf файлы с сайта?

    zkrvndm
    @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
    @zkrvndm
    Архитектор решений
    Напиши батник или VBS скрипт.
    Ответ написан
  • Как обработать и загрузить большой xml файл с товарами?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Комментировать