Ответы пользователя по тегу JavaScript
  • Есть ли готовые либы для JS, PHP, C#, Java, ObjC/Swift для манипуляции с датой и временем, типа красиво писать "3 часа назад" и т.д.?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вы хотите одну библиотеку, в которой все языки? Так не бывает, библиотека связана с конкретным языком, но на некоторых языках есть порты. Языков несколько сотен (1, 2), вы хотите, чтобы автор эдакой убер-библиотеки сделал все языки?

    >Но может следует просто взять готовое?
    Конечно, готовое, если уже есть и если приличного качества.
    Stalker_RED показал библиотеки для js и php. Для c# есть https://github.com/Eonasdan/MomentSharp
    Ответ написан
    3 комментария
  • Какую выбрать тему диссертации?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Нужно выбрать научного руководителя, brainick прав. У вас на кафедре есть несколько руководителей, пройдитесь по ним и порасспрашивайте, чем они занимаются (или, вы уже и так знаете, чем каждый занимается).
    Вы сами выбираете направление, которое вы хотите. Но есть ограничение - как раз руководитель.
    Но иногда, если у вас хорошие отношения с кафедралами, если вы уже себя зарекоммендовали, то могут пойти навстречу, и может быть (может быть!) какой-нибудь руководитель согласится взять руководство вашей темой.
    Но возможно, что лучшим решением будет - взять уже известное направление. Ваша кафедра, скорее всего, занимается чем-то конкретным (или несколькими). И вы возьмёте уже известное направление, и возьмёте какую-то часть общей кафедральной работы. Так и вам будет полегче, и результат будет постабильнее.

    В общем, для начала выбирайте руководителя, идите к нему, и расскажите, чем бы вам хотелось заниматься. И руководитель предложит вам что-нибудь, и для него необходимое, и для вас подходящее.

    P.S. Вы планируете ли дальше пойти в аспирантуру? тогда нужно выбирать тему магистерской так, чтобы она стала заделом аспирантской работы.
    Ответ написан
    Комментировать
  • Почему не работает document.write во внешнем js файле?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    я тоже сталкивался с этим. Удалённые скрипты должны работать через element.innerHTML, а не через document.write. А так как у меня был не мой скрипт, то я сделал так - я переопределил document.write на свою реализацию, которая как раз и делала element.innerHTML.
    Ответ написан
  • Как расположить объекты в системе координат XY внутри блока?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    <span class="object" style="left: 20%; top: 45.6%;"></span>

    .object {position: relative;} /* а можно и absolute */

    И дальше в js управлять свойствами left и top. А, вам не нужно менять положение - тем проще.

    Возможно, если много объектов, то перейти на использование canvas.
    Посмотрите на Fabric.js (есть статьи на хабре: один и два)
    Ответ написан
    Комментировать
  • Почему select отображает пустые поля записей после их удаления?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    поможет ivaynberg.github.io/select2 - самый первый пример в The Basics (второй input)
    Ответ написан
    Комментировать
  • Как сделать чтобы jQuery и MooTools работали и не мешали друг другу?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Где вы вызываете jQuery.noConflict()? попробуйте вызвать после загрузки jQuery, но до загрузки MooTools.
    Если отключить jQuery, то скрипты на MooTools работают нормально?
    Ответ написан
  • Объясните что такое полиморфизм простыми словами ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Полиморфизм указывает, какую версию метода текущего объекта запустить.
    Например, у вас есть несколько наследуемых классов, с разной реализацией одного и того же метода. То есть, у вас есть несколько разных методов с одинаковым именем (и сигнатурой), реализованных в разных классах. Какую версию метода вызвать? Это зависит от типа переменной, в которой находится объект.
    Также с помощью полиморфизма можно поместить объекты разных классов в один массив с типом базового класса.

    Создадим три класса с двумя методами - один виртуальный, а другой нет. Виртуальный метод переопределён (override) в классах-наследниках. Невиртуальный метод просто скрыт в наследниках новой реализацией (невиртуальные нельзя переопределять).
    class Animal {
        public void Info() { Console.WriteLine("Animal"); }
        public virtual void Say() { Console.WriteLine("Nothing to say"); }
    }
        
    class Cat : Animal {
        public void Info() { Console.WriteLine("Cat"); }
        public override void Say() { Console.WriteLine("Meow"); }
    }
        
    class Dog : Animal {
        public void Info() { Console.WriteLine("Dog"); }
        public override void Say() { Console.WriteLine("Woof"); }
    }

    При создании объекта важно, в переменную какого типа объект будет записан:
    Dog dog1 = new Dog();
    Animal dog2 = new Dog();
    // Не виртуальный метод - вызовется метод класса, указанного у переменной 
    dog1.Info(); // напишет Dog
    dog2.Info(); // напишет Animal
    // Виртуальный метод - вызовется метод класса, которого переменная реально имеет
    dog1.Say(); // напишет Woof
    dog2.Say(); // напишет Woof


    А теперь частая ситуация, когда полиморфизм нужен - при итерации массива:
    Animal[] animals = new Animal[10];
    FillAnimals(animals); // заполним массив вперемешку собаками и кошками
    
    foreach (var animal in animals) animal.Say(); // вызовется правильный метод
    // У невиртуальных методов так сделать нельзя! Полиморфизм в действии

    Наследование без виртуальных методов полезен только фиксацией интерфейса.

    Вот весь код примера: code.re/5ZC
    Вставьте его вот сюда и проверьте.

    P.S. Написал код на C#, чтобы подчеркнуть разницу между виртуальными и невиртуальными методами. В Javascript все методы виртуальные (как и в php, например).

    UPD. (спасибо @Petroveg)
    В языке C# (и других статически типизированных) обычно делают так - если метод в базовом классе записывается для всех потомков и оттуда будут использоваться напрямую, то он помечается обычным, невиртуальным. А если метод предназначен для того, чтобы в наследниках его переопределить, то необходимо его сделать виртуальным, чтобы при вызове метода компилятор выбрал нужную версию метода. То есть некоторые методы лучше делать виртуальными, а некоторые нет.
    И ещё раз - виртуальность важна только в одном случае - если объект-наследник записан в переменную базового класса:
    Animal animal = new Dog();
    В javascript невиртуальных методов не бывает - динамическая основа этого языка ВСЕГДА автоматически вызывает именно последнюю версию метода, определяя конкретную по цепочке прототипов. Поэтому в Javascipt, по большому счёту, сильно думать о полиморфизме смысла нет - это только абстрактная концепция, не влияющая на сам код, а только на архитектуру.
    Ответ написан
    6 комментариев
  • Какая есть простая библиотека, реализующая классы в JavaScript?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Для начала, вот обширный список библиотек для реализации классов.
    Лично мне нравится AtomJs от хабрапользователя @TheShock (статья об AtomJS).
    Ответ написан
    Комментировать
  • Какой JavaScript фреймворк посоветуете для One-Page Enterprise Web App?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если Enterprise, то Angular.js будет хорошим выбором.
    Есть ещё Durandal.Js - Single Page Apps Done Right. Сам не пробовал, но хвалят.
    Ответ написан
    Комментировать
  • Где в этом простом коде может быть ошибка ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Другая реализация:
    <input type="checkbox" onchange="check(this)" id="item-1" />
    <input type="checkbox" onchange="check(this)" id="item-2" />
    <h3 id="summa">Выберите элемент</h3>

    var items = {
      "1": {name: "Стол", price: 100},
      "2": {name: "Стул", price: 200}
    };
    function check(input) {
        var id = input.id.split('-')[1];
        items[id].checked = input.checked;
        updateSum();
    }
    function updateSum() {
        var sum = 0, names = [];
        for (var i in items) {
            if (items[i].checked) {
                names.push(items[i].name);
                sum += items[i].price;
            }
        }
        var text = "Выберите элемент";
        if (sum > 0) text = names.join('+') + '=' + sum;
        document.getElementById('summa').textContent = text;
    }
    Ответ написан
    Комментировать
  • Как правильно сделать проверку строки на отсутствие некоторых символов?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Перечисляем все допустимые символы и ищем, есть ли что-то кроме них:
    var illegal = /[^авекмнорстух0-9]/i;
    illegal.test("а123се64"); // false
    illegal.test("а123сг64"); // true
    illegal.test("а123се 64"); // true
    illegal.test("а123464"); // false
    illegal.test("А123ВЕ64"); // false

    Здесь true - это неверный номер.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы ссылка плавала по странице, перемещалась, и её можно было перемещать самому?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Посмотрите Greenshock draggable демку. Физики (столкновений) тут тоже нет.
    Также посмотрите на Box2d with DOM.
    Вам нужно именно на HTML? Или на canvas тоже подойдёт? Потому как для canvas есть Box2d.js (например, гляньте вот эту демку. Тут на WebGL, но такое есть и для canvas).
    Если не подойдёт, то придётся делать самому - определять столкновения и передавать импульс второму объекту.
    Ответ написан
    1 комментарий
  • Как добавить на уже работающий сайт контактную форму?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Похоже, у вас сайт самописный, не основан на одной из CMS. Тогда вам нужно добавить страницу с формой обратной связи (или на страницу контактов), и отправлять её на специальный скрипт, который будет обрабатывать эту форму. Делается это очень просто. Обрабатывать можно по разному - можно писать емейл ответственному лицу, можно добавлять в базу данных в отдельную таблицу, и тогда показывать полученные данные в админке (ежели такая у вас имеется).
    Вот вам две инструкции, как сделать простые формы: раз и два.
    Ответ написан
  • Почему javascript проваливает проверку когда много условий?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если у вас в элементах var2-var4 записаны числа, то тип данных всё равно строка, и для сравнения с нулём нужно преобразовать строку в число. Либо как сказал @GM2mars, только в его примере лучше указать вторым параметром систему счисления: parseInt(form.var4.value, 10) === 0, потому как в старых браузерах числа, начинающиеся с нуля ("012"), считались восьмеричным числом. Либо просто указать +form.var4.value === 0, где унарный плюс переведёт строку в число.
    А само присвоение valid = false в данном случае корректно.
    Но я обычно делаю так:
    function validate(form) {
      var errors = [];
      if (form.var1.value.length < 2) errors.push('length');
      if (+form.var2.value == 0) errors.push('var2');
      if (+form.var3.value == 0) errors.push('var3');
      if (+form.var4.value == 0) errors.push('var4');
      showErrors(errors);
      return errors.length == 0;
    }
    function showErrors(errors) {
      foreach (error in errors) {
        switch (errors[error]) {
          case 'length': document.getElementById('var1_e').innerHTML='err1'; break;
          case 'var2': document.getElementById('var2_e').innerHTML='err2'; break;
          case 'var3': document.getElementById('var3_e').innerHTML='err3'; break;
          case 'var4': document.getElementById('var4_e').innerHTML='err4'; break;
        }
      }
    }

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

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    <div class="container">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
    </div>

    $('.item').click(function(){
        $('.container .item:first-child').insertAfter(this);
        $(this).parent().prepend(this);
    });

    Вот этот код рабочий: jsfiddle.net/44R5R/2
    Этот код ставит кликнутый элемент в начало списка блоков, а на его место ставит первый элемент.
    Дальше я не понял, что делать надо с удалениями. Если нужно сделать, чтобы тот, по кому кликнули, стал первым - и единственным, то остальные нужно просто удалить.
    Ответ написан
    Комментировать
  • Как проверить на более точное совпадение?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    вам какие строчки сравнивать? Строчки 'v.y' и 'vry' разные, их и правда легко сравнить обычным оператором ==. Если вам нужно, чтобы строки 'v.y' и 'V.y' и 'v.Y' были равны, то есть без учёта регистра, то лучше сравнивать строки, приведённые к нижнему регистру:
    function checkMatch(request, item) {
     	return request.toLowerCase() === item.toLowerCase();
     }

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

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    function handleChange(input) {
        var index = input.id.split('-')[1];
        var counch = document.getElementById('countspr-' + index);
        if (input.checked) {
    	counch.style.display='inline';
    	counch.value = 1;
    	counch.focus();
        } else {
    	counch.style.display='none';
    	counch.value = '' ;
        }
    }

    Использовать так:
    <input style="display:none" id="countspr-1" name="checkcountsp[]" type="text" maxlength="2" size="1" value="" > 
    <input type="checkbox" id="spr-1" name="checksp[]" onchange="handleChange(this)">Товар 1

    Обратите внимание, я добавил дефис в id элементов.
    У элемента chackbox не ставится атрибут value. Если надо установить галочку, то ставится атрибут checked, если нужно вывести подсказку при наведении, то атрибут title:
    <input type="checkbox" name="checkboxname" checked title="Подсказка"> Описание
    Ответ написан
    1 комментарий
  • Какие есть инструменты для отладки NodeJS кода?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Консоль тоже есть, как же без неё. Но она не такая удобная, как в браузере. Я разрабатывал в WebStorm7, и мне не хватало той консоли, были проблемы с сильно вложенными объектами.
    Может пригодиться Node Inspector.
    Посмотрите также статью Нормальное профилирование node.js приложений, в ней описаны некоторые подходы.
    Ответ написан
    Комментировать
  • Замыкания, что не так?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Проблема в том, что присвоение this[ "get" + i ] = function() {} происходит в анонимной функции, которой не присвоен контекст. Значит, контекстом является глобальный объект.
    В данном случае геттеры и сеттеры создаются не у создаваемого объекта, а у глобального объекта (в браузере это window), поэтому вы вообще можете запустить функцию getname(). Её просто нет у объекта, но она есть в глобальном пространстве.
    Чтобы исправить, нужно в конструкторе в начале сделать ссылку на this и присваивать геттеры/сеттеры объекту через эту ссылку, а не через ключевое слово this.
    function User( properties ) {
        var user = this;
        for ( var i in properties ) { 
            (function(){
                user[ "get" + i ] = function() {
                    return properties[i];
                };
                user[ "set" + i ] = function(val) {
                    properties[i] = val;
                };
           })(); 
        }
    }

    Верно отметил @Fesor в соседнем ответе, лучше не плодить переменные, если можно указать контекст вызова явно:
    function User( properties ) {
        for ( var i in properties ) { 
            (function(){
                this[ "get" + i ] = function() {
                    return properties[i];
                };
                this[ "set" + i ] = function(val) {
                    properties[i] = val;
                };
           }).call(this); 
        }
    }
    Ответ написан
    1 комментарий
  • Как лучше подготовить контент для вставки на сайт?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    javascript будет в браузере работать или в Node.js?
    Если в браузере, то используйте JSON. Можно и xml, но json более нативный для javascript, да и удобнее, имхо.
    Если в Node.js, то подумайте о хранении в базе данных, например, в MongoDB. И из python, и из Node.js к ней очень легко обратиться и легко получить любые данные (в том числе агрегированные).
    Ответ написан
    Комментировать