• Как все таки лучше хранить картинки для сайта?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    нет оптимальных способов, и каждый делает как ему надо. Мне, например, нравится хранить оригинал приемлемого размера за корнем сервера, а выдавать скриптом нужный формат. При этом crop и параметры фильтров картинки хранить в БД. При таком варианте легко снабжать картинки дополнительными штуками типа "водяных знаков", логотипов, EXIF и т.п.

    ЧПУ картинки наврядли как-то влияет на SEO (если, конечно имя файла не латинскими буквами, и содержит всякие знаки препинания - это может скверно сказаться), а вот её оформление в документе очень влияет. Обязательно для картинки, любой (!!!) - атрибут alt, очень полезно title. А если картинка в элементе бэкграундом, то title у элемента просто таки необходим.
    Ответ написан
  • Как получить полное имя класса по его началу?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Приделайте к classList функцию поиска. Например:
    DOMTokenList.prototype['find'] = function (tokenPart) {
            return [].map.call(this, function (_token) {
                if (_token.search(tokenPart) >= 0) {
                    return _token;
                }
                return null;
            })[0];
        };


    Соответственно, использование:
    document.body.classList.find('abc'); // Вернёт null
    document.body.classList.find('fontsize'); // Вернёт fontsize100
    document.body.classList.find('font'); // Вернёт fontsize100
    document.body.classList.find('size'); // Вернёт fontsize100
    Ответ написан
    Комментировать
  • Хранение информации в js переменных?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Где угодно можно хранить. Можно прям объект со всем функционалом сделать, и непосредственно создать его как property HTMLElement'а. Можно совсем уж сделать класс в прототипе, и работать с ним.

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

    Будет храниться пока не прибъёшь её, или пока не будет уничтожен документ.
    Убивается переменная довольно просто:
    var anyVar = 678594;
    anyVar = null;
    Ответ написан
    Комментировать
  • В каких случаях лучше создать клон объекта вместо работы с оригиналом?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Во всех случаях, когда требуется не изменять оригинал.
    Ответ написан
    Комментировать
  • Как решить задачу, Javascript?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Ну или так:
    document.addEventListener('DOMContentLoaded', function(){
            let arr = ['foo', 'bar', 'baz'];
            
            /* Native JS */
            let containerJS = document.createElement('div');
            [].map.call(arr, function(_el){
                let _p = document.createElement('p');
                _p.innerHTML = _el;
                containerJS.appendChild(_p);
            });
            document.body.appendChild(containerJS);
            
            /* jQuery */
            let containerJQ = $('<div></div>').appendTo($('body'));
            $.each(arr, function(_idx, _el){
                $('<p></p>').html(_el).appendTo(containerJQ);
            });
        });
    Ответ написан
    Комментировать
  • Как сделать сортировку блоков div по тексту внутри?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    В JavaScript есть в прототипе массива традиционная для всех функция sort().
    Для примера сделаем такую табличку:
    <a href="javascript:" data-sort="alphabet">sort by alpabet</a>
    <a href="javascript:" data-sort="amount">sort by amount</a>
    
    <div id="lst">
        <div><span>jsghgori</span><span>345</span></div>
        <div><span>ouerok</span><span>98</span></div>
        <div><span>qiewhfh</span><span>548</span></div>
        <div><span>nvxcmk</span><span>234</span></div>
        <div><span>kefoo</span><span>38</span></div>
    </div>


    Теперь напичкаем её функционалом для сортировки и рисования:
    <script>
        var lst = document.getElementById('lst');
        Object.defineProperties(lst, {
            _direct: {
                /**
                 *  Направление сортировки
                 *  0 - a->z
                 *  1 - z->a
                 */
                value: 0,
                writable: true
            },
    
            direct: {
                get: function () {
                    return this._direct;
                },
                set: function (val) {
                    this._direct = Math.abs(this._direct - 1);
                },
                enumerable: true,
                configurable: true
            },
            _dataArr: {
                /* Массив с данными */
                value: [],
                writable: true,
            },
            data: {
                /* Получить массив с данными */
                get: function () {
                    let _that = this;
                    if (!this._dataArr.length) {
                        /* Если массив пуст, получим данные */
                        [].map.call(this.children, function (_row) {
                            let _dataRow = {
                                title: _row.children[0].innerHTML,
                                amount: parseInt(_row.children[1].innerHTML),
                                element: _row
                            }
                            _that._dataArr.push(_dataRow);
                        });
                    }
                    /* В любом случае возвертаем массив */
                    return this._dataArr;
                }
            },
            sortByAlphabet: {
                value: function () {
                    let _that = this;
                    this.data.sort(function (a, b) {
                        if (_that.direct) {
                            return a.title > b.title ? 1 : -1;
                        } else {
                            return a.title > b.title ? -1 : 1;
                        }
                    });
    
                    this.direct = true;
                    this.drawRows();
                },
                writable: false
            },
            sortByAmount: {
                value: function () {
                    let _that = this;
                    this.data.sort(function (a, b) {
                        if (_that.direct) {
                            return a.amount > b.amount ? 1 : -1;
                        } else {
                            return a.amount > b.amount ? -1 : 1;
                        }
                    });
                    this.direct = true;
                    this.drawRows();
                },
                writable: false
            },
            drawRows: {
                value: function () {
                    for (let i = 0; i < this.data.length; i++) {
                        this.appendChild(this.removeChild(this.data[i].element));
                    }
                },
                writable: false
            }
        });
        document.addEventListener('click', function (ev) {
            if (ev.target.hasAttribute('data-sort')) {
                switch (ev.target.getAttribute('data-sort')) {
                    case 'alphabet':
                        lst.sortByAlphabet();
                        break;
                    case 'amount':
                        lst.sortByAmount();
                        break;
                }
            }
        });
    </script>


    Весь цимес в lst.sortByAlphabet() и lst.sortByAmount(). То есть, sort() внутри себя перебирает все элементы массива со своим соседом, передавая их в аргументах, чем мы и пользуемся для сравнения их. Что сравнивать, решаем сами.
    Ответ написан
    1 комментарий
  • Как отследить js события в браузере?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Не совсем понял вопрос.
    Но маленький лайфхак по мотивам "2.2 Либо не могу правильно ввести название dom элемента, встречал и такое написание getEventListeners($(#element)) и такое getEventListeners(#element) как нужно то? Нужно класс элемента вставлять или id или как?"
    Во всех консолях, если в DOM-панели элемент выделить, его можно использовать как $0. 5c77b07c0b62e504495454.png
    Ответ написан
    1 комментарий
  • Как запустить gii на yii2 advanced именно во фронтеде?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Посмотри в @frontend/config в файлах main.php и main-local.php настройки gii. Возможно там что-то отключено, или запрещено. Что-то типа такого должно быть:
    if (!YII_ENV_TEST) {
        $config['bootstrap'][]      = 'gii';
        $config['modules']['gii']   = [
            'class' => 'yii\gii\Module',
        ];
    }
    Ответ написан
    Комментировать
  • Как повесить обработчик доступа get на массив?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    document.prototype['getElementsByMyMethod'] = function(params){
        … <тут своя функция, возвращающая то что надо> …
    };
    
    var arr = document.getElementsByMyMethod(params);
    Ответ написан
  • Что использовать для подсчета слов в больших текстах?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Что угодно подходит. Строка (текст) - это массив символов. Пили его, руби как хочешь, и считай.
    Ответ написан
    2 комментария
  • Как составить mysql-запрос?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Как-то так.
    SELECT u.* FROM users
    LEFT JOIN purchases pur ON pur.user_id = u.id
    LEFT JOIN products p ON p.id = pr.product_id
    WHERE p.id IN (1,2,3)
    Ответ написан
    Комментировать
  • Время ответа сервера с file_get_contents?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Создаётся объект стрим-контекста из массива-опций, и третьим параметром в туда встрамляется.
    $opts = array('http' =>
        array(
            'method'  => 'GET',
            'timeout' => 120 
        )
    );
    
    $context  = stream_context_create($opts);
    
    $result = file_get_contents('http://example.com/get.php', false, $context);


    Ускорить не ускорит, но позволит дождаться ответа или не ответа.
    Ответ написан
  • Чем разбирать сложный XML на php?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Ответ написан
    Комментировать
  • Как менять class при нажатие на onclick?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    function filterRecords(id) {	
        $('ul.services-tab li a').removeClass('active');
        $(this).toggleClass('active');
    };
    Ответ написан
  • Что не так с областью видимости переменной?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Еще лучше function($reader) use (&$data) {…}
    Ответ написан
    1 комментарий
  • Как отобразить ошибку из Javascript в html?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Ошибки JavaScript нужно выводить в консоль. Обычно их обрабатывают, иногда даже заключают в try{…}catch(err){concole.error(err);}

    А то что в сабже - это информативные сообщения.
    Ответ написан
    Комментировать
  • Как сделать join?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Чтобы получать названия контрагентов, нужно поле названия указать в select'е, join тут непричём. А если это происходит через модель, то нужно в модели проектов соответствующее поле сделать, и указать его в rules.
    Ответ написан
  • Перевод данных tinyInt в одно поле text (json)?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Если это були, то лучше в виде Integer хранить и битовыми операциями пользоваться для их использования.
    Ответ написан
    Комментировать
  • Как получить параметр из строки?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Например так:
    let a = '/reviews/?PAGEN_1=2'.match(/\?(.*)=(.*)$/u);
    // a[2] - искомое значение
    Ответ написан
    Комментировать
  • Что нужно сделать, чтобы срабатывали функции и плагины jquery для динамически добавленных элементов?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Это инициализация плагина для элементов с селектором .open-popup-ajax. Стало быть, нужно либо в $.ajax.done() инициализировать плагин на вновь создаваемых элементах, либо попробовать делегировать документу. Но и тогда придётся толкать документ на инициализацию.

    Короче, после добавления элемента, делай то же самое:

    $($(<что-то там>).append(<чтототам>)).magnificPopup({
        type:'ajax',
        midClick: true,
        mainClass: 'my-mfp-zoom-in',
        overflowY: 'scroll',
        tLoading: 'Загрузка...',
      });
    Ответ написан