• Как в grid растянуть последние элементы?

    @neverenn
    Новичок
    Была похожая история. В блоке было по 2 элемента в строке. Если элементов нечётное количество, то нужно растянуть последний на всю ширину блока.
    Решил так:
    Если в цикле нечётное количество элементов, то добавить к последнему класс "full-row".

    стили для класса:
    grid-column: 1 / span 2;
    Ответ написан
    Комментировать
  • Как сделать автоматическое число колонок для элемента с заданной высотой?

    @historydev
    Острая аллергия на анимешников
    .wrapper{
      position: absolute;
      top: 0;
      left: 0;
      background: pink;
      font-size: 20px;
      display: flex;
      justify-content: flex-start;
      align-items: flex-start;
      flex-wrap: wrap;
      gap: 10px;
    }
    
    .item {
      width: 300px;
      height: 300px;
      border: 1px solid #333;
    }
    Ответ написан
    2 комментария
  • Как назначить ответственного при отправке формы в битрикс24?

    @den730
    Вот так:
    $query_data = [
        'fields'=>[
            'TITLE'=>'Заявка с сайта',
            'STATUS_ID'=> 'NEW',
            'ASSIGNED_BY_ID' = 14
        ],
        'params'=>['REGISTER_SONET_EVENT'=>'Y']
    ];
    Ответ написан
    4 комментария
  • Почему click срабатывает 2 раза?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Потому что клик по label вызывает клик по чекбоксу. Можно проверять, откуда пришёл клик, и игнорировать всё, что не от input'а. А лучше - вместо click обрабатывать change.
    Ответ написан
    Комментировать
  • Как отключить возможность touch swipe в swiper js на мобильных устройствах?

    @kairatych
    allowTouchMove: false,
    Ответ написан
    Комментировать
  • Как сделать поле для загрузки изображения wp в админке на странице настроек плагина?

    dimasmagadan
    @dimasmagadan
    $('#add-image').click(function(e) {
            e.preventDefault();
            var image = wp.media({ 
                title: 'Upload Image',
                multiple: false
            }).open()
            .on('select', function(e){
                var uploaded_image = image.state().get('selection').first();
                console.log(uploaded_image);
                var image_url = uploaded_image.toJSON().url;
            });
        });


    добавляем кнопку #add-image
    по клику получаем стандартное окно медиа библиотеки
    Ответ написан
    Комментировать
  • Как записывать данные в texarea из CKEditor 5 Balloon Block?

    @sequelone Автор вопроса
    Разобрался в проблеме. Не в ту секцию код пихал. Вот рабочий вариант:

    <script src="https://cdn.ckeditor.com/ckeditor5/21.0.0/balloon-block/ckeditor.js"></script>
    <script src="https://cdn.ckeditor.com/ckeditor5/21.0.0/balloon-block/translations/ru.js"></script>
    <script>
      const textarea = document.querySelector( '#editor' );
    	BalloonEditor.create( textarea , {
    	      language: 'ru',
            removePlugins: [ 'Table' ],
            toolbar: [ 'bold', 'italic', 'bulletedList', 'numberedList', 'blockQuote' ]
        })
    		.then( editor => {
    			window.editor = editor;
    			
    			editor.model.document.on( 'change:data', ( evt, data ) => {
                console.log( data );
                $('textarea#tickets-editor').html( editor.getData() );
            } );
    		} )
    		.catch( error => {
    			console.error( 'There was a problem initializing the editor.', error );
    		} );
    </script>


    Тоесть надо было в секцию .then( editor => {...} код добавить:

    .then( editor => {
    			window.editor = editor;
    			
    			editor.model.document.on( 'change:data', ( evt, data ) => {
                console.log( data );
                $('textarea#tickets-editor').html( editor.getData() );
            } );
    		} )
    Ответ написан
    Комментировать
  • Как в php сделать так чтобы по ссылке xml открывался php файл?

    @alexalexes
    Сделайте rewrite правило в конфиге nginx, чтобы при обращении к sitemap.xml вызывался php скрипт, который и обновит и выведет содержимое sitemap.xml. Только позаботьтесь о некой логики кеша, чтобы функция обновления файла запускалась не каждый раз, а по мере устаревания файла или его отсутствии.
    Ответ написан
    Комментировать
  • При попытке что-либо изменить в "1С Каталог - Предложения (остатки)" выходит ошибка. Что она значит?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Попробуйте выполнить эту проверку:
    5cee5e6490c2f963290771.png

    Такая ошибка обычно возникает когда не хватает прав на запись файлов.
    Ответ написан
    1 комментарий
  • Как получить график громкости аудио без его воспроизведения?

    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
    Ответ написан
    Комментировать
  • Как называется эта штука у товара в 1С битрикс?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Это id который генерируется для "Контекстного меню элементов списка"

    Например в шаблоне компонента news.list id заполняется примерно так:
    <?php foreach ($arResult["ITEMS"] as $arItem): ?>
        <?
        $this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT"));
        $this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));
        ?>
        <div id="<?= $this->GetEditAreaId($arItem['ID']); ?>">
        	
    
        </div>
    
    <?php endforeach; ?>


    Пример формирования данных EDIT_LINK и DELETE_LINK, которые используются в этом куске кода, можно найти в самом компоненте news.list (файл bitrix/components/bitrix/news.list/component.php)
    Ответ написан
  • Зачем нужен FormData?

    Seasle
    @Seasle Куратор тега JavaScript
    Всё читает, если есть у поля name. Посмотреть значения можно так:
    Object.fromEntries([...formData.entries()]);
    Отправлять надо именно FormData, если его используете.
    Ответ написан
  • Почему не применяются изменения в шаблоне OpenCart 3?

    @Margo1964
    18725d61509e446b8fe641f4a302cf2b.PNG
    Ответ написан
    Комментировать
  • Как скопировать прослушиватели событий с одно элемента на другой без jquery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    cloneNode() сработает только если слушатели прописаны прямо в атрибутах элемента <a onclick="alert('Habr')">click me</a>

    Слушатели, добавленные элементу через addEventListener() скопировать можно примерно никак.

    Так что лучше держать обработчик отдельно, и навешивать их на элементы по мере надобности:
    function myClickHandler(event) {
      // что-то сделать по поводу клика
    }
    
    element1.addEventListener('click', myClickHandler);
    element2.addEventListener('click', myClickHandler);
    element3.addEventListener('click', myClickHandler);

    Или же слушать события выше по дереву, на общем родителе:
    <div id="parent">
      <button>1</button>
      <button>2</button>
      <button>3</button>
    </div>
    и слушать клики на div#parent
    Ответ написан
    Комментировать
  • Как распаковать все файлы из qcow2?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    qcow2 -- это формат представления блочного устройства, на нём нет файлов, на нём может быть файловая система или разделы с файловыми системами. Можно превратить qcow2 в обычный raw образ командой qemu-img: qemu-img dd -O raw if=file.qcow2 of=file.raw.
    Получившийся сырой образ можно анализировать стандартными средствами. Если там одна файловая система, можно её просто примонтировать через loop: mkdir fs ; sudo mount file.raw fs. Если там таблица разделов, можно каким-нибудь kpartx создать устройства для каждого из разделов и примонтировать нужные:
    $ mkdir fs ; sudo kpartx -av file.raw 
    add map loop0p1 (254:4): 0 65536 linear 7:0 2048
    add map loop0p2 (254:5): 0 2029568 linear 7:0 67584
    $ sudo mount /dev/mapper/loop0p2 fs

    Естественно, если на разделах какой-нибудь LVM или LUKS прийдётся делать дополнительные телодвижения чтобы добраться до файлов.
    Ответ написан
    Комментировать
  • Можно ли сделать регулярное выражение для незакрытых скобок?

    @antares4045
    Рекурсии в нативном джаваскриптовом регэкспе нет. Соответственно вы конечно можете написать конструкцию с ограничением какой-то глубиной вложенности руками (хотя скорее сгенерить).
    Проблема не новая и строители велосипедов периодически выпускают свои версии регулярок (мне вот яндекс в ответ на запрос "js recursive regex" дал такую ссылку)
    Но судя по контексту вопроса вам не нативный регексп не подойдёт, так что в общем виде ваша задача не решаема.

    UPD.
    по поводу генерации руками:
    для глубины вложенности 3 у меня вышел вот такой франкенштейн:
    /^[^()]*(\([^()]*(\([^()]*(\([^()]*\))*[^()]*\))*[^()]*\))*(?<unclosed>\([^()]*(\([^()]*(\([^()]*\))*[^()]*\))*[^()]*)*[^()]*(\([^()]*(\([^()]*(\([^()]*\))*[^()]*\))*[^()]*\))*[^()]*$/

    -- если нашёл группу unclosed, то есть проблема
    (думаю, основная идея видна)

    UPD2:
    генератор выглядит примерно так, только сайт regex101 от моей рекгулярки на глубину 150 умер. так что, возможно, тупиковая идея.
    const anySymbols = `[^()]*`
    const closedRegexPattern = (depth) => {
        if(depth < 1)
            return anySymbols  
        return `\\((${anySymbols}${closedRegexPattern(depth-1)})*${anySymbols}\\)`
    }
    const unclosedCatcherRegexPattern = (depth) => {
        const unclosedPart = `(?<unclosed>\\((${anySymbols}${closedRegexPattern(depth-1)})*${anySymbols})*`
        return `^${anySymbols}${closedRegexPattern(depth)}${unclosedPart}${closedRegexPattern(depth)}${anySymbols}$`
    }
    
    console.log(unclosedCatcherRegexPattern(150))

    Кстати, в моей регулярке из UPD1 был косяк, из за которого вариант ((1)(2)) был валиден, а ((1)3(2)) уже нет.
    Ответ написан
    Комментировать
  • Почему не доступна html карта сайта opencart?

    ну может включен какой-то seo pro
    в настройках opencart посмотрите:
    а) вкладка СЕРВЕР https://yadi.sk/i/wt5zVhMytzOD4A
    б) рядом SEO PRO может быть https://yadi.sk/i/3YNHfuEY8Hhz_g
    и тогда может редиректить из дизайн - seo https://yadi.sk/i/5pbX5XjJMr-ewg

    если там всё выключено чпу, то еще в htaccess проверить, может там вручную редирект выставлен.
    после манипуляций нужно обновить кэш опенкарт и браузера.
    Ответ написан
    Комментировать
  • Почему не работает watch?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Наблюдатель не смотрит в глубину. Для этого нужно Прописать за каким конкретным свойством нужно наблюдать:
    watch('section.filter_values.param')

    Или установить дополнительный параметр deep: true. Тогда он будет рекурсивно отслеживать все свойства на любом уровне вложенности.

    Подробнее: https://vuejs.org/v2/api/#vm-watch
    Ответ написан
    Комментировать
  • Как масштабировать SVG без изменения толщины обводки?

    Fragster
    @Fragster Автор вопроса
    помогло? отметь решением!
    Оказывается есть специальный костыль для этого: https://developer.mozilla.org/en-US/docs/Web/SVG/A... .
    Более-менее работает: https://jsfiddle.net/8L6tuck5/2/ .
    Ответ написан
    Комментировать