• Как сделать счетчик через ООП?

    And__Smi
    @And__Smi Автор вопроса
    Благодаря одному пользователю данного сайта, который удалил свой ответ, видимо (не знаю зачем, а потом еще говорят, гугли, когда люди чистят за собой), я привел свой код к такому решению и это еще не окончательное, в планах создать еще два метода - для counter_time и для layout.innerHTML. Пока не соображу как, вот решение, которое меня устроило, но не до конца, о чем я упомянул выше:
    ;
    var counterList = document.querySelectorAll(".counter");
    function myCounter(counterEl){
        this.counter = counterEl;
        this.init = function(){
            var counter_event;
            var counter_theme;
            var counter_date;
            var counter_link;
    
            if(this.counter.hasAttribute("data-event")){
                counter_event = this.counter.getAttribute("data-event").replace(/\s/g, '');
            }
            if(this.counter.hasAttribute("data-theme")){
                counter_theme = this.counter.getAttribute("data-theme").replace(/\s/g, '');
            }
            else if(this.counter.hasAttribute("data-background")){
                counter_theme = this.counter.getAttribute("data-background").replace(/\s/g, '');
            }
            if(this.counter.hasAttribute("data-date")){
                counter_date = this.counter.getAttribute("data-date").replace(/\s/g, '');
            }
            else if(this.counter.hasAttribute("data-day")){
                counter_date = this.counter.getAttribute("data-day").replace(/\s/g, '');
            }
            if(this.counter.hasAttribute("data-link")){
                counter_link = this.counter.getAttribute("data-link").replace(/\s/g, '');
            }
    
            var counterChild = this.makeCounter(counter_event, counter_theme, counter_date, counter_link);
            this.counter.appendChild(counterChild);
        };
        this.makeCounter = function(theme, event, day, link){
            var block = document.createElement("div");
            var styles = document.createElement("link");
    
            if(styles){
                styles.href="j/css/counter"+ "/" + theme + "/" + event + ".css";
                styles.rel = "stylesheet";
    
                document.querySelectorAll("head")[0].appendChild(styles);
            }
    
            if(block){
                block.className = theme + "-" + event + " template";
    
                var timerIf = new Date(day.replace(/(\d+).(\d+).(\d+)/, '$3/$2/$1')) - new Date();
                if(timerIf <= 0){
                    block.className += " zero";
                }
                else{
                    var wrap = document.createElement("div");
                    if(wrap){
                        wrap.className = "counter-wrap";
    
                        block.appendChild(wrap);
                    }
                }
    
                if(link){
                    var linker = document.createElement("a");
                    if(linker){
                        linker.className = "counter-link";
                        linker.href=link;
                        linker.target="_blank";
    
                        block.appendChild(linker);
                    }
                }
    
                var resetCount = {
                    obj: null
                };
    
                var timer = setInterval(this.makeCount.bind(this, wrap, day, resetCount), 1000);
    
                resetCount.obj = timer;
            }
    
            return block;
        };
        this.makeCount = function(layout, timecount, reset){
            var now = new Date();
            var eventDate = new Date(timecount.replace(/(\d+).(\d+).(\d+)/, '$3/$2/$1'));
            var distance = eventDate - now;
    
            var counterTime = {
                days: Math.floor(distance / (1000 * 60 * 60 * 24)),
                hours: Math.floor(distance % (1000 * 60 * 60 * 24) / (1000 * 60 * 60)),
                mins: Math.floor(distance % (1000 * 60 * 60) / (1000 * 60)),
                secs: Math.floor(distance % (1000 * 60) / 1000)
            };
    
            for(var i in counterTime){
                if(counterTime[i] < 10){
                    counterTime[i] = "0" + counterTime[i];
                }
            }
    
            if(distance <= 0){
                if(reset.obj !== null){
                    clearInterval(reset.obj);
                }
            }
            else{
                layout.innerHTML = '<div id="days" class="inline">'+counterTime.days+'<span>:</span></div>';
                layout.innerHTML += '<div id="hours" class="inline">'+counterTime.hours+'<span>:</span></div>';
                layout.innerHTML += '<div id="mins" class="inline">'+counterTime.mins+'<span>:</span></div>';
                layout.innerHTML += '<div id="secs" class="inline">'+counterTime.secs+'</div>';
            }
        };
    }
    
    for(var c = 0; c<counterList.length; c++){
        var counter = new myCounter(counterList[c]);
        counter.init();
    }


    Если есть у кого что сказать по коду, как можно было бы оформить еще лучше, я не против послушать и пообщаться на данную тематику. Сразу оговорюсь заранее (я до этого не сказал), код пишется исключительно под ие8+ и никак иначе. Все новомодные штучки, к сожалению, приходится избегать, включая const, let, class.
    Ответ написан
  • Почему все последующие картинки при повороте наводящегося блока теряют окружность?

    And__Smi
    @And__Smi Автор вопроса
    Проблема решена:

    такое происходило, потому что у картинок было position-absolute.

    Убрав его, я конечно проблему не решил, поэтому перешел к ссылке, она была далеко внизу и потому пришлось ей добавить два класса:
    position-absolute top-0.

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

    Теперь всё супер, анимация работает, окружность не теряется, всем спасибо.
    Ответ написан
    Комментировать
  • Как создать макрос для PUG правильней?

    And__Smi
    @And__Smi Автор вопроса
    --pretty $FilePath$ --out $FileParentDir(src)$/public/$FileDirName$/

    Придумал такой макрос для пага, НО все файлы, хранящиеся именно в папке src переносятся в public как:
    -public
    --src
    ---index.html

    Есть у кого мысли по этому поводу, как сделать, чтобы он игнорировал эту папку и положил именно в public, то есть:
    -public
    --index.html?

    Для новостей такой макрос работает корректно
    Ответ написан
    Комментировать
  • Почему не работает \n?

    And__Smi
    @And__Smi Автор вопроса
    Решил проблему, всем спасибо. Тупо админка глючная у движка, решил путем подмены файла через фтп - написал так же как и надо было до этого alert("hello \n world") и заменил на сервере этот файл. Как итог - ничего не добавилось лишнего и перенос осуществился благополучно. Всем спасибо.
    Ответ написан
    Комментировать
  • Как с помощью javascript определить устройство, с которого зашли на сайт?

    And__Smi
    @And__Smi Автор вопроса
    всем спасибо за полезные советы, нашел вот простой, не громоздкий, самое главное(!), скрипт:
    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
        // код для мобильных устройств
      } else {
        // код для обычных устройств
    }
    Ответ написан
    1 комментарий
  • Как отследить email пользователя моего сайта?

    А вы куда-нибудь вводили свою почту? Потому как если вы вводили свою почту в какую-либо форму то можно спокойно отправить вам письмо. Без ввода почты куда-либо вам не смогут ничего прислать так как почту не знают. При регистрации может писали почту, при подписке(если такова была) в любом случае вы писали эту почту в какое-то поле а там как раз и стоит скрипт на отсылание писем вам на почту(либо успешно зарегистрировались либо новости либо еще что)
    Ответ написан
  • Как лучше изменять php-файлы на рабочем проекте?

    Я не думаю что это как-то возможно. Конечно, у меня есть предположения:
    1. Надо отключить доступ к этому файлу, то есть чтобы обычный пользователь не мог зайти на него, только те, кто пишет скрипты(как вариант: убрать ссылки везде на него, а можно и вовсе подгружать другой документ типа 404 ошибки - такой страницы не существует или же 503 ошибки - страница находится в разработке).
    2. Этот способ уже более актуальный - создать на хостинге тестовый домен и именно на этом тестовом домене проводить свои "эксперименты". Как итог получается - вы не трогаете основной сайт, пользователь фаталов ваших не видит но и сайт успешно обновляет файлы, которые вы закинете в случае успеха ваших экспериментов.

    НО: если вы просите чтобы именно на этом сайте было и чтобы именно на этой странице было, то тогда подсказать не могу. Так как в любом случае, если Вы ошибетесь где-то и выскочит фатал - вы будете знать в чем ошибка. А отключать это чтобы пользователь не видел и при этом чтобы он видел нормальную страницу - мне кажется невозможно. Ошибки на то и ошибки чтоб вы видели где вы допустили оплошность.
    Ответ написан