• Как и на чем сделать пошаговую инструкцию на сайте?

    victormayorov
    @victormayorov
    Frontend разработчик
    один из первых результатов из гугла - https://driverjs.com/
    Ответ написан
    Комментировать
  • Как правильно реализовать смену на тёмную тему?

    @arturka_v_10
    сделайте чтение из куки до создания этого мета тега и если кука есть, проверьте ее на php далее ее значение подставляйте в тег. Будет вам счастье. Кривой пример на подумать:

    <?
    $cookieColor = isset($_COOKIE['theme']) ? intval($_COOKIE['theme']) : 0; // ожидает передачи в куку theme - числа
    $colorTheme = $cookieColor < 1 ? '#000' : '#fff';
    ?>
    <meta name="theme-color" content="<?=$colorTheme?>" />
    Ответ написан
  • Как правильно перехватывать события ухода пользователя со страницы?

    @cryptodust
    Ответ на первый вопрос:
    window.addEventListener('beforeunload', function(event) {
        event.preventDefault();  // для того чтобы браузер показал пользователю сообщение
    });


    Насчет второго вопросов думаю много вариантов(создать div который будет отображаться по событию например).
    Ответ написан
    Комментировать
  • Можно ли назвать NVME протоколом передачи данных, если да, то почему?

    pindschik
    @pindschik
    ФЫВА ОЛДЖ
    NVMe как раз и используется для передачи данных. При работе с SSD. Или вы про какую-то другую передачу данных, которая тоже передача данных, но другая и других?
    А можно передавать данные - потому что по сути дела это просто подключение к линиям PCIe, которые ведут либо в процессор, либо в дополнительный контроллер.
    Ответ написан
    Комментировать
  • Можно ли назвать NVME протоколом передачи данных, если да, то почему?

    @rPman
    NVM_Express - это спецификация, т.е. описание и стандарт, включающий в себя не только описание разъема, условий использования но и протокола в том числе.

    Это как говорить что автомобиль это двигатель... или дом - это стены и крыша... оркестр - это дирижер... (chatgpt отличные аналогии приводит)
    Ответ написан
    1 комментарий
  • Как добавить класс при клике на элемент на чистом JS?

    @forgetable
    Node/Flutter/C++
    Современный способ по добавлению и удалению классов - classList API.
    document.getElementById('intro_btn').onclick = function() {
      document.getElementById('main').classList.add('main--main-bg');
    }

    Соответственно, на чистом js каждой кнопке даёте id, и присваиваете нужный класс. Если нужно убрать, то classList.remove('название_класса'), если включить/выключить - то toggle()
    Ответ написан
    2 комментария
  • Какую ошибку допустил в данном случае?

    @SergeiB
    addEventListener.oninput

    wtf?

    inputus[i].addEventListener('input', function() {
      this.value = cc_format(this.value);
    });
    Ответ написан
    Комментировать
  • Какую ошибку допустил в данном случае?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    А где объявление i? Попробуйте так:
    for (let i = 0, len = match.length; i < len; i += 4) {
      parts.push(match.substring(i, i + 4));
    }

    Очень интересная конструкция addEventListener.oninput = function(). Попробуйте так:
    inputus[i].addEventListener('input', () => {
      this.value = cc_format(this.value);
    });

    UPD: не ожидал обнаружить this, соответственно использовал стрелочную функцию по дефолту (а у нее нет собственного this). Вариант с this:
    for (let i = 0; i < inputus.length; i++) {
      inputus[i].addEventListener('input', function() {
      this.value = cc_format(this.value);
    });
    Ответ написан
    4 комментария
  • Смена стиля по клику?

    @skuvaWeb
    Дело в том, что метод document.querySelector('.className') возвращает один Node элемент,
    а document.querySelectorAll('.className') возвращает коллекцию Node элементов, которые нужно перебрать в цикле, чтобы на каждый повесить обработчик
    Ответ написан
    1 комментарий
  • Что будет, если убрать из URL уникальный id у новости в CMS?

    Sanes
    @Sanes
    ID поставляют, чтобы не заморачиваться с уникальностью. Поиск ресурса только по ID плюс любой SEF URL гарантировано наплодит дубли, если будут изменяться SEF URL.
    Ответ написан
    Комментировать
  • Как распаковать архив в обход папки TEMP в Windows?

    @galaxy
    Вы не поверите, но кнопочка Extract именно это и делает:
    610be2156cdd3870316082.png
    Распаковка же через drag-n-drop всегда будет через временную папку, почему - см выше по ссылке на Stackoverflow
    Ответ написан
    3 комментария
  • Можно ли на чистом CSS показывать tooltip, только если текст не умещается в блоке?

    scoffs
    @scoffs
    Fullstack | C# | Student
    На чистом CSS нет, тут можно сделать с помощью JS

    const block = document.getElementById('your-block-id'); // Замените 'your-block-id' на актуальный идентификатор вашего блока
    
    if (block.scrollWidth > block.offsetWidth) {
      // Текст обрезается и появляется троеточие
      // В этом случае вы можете добавить обработчик события наведения мыши, чтобы показать тултип
      block.addEventListener('mouseenter', showTooltip);
      block.addEventListener('mouseleave', hideTooltip);
    } else {
      // Текст полностью умещается в блоке
      // В этом случае вы можете удалить обработчики событий или не отображать тултип вообще
      block.removeEventListener('mouseenter', showTooltip);
      block.removeEventListener('mouseleave', hideTooltip);
    }
    
    function showTooltip() {
      // Код для показа тултипа
    }
    
    function hideTooltip() {
      // Код для скрытия тултипа
    }
    Ответ написан
    Комментировать
  • Почему mediaRecorder работает некорректно?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Хочу ещё другой код предложить:
    <center>
    <button id="startButton"> запись </button>
    <button id="stopButton"> стоп </button><br /><br />
    <video id="preview" width="320" height="240" style="border-style: solid" autoplay muted></video>
    <video id="recording" width="320" height="240" controls hidden></video><br /><br />
    <a id="downloadButton" hidden>скачать</a>
    </center>
    <script>
    function startRecording(stream, lengthInMS) {
    	let recorder = new MediaRecorder(stream);
    	let data = [];
    	recorder.ondataavailable = event => data.push(event.data);
    	recorder.start();
    	let stopped = new Promise((resolve, reject) => {
    		recorder.onstop = resolve;
    		recorder.onerror = event => reject(event.name);
    	});
    	return Promise.all([stopped, new Promise(resolve => setTimeout(resolve, lengthInMS)).then(() => recorder.state == "съёмка" && recorder.stop())]).then(() => data);
    }
    startButton.addEventListener("click", function() {
    	navigator.mediaDevices.getUserMedia({
    		video: true,
    		audio: true
    	}).then(stream => {
    		preview.srcObject = stream;
    		preview.captureStream = preview.captureStream;
    		return new Promise(resolve => preview.onplaying = resolve);
    	}).then(() => startRecording(preview.captureStream(), 5000)).then (recordedChunks => {
    		recording.hidden = false;
    		preview.hidden = true;
    		recording.src = downloadButton.href = URL.createObjectURL(new Blob(recordedChunks, { type: "video/webm" }));
    		recording.play();
    		downloadButton.hidden = false;
    		downloadButton.download = "RecordedVideo.webm";
    	});
    }, false);
    stopButton.addEventListener("click", function() {preview.srcObject.getTracks().forEach(track => track.stop())}, false);
    recording.onended = () => recording.currentTime = 0;
    </script>

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

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Это реализация скрытия значка звук и меню из трёх точек для Хрома и Оперы с наложением:
    <style>
    .contayner{
    	position: absolute;
    }
    audio{
    	position: absolute;
    	width: 400px;
    }
    #zaslonka{
    	position: absolute;
    	width: 60px;
    	height: 32px;
    	top: 11px;
    	background: rgb(241, 243, 244);
    }
    </style>
    <center>
    <div class=contayner>
    	<audio id=audio src='http://tolmatux.strana.de/audio/sol.mp3' controls></audio>
    	<div id=zaslonka></div>
    </div>
    <script>
    zaslonka.style.left = parseInt(window.getComputedStyle(audio).width) - 73 + 'px';
    </script>

    Но с помощью консоли всё равно можно это обойти и скачать.
    Ответ написан
    Комментировать
  • Как получить график громкости аудио без его воспроизведения?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Декодирование аудиоданных из аудиофайла с помощью WebAudio Api можно действительно делать без воспроизведения этого файла. А это значит, что это может происходить по ходу загрузки страницы, и клики при этом не нужны.
    <html>
    <head>
    <meta charset="utf-8">
    <title>Визуализатор</title>
    <style>
    #canvas{
        position: absolute;
        top: 50px;
        left: 0px;
        background: #333;
    }
    #progress{
        position: absolute;
        top: 50px;
        left: 0px;
        background: rgba(255, 155, 0, 0.5);
        width: 0px;
        height: 256px;
    }
    </style>
    </head>
    <body bgcolor=#444>
    <audio id=audio src="sound.mp3" controls></audio>
    <canvas id=canvas width=512 height=256></canvas>
    <div id=progress></div>
    <script>
    var audio = document.getElementById("audio");
    var ctx = canvas.getContext("2d");
    var color_L = "#7cf", color_R = "#f7c"; // Цвета осциллограмм левого и правого стереоканалов
    var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
    audio.onplay = function(){b = setInterval(function(){progress.style.width = Math.floor(audio.currentTime / audio.duration * canvas.width) + "px"}, 100)};
    audio.onended = function(){ 
        this.currentTime = 0;
        clearInterval(b);
        progress.style.width = "0px";
    }
    var source = audioCtx.createBufferSource();
    var request = new XMLHttpRequest();
    request.open('GET', audio.src, true);
    request.responseType = 'arraybuffer';
    request.onload = function(){
        var audioData = request.response;
        audioCtx.decodeAudioData(audioData, function(buffer){
            source.buffer = buffer;
            data_L = buffer.getChannelData(0);
            data_R = buffer.getChannelData(1); // Если аудиофайл моно - поменяйте в этой сроке единицу на ноль.
             // При несоответствии количества стереоканалов - ошибка в консоли и код не работает.
            for(var i = 0; i < data_L.length; i++){
                var x = Math.floor(i / data_L.length * canvas.width);
                var L = data_L[i] * canvas.height / 4;
                var R = data_R[i] * canvas.height / 4;
                if(Math.floor(i / 16) == i / 16){ // Число 16 для больших аудиофайлов лучше побольше. Нужно подбирать.
                    ctx.fillStyle = color_L;
                    ctx.fillRect(x, canvas.height * 0.25 + L, 1, -L);
                    ctx.fillStyle = color_R;
                    ctx.fillRect(x, canvas.height * 0.75 + R, 1, -R);
                }
            }
        },
        function(e){"Error with decoding audio data" + e.err});
    }
    request.send();
    canvas.onmousedown = progress.onmousedown = function(e){
        progress.style.width = e.pageX + "px";
        audio.currentTime = e.pageX / canvas.width * audio.duration;
    }
    canvas.ondblclick = function(){audio.play()};
    ctx.fillStyle = color_L;
    ctx.fillRect(0, canvas.height * 0.25, canvas.width, 1);
    ctx.fillStyle = color_R;
    ctx.fillRect(0, canvas.height * 0.75, canvas.width, 1);
    </script>
    </body>
    </html>
    62bb7dc72e0ba998610708.jpeg
    Ответ написан
    Комментировать
  • Как написать логику sms инпут на javascript?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    <style>
    td{
    	width: 50px;
    	height: 25px;
    	text-align: center;
    	font-size: 20px;
    }
    hr{
    	width: 70%;
    	display: none;
    }
    </style>
    <table cellspacing=0>
    	<tr id=numbers></tr>
    	<tr id=cursors></tr>
    </table>
    <script>
    let index = 0;
    let code = '';
    let input = false;
    for(i = 0; i < 4; i ++){
    	let number = document.createElement('td');
    	number.id = 'i' + i;
    	numbers.append(number);
    	let forcursor = document.createElement('td');
    	cursors.append(forcursor);
    	let cursor = document.createElement('hr');
    	cursor.id = 'c' + i;
    	forcursor.append(cursor);
    }
    const putSMSCode = _ => {
    	input = true;
    	document.getElementById('c' + index).style.display = 'block';
    }
    putSMSCode();
    document.onkeydown = e => {
    	if(input){
    		if(index < 3){
    			document.getElementById('c' + (index + 1)).style.display = 'block';
    		}
    		document.getElementById('c' + index).style.display = 'none';
    		code += e.key;
    		document.getElementById('i' + index).innerHTML = '<b>' + e.key + '</b>';
    		index ++;
    		if (index >= 4) {
    			index = 0;
    			input = false;
    			console.log(code);
    		}
    	}
    }
    </script>
    Ответ написан
    Комментировать
  • Можно ли сделать так, чтобы ссылка срабатывала на событие mousedown, а не onclick?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    <a href="http://www.site.com" onmousedown='this.click()'>Ссылка</a>
    Ответ написан
    Комментировать
  • Как воспроизвести зацикленный звук в неактивной вкладке?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Если используете элемент аудио, то для циклического воспроизведения больше всего подходит атрибут loop внутри тега:
    <audio src='sound.mp3' controls loop></audio>
    Работает железно во всех браузерах и случаях. А вот requestAnimationFrame() не рекимендую применять, так как в случае, если попытка воспроизвести вызывает ошибку, (на пример, по ходу загрузки страницы) то эта ошибка будет одна и та же появляться в консоли с офигенной частотой, страница может повиснуть.
    Ответ написан
    5 комментариев
  • Как каждую кнопку сделать уникальной?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    <style>
    .btn__play{
    	width: 70px;
    	cursor: pointer;
    	border-radius: 10px;
    }
    </style>
    track1: <button class=btn__play> Play </button><br /><br />
    track2: <button class=btn__play> Play </button><br /><br />
    track3: <button class=btn__play> Play </button>
    <audio class=aud src='https://mysynthesizer.github.io/index.hetemeel/track1.mp3'></audio>
    <audio class=aud src='https://mysynthesizer.github.io/index.hetemeel/track2.mp3'></audio>
    <audio class=aud src='https://mysynthesizer.github.io/index.hetemeel/track3.mp3'></audio>
    <script>
    var btn = document.querySelectorAll('.btn__play');
    var aud = document.querySelectorAll('.aud');
    
    function playPause(index) {
        btn[index].addEventListener('click', () => {
            if(btn[index].textContent === 'Pause') {
                btn[index].textContent = 'Play';
                aud[index].pause();
            } else {
                btn[index].textContent = 'Pause';
                aud[index].play();
            }
        });
    }
    
    for(i = 0; i < btn.length; i ++){
    	playPause(i);
    	aud[i].onended =_=> btn[i].textContent = 'Play';
    }
    </script>

    Правда, не знаю, как это сделать на jquery.
    Ответ написан
    Комментировать
  • Как сделать вывод значения ползунка в поле input?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Начальное значение:
    <input id=r1 type=range value=20 oninput='n1.value = this.value' />
    <input id=n1 type=number value=20 oninput='r1.value = this.value' /><br /><br />
    
    Конечное значение:
    <input id=r2 type=range value=80 oninput='n2.value = this.value' />
    <input id=n2 type=number value=80 oninput='r2.value = this.value' />
    Ответ написан
    Комментировать