Ответы пользователя по тегу JavaScript
  • Можно ли удалить *.js?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Конечно можно. Все глобально объявленные функции доступны через window и разумеется их можно перезаписать / удалить, после того, как они отработают свою задачу. Я это так вижу - выполняем функции, а под конец стираем сам скрипт со страницы + объявленные в скрипте функции перезаписываем, как undefined.
    window.functionName = undefined; // где functionName - это имя стираемой функции
    Ответ написан
    1 комментарий
  • Как вставить в js многострочный html код?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Я обычно делаю так:
    var test = '<div>'+
    	'text'+
    	'<div>'+
    		'text2'+
    	'</div>'+
    '</div>';
    
    $('div').append(test);

    Пример на более сложной разметке:
    5f8459bc9d098138730381.png
    P. S. Я этого не знал, но еще оказывается можно использовать ` в качестве кавычек, это наверное наилучший вариант:
    var test = `
    <div>
        text
        <div>
            text2
        </div>
    </div>
    `;
    
    $('div').append(test);
    Ответ написан
    Комментировать
  • Как сделать отложенную загрузку для видео в теге video?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Примерно так:
    <div onclick="this.querySelector('source').setAttribute('src', this.querySelector('source').getAttribute('data-src')); this.removeAttribute('onclick');" class="video-block">
        <video id="my-player" class="video-js" controls data-setup='{}'>
            <source data-src="./video/blum/2.mp4" type="video/mp4"></source> 
        </video>
    </div>

    При клике, будет добавлен атрибут src, содержимое которого взято был бы из data-src. Это простой вариант в лоб, но это конечно несколько неправильно, по уму все скрипты надо вынести во вне, а не писать инлайново.
    Ответ написан
    3 комментария
  • В JavaScript. Как сконвертировать объект в виде строки в сам объект?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Чем вам eval не нравится? Вы всегда можете сгенирировать пустой фрейм и запускать eval там, чтобы он ничему не мешал.
    Ответ написан
    1 комментарий
  • Как зашифровать html сайт?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ну зашифруйте исходники, а приложение потом пусть расшифровывает. Вот только это вам не поможет. Надежной защиты от копирования не существует. Максимум, можно запутать код, чтобы усложнить задачу вору, но не более.
    Ответ написан
    Комментировать
  • Совершить действие с родительскими элементами через javaScript?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Учитесь такие элементарные вопросы гуглить.

    Вашу задачу можно разбить на 3 части:
    1. Установка обработчика клика на кнопку
    2. Нахождение родителя элемента
    3. Выполнение необходимых действий с родителем

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Примерно так:
    $(function() {
        if (location.pathname !== '/') {
            $('.scroll > a').attr('href', '/home.php');
        }
    });
    Ответ написан
    Комментировать
  • Как перебрать массив объектов?

    zkrvndm
    @zkrvndm
    Архитектор решений
    В arr положите свой массив, а далее просто пройдитесь по нему циклом:
    for (var n = 0; n < arr.length; n++) {
        console.log(arr[n]['name']);
    }

    Детали: https://learn.javascript.ru/while-for#tsikl-for
    Ответ написан
  • Передать данные кнопки, с помощью которой произошел sumbit формы?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Используйте столько input type="submit" сколько нужно, но разумеется, это будет работать только при прямой отправке формы. Если вы форму отправляйте аяксом, то тут уже надо править сам аякс скрипт отправки, чтобы он добавлял доп. информацию.
    Ответ написан
    Комментировать
  • Как правильно собрать данные форма с помощью new FormData?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Отправка формы на чистом JavaScript без использования jQuery:
    // По готовности страницы, вешаем на форму обработчик onsubmit инлайново:
    
    document.addEventListener('DOMContentLoaded', function() {
    	document.querySelector('form#userForm').setAttribute('onsubmit', 'event.preventDefault(); form_send(this);');
    });
    
    // Функция для отправки формы на чистом JavaScript:
    
    function form_send(form) {
    	form.setAttribute('onsubmit', 'event.preventDefault();');
    	var url = form.getAttribute('action') + '?nocache=' + new Date().getTime();
    	var xhr = new XMLHttpRequest(); xhr.open('POST', url);
    	xhr.onreadystatechange = function() {
    		if (xhr.readyState === XMLHttpRequest.DONE) {
    			form.setAttribute('onsubmit', 'event.preventDefault(); form_send(this);');
    			if (xhr.status === 200) {
    				alert('Форма успешно отправлена, ответ сервера: ' + xhr.responseText);
    			}
    			else {
    				console.log('При отправке формы произошла ошибка, ниже объект с деталями ошибки:');
    				console.dir(xhr);
    				alert('При отправке формы произошла ошибка, детали смотрите в консоли.');
    			}
    		}
    	}
    	xhr.send(new FormData(form));
    }

    Обратите внимание, что в вашей форме обязательно должен присутствовать атрибут action!
    Ответ написан
    3 комментария
  • Замена (replace) текста в определенном элементе?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вместо
    document.body.innerHTML;
    Укажите
    document.querySelector('.class').innerHTML;
    Где вместо class надо указать класс элемента внутри которого надо замену сделать.
    Ответ написан
  • Как передать время из php в js?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вы должны на стороне php не временную метку в секундах передавать, а конкретно дату и время!
    <?php
    
    // Устанавливаем тип документа и его кодировку:
    header('Content-Type: text/html; charset=utf-8');
    
    // Включаем показ ошибок:
    
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    
    // Записываем в переменную текущую дату и время:
    
    $data = date('d-m-Y H:i:s');
    
    // Выводим скрипт:
    
    echo '<script type="text/javascript">
    let d = "'.$data.'";
    alert(d);
    </script>';
    
    ?>
    Ответ написан
    Комментировать
  • Как решить эту задачу на JS?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Проще и понятнее думаю будет так:
    // Записываем в переменную str, какой-нибудь текст:
    str = prompt('Введите что-нибудь', '');
    
    // Из полученного текста удаляем все, что не является цифрой:
    str = str.replace(/[^0-9]/g, '');
    
    // Если после чистки кол-во символов в переменной str больше нуля:
    
    if (str.length > 0) {
    	alert('Введенный текст содержит цифры!');
    }
    
    // Если иное:
    
    else {
    	alert('Введенный текст НЕ содержит цифр!');
    }
    Ответ написан
    Комментировать
  • Как написать чтобы комп удалял элементы "p" если они больше одной на странице?

    zkrvndm
    @zkrvndm
    Архитектор решений
    1. Вы не правильно используете removeChild
    2. Для отслеживания страницы примените или setInterval или MutationObserver
    Ответ написан
    Комментировать
  • Как использовать переменную за пределами async function?

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Лично я предпочитаю хранить данные не в Cookie и даже не в localStorage, а во встроенной базе данных IndexedDB.

    Подключаем специальную библиотеку, которая упрощает работу с базой InxdexedDB:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/localforage/1.9.0/localforage.js"></script>

    Далее, чтобы сохранить какие-то данные выполняем в консоли браузера:
    result = await localforage.setItem('key', save_data);
    console.log('Данные успешно сохранены:');
    console.dir(result);

    Где в save_data лежат сохраняемые данные, а key это ключ по которому можно было бы получить к ним доступ.

    Из важных особенностей здесь то, что в save_data мы можем положить любой тип данных - хоть строку, хоть массив, хоть объект. Да даже файл при желании можно сохранить! При этом нет ограничений по объему хранимых данных, можете хоть мегабайт, хоть сто мегабайтов запихнуть - встроенное хранилище все сожрет.

    Чтобы потом извлечь сохраненные данные достаточно выполнить:
    result = await localforage.getItem('key');
    console.log('Данные успешно извлечены:');
    console.dir(result);

    Срок хранения данных - неограниченно. Или пока пользователь вручную не обнулит браузер.
    Ответ написан
    2 комментария
  • Почему не работает директива unsafe-inline в расширении для Google Chrome?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Спустя час поисков нашел ответ на свой вопрос:
    ...установка политики, которая включает «unsafe-inline», не будет иметь никакого эффекта.

    Начиная с Chrome 46, встроенные скрипты можно добавить в белый список, указав в политике хэш исходного кода в кодировке base64. Этот хэш должен иметь префикс используемого алгоритма хеширования (sha256, sha384 или sha512).

    Другими словами на страницах расширения в принципе нельзя никак применить политику unsafe-inline.
    Всегда будет выдавать ошибку:
    'content_security_policy': Ignored insecure CSP value "'unsafe-inline'" in directive 'script-src'.
    Ответ написан
    Комментировать
  • Как изменить свойство isTrusted у события на true?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    К сожалению, я тоже не нашел прямого способа поменять у события свойство isTrusted на true, но есть обходные пути, которые позволяют добиться похожего результата. Дело в том, что используя возможности API расширений мы можем отредактировать скрипты-обработчики целевого сайта так, чтобы там больше не было проверки свойства isTrusted или чтобы эта проверка всегда возвращала положительный результат. Это как бы и есть решение.
    Ответ написан
  • Как взять последний td у каждого tr?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Можно удалить конечно, а можно просто скрыть, сделать невидимым через CSS:
    table tr td:nth-last-child(1) {
        display: none;
    }

    Первый с конца td внутри всех tr будет скрыт.
    Ответ написан
    Комментировать
  • Как грамотно пропарсить скопированные колонки с google sheets?

    zkrvndm
    @zkrvndm
    Архитектор решений
    У меня однажды возникла задача, спарсить данные с Google таблицы не используя их API.

    В итоге, вот какое решение я придумал:
    googleTableParse('https://docs.google.com/spreadsheets/d/<код документа>/edit');
    
    // Функция для парсинга Google таблицы:
    
    async function googleTableParse(link) {
    	
    	var url = link.replace(/edit$/g, 'export?format=zip');
    	var response = await fetch(url);
    	var zip = await response.blob();
    	var archive = await new JSZip().loadAsync(zip);
    	var files = Object.keys(archive.files);
    	var lists = Object.create(null);
    	for (var n = 0; n < files.length; n++) {
    		if (!files[n].includes('/') && files[n].includes('.html')) {
    			var blob = await archive.files[files[n]].async('blob');
    			var html = await blob.text();
    			var name = files[n].replace(/\.html$/g, '');
    			lists[name] = tableParser(html);
    		}
    	}
    	
    	console.log('Таблица и все листы в нём успешно спарсены:');
    	console.dir(lists);
    	
    }
    
    // Функция для парсинга html-кода таблицы из скачанного архива:
    
    function tableParser(html) {
    	
    	var doc = new DOMParser().parseFromString(html, "text/html");
    	
    	var th = doc.querySelector('table > tbody > tr').querySelectorAll('th, td');
    
    	var title = [];
    
    	for (var i = 0; i < th.length; i++) {
    
    		title.push(th[i].innerText);
    
    	}
    	
    	var tr = doc.querySelectorAll('table > tbody > tr');
    	
    	var array = [];
    	
    	for (var i = 1; i < tr.length; i++) {
    
    		var td = tr[i].querySelectorAll('th, td');
    		
    		var obj = {};
    		var add = 0;
    		
    		for (var y = 1; y < td.length; y++) {
    			
    			td[y].innerHTML = td[y].innerHTML.replace(/\<br\>/g, '{перенос строки}');
    			obj[title[y]] = td[y].innerText.replace(/\{перенос строки\}/g, "\n").trim();
    			if (obj[title[y]] !== '') {
    				add = 1;
    			}
    			
    		}
    		
    		if (add) {
    			array.push(obj);
    		}
    
    	}
    	
    	return array;
    	
    }


    Для работы функции должно выполнятся 2 условия:
    1. Должна быть подключена библиотека JSZip, которая позволяет работать с zip-архивами на JavsScript
    2. Каким-то образом вы должны добавить разрешающий заголовок Access-Control-Allow-Origin на все запросы к серверам Google. Лично я это сделал, через использование расширения и файла background.js но это не единственный вариант. Можно для выполнения кода использовать NodeJS или как-то проксировать процесс закачки файла.
    Ответ написан
    Комментировать