Задать вопрос
  • Как достать сообщения из консоли?

    abyrkov
    @abyrkov
    JavaScripter
    void function() {
      var lastlog = console.log;
      console.log = function(message) {
        if(message == 'Loaded') startSomeScript();
        lastlog.call(console, message);
      }
    }()
    Ответ написан
    2 комментария
  • Как читается решение данной задачи?

    abyrkov
    @abyrkov
    JavaScripter
    Ну что тут сложного? У нас есть массив lot
    var lot
    есть парочка объектов
    var chevy = {
      make : "Chevy" ,
      model : "Bel Air"
    } ;
    
    var taxi = {
      make : "Webville Motors" ,
      model : "Taxi"
    } ;
    
    var fiat1 = {
      make : "fiat" ,
      model : "500" 
    } ;
    
    var fiat2 = {
      make : "fiat" ,
      model : "500" 
    } ;

    мы берем и копируем ссылки на них в массив и присваиваем его lot
    var lot = [chevy , taxi , fiat1 , fiat2]
    есть у нас магическая функция findCarInLot, с помощью которой мы находим индекс машины в массиве
    var loc1 = findCarInLot(fiat2) ;   // Результат 3
    var loc2 = findCarInLot(taxi) ;    // Результат 1
    var loc3 = findCarInLot(chevy) ; // Результат 0
    var loc4 = findCarInLot(fiat1) ;   // Результат 2


    Магическая функция работает так:
    в параметры нам передают машину
    function findCarInLot (car) {
      ...
    }

    потом мы запускаем цикл по lot
    ...
      for (var i = 0 ; i < lot.length ; i ++) {
        ...
      }
    ...

    в цикле, lot[i] указывает на текущий элемент
    а мы его сравниваем с переданной нам машиной
    ...
        if ( car === lot[i] ) {
          ...
        }
    ...

    Если они совпадают, мы прерываем функцию, возвращая индекс - return i;
    если же весь цикл выполнился и не прервался, то мы возвращаем -1 - return -1;
    Ответ написан
    Комментировать
  • Для чего в данной функции stopPropagation?

    abyrkov
    @abyrkov
    JavaScripter
    Это нужно, наверно, для предовращения "погружения" события - почитайте
    Ответ написан
    Комментировать
  • Как в node.js сделать задержку в цикле?

    abyrkov
    @abyrkov
    JavaScripter
    Отказаться от forEach... точнее, использовать вместо него for в генераторе.
    function* code(result) {
      for(var i = 0; i < result.length; i++) yield result[i];
    }
    function code2(gen) {
      items = gen.next().value;
      request.get("https://www.googleapis.com/youtube/v3/search?part=snippet&order=viewCount&q="+items['song']+'+'+items['song']+"&type=video&key=AIzaSyAvDAdEnqrStOJNnpnGy9BkrC_sG-gcHIU", function(err,res,body){
              if(res.statusCode == 200 ) {          	
                 console.log(JSON.parse(body)['items'][0].id.videoId);	
                 code2(gen);         
              }
          });
    }
    let gen = code(result);
    code2(gen);
    Ответ написан
  • Как работает WebSocket(Comet)?

    abyrkov
    @abyrkov
    JavaScripter
    Вы точно смотрели туда? Модель Comet однонаправленая: от сервера к клиенту, а это, очевидно, не то, что вам нужно. Но...
    Модель Comet реализуется в клиентской части стандартом Server-Sent Events. Суть ее довольно проста: сервер отправляет строки во всремя создания события. А браузер уже заботится, что бв соединение не прерывалось. Реализация на стороне клиента:
    var ticker = EventSource('our.php');
    ticker.onmessage = function(e) {
      console.log(e.type);
      console.log(e.data);
    }

    Со строны сервера должны приходить строки такого вида:
    event: hello
    data: Hello, World!

    Обратите внимание на последнюю строку. Она, собственно говоря, создает событие.
    Матчасть: Comet, EventSource

    Пример:
    var ticker = EventSource('changes.php');
    ticker.onmessage = function(e) {
      // Реагируем только на события изменений
      // Нам приходит id + ' ' + html, для примера. Мы очищаем данные split'ом, но настоятельно
      // рекомендую придумать свой формат
      if(e.type == "messagechange") data(e.data.split(' ')[0], e.data.split(' ').slice(1).join(''), e.data);
    }
    var elements = document.getElementsByClassName('message');
    function data(id, data) {
      // Нам приходит id элемента, по которому мы определяем, к какому элементу изменения
      // и дата. В данном примере, id определяет номер элемента, но вы можете изменить эту
      // логику на свою
      elements[+elNum].innerHTML = data;
    }

    Пример данных от бэкенда
    event: messagechange
    data: 0 It works!


    WebSocket - это как раз двунаправленая связь. Работают они по особому протоколу. Не буду вникать в технические детали, однако соединение постоянное(чего не скажешь про SSE). Реализацию на клиенте берет коструктор WebSocket. Пример:
    var socket = new WebSocket('ws://ws.example.com/res');
    socket.onopen = fucntion(e) {
      // Socket opened
    }
    socket.onclose = function(e) {
      // Socket closed
    }
    socket.onerror = function(e) {
      // Error!
    }
    socket.onmessage = function(e) {
      console.log(e.data);
    }
    socket.send('Hello, server!');
    socket.close();

    Матчасть: MDN
    Ответ написан
    9 комментариев
  • Как сделать тетрис на js с учётом размера экрана?

    abyrkov
    @abyrkov
    JavaScripter
    Для начала задам вопрос: на чем вы это делаете?
    Если вы это собираетесь делать на HTML, то вы в неправильном направлении. Это лучше всего делать на Canvas.

    А что касается резиновости, то тут все просто: мы вычисляем размер canavas, на основании этих размеров высчитываем все нужные нам значения.
    Пример
    Пусть у нас Тетрис 10х10 клеток, а размеры Canvas - 640х480. Мы хотим, что бы у нас все было по минимальному измерению Canvas. Тогда мы находим его
    var min = (canvas.width < canvas.height) ? +canvas.width : +canvas.height
    делим его на 10, что бы получить клетку
    var size = min / 10
    и на основании этого размера делаем передвижение фигур и т.д.
    function move(time) {
      var realtime = time - lasttime;
      realtime = realtime - realtime % ourInterval;
      figure.y += (realtime == 0) ? 0 : realtime / ourInterval * size;
      lasttime += realtime;
    }
    Ответ написан
    1 комментарий
  • Почему не срабатывает JS функция по событию submit?

    abyrkov
    @abyrkov
    JavaScripter
    Код-вырвиглаз
    .onsubmit(function(e) {
      e.preventDefaults();
    }
    Ответ написан
    Комментировать
  • Почему событие click работает только с анонимной функцией?

    abyrkov
    @abyrkov
    JavaScripter
    Вы передаете не функцию, а ее результат.
    $(...).click(scrollToElement(targetscroll));
    Скобочки - это знак вызова. Т.е. сначала выполняется функция scrollToElement(targetscroll), а потом уже ее результат передается в .click(...). Правильно:
    $(...).click(scrollToElement.bind(null, targetscroll));
    Ответ написан
    2 комментария
  • Как сделать запись текста в input с помощью кнопки?

    abyrkov
    @abyrkov
    JavaScripter
    button.addEventListener('click', function(e) { input.value = 'Text'; } );

    P.S. Как получать input и button - в вопросе не было не слова. Претезии принимать по этому поводу не буду.
    Ответ написан
  • Как правильно сформировать следующий массив в JS?

    abyrkov
    @abyrkov
    JavaScripter
    Не множественный, а многомерный)
    Добавляем такой код в начало(после document-ready):
    var array = [];
    var els = $('table tr');
    for(var i = 0; i < els.length; i++) {
      array.push([]);
      for(var i2 = 0; i2 < $(els[i]).children().length) array[i][i2] = $($(els[i]).children()[i2]);
    }
    Ответ написан
  • Как отслеживать изменения в DOM без jQuery?

    abyrkov
    @abyrkov
    JavaScripter
    А что вам не понятно в MutationObserver?
    Ответ написан
    8 комментариев
  • Почему js неадекватно смотрит на данные из div?

    abyrkov
    @abyrkov
    JavaScripter
    В первом случае у нас объект с 1-12. Тупо, лучше массив сразу.
    Во втором случае у нас строка.
    Чего удивительного?
    Ответ написан
    Комментировать
  • Как выяснить, какие скрипты работают?

    abyrkov
    @abyrkov
    JavaScripter
    Инструкция для Chrome:
    1. Кликаем ПКМ
    2. В открывшемся контекстном меню выбираем "Посмотреть код"
    3. Сбоку появится панель "Инструменты разработчика". Сверху будет квадратик с курсором. Жмакаем его.
    4. Наводим мышь на нужный элемент.
    5. Жмакаем.
    6. Находим в боковой панели нижнию подпанель, а там кнопочку EventListeners
    7. Жмакаем ее
    8. Ищем нужные события(click, dbclick, mousedown, mouseup)
    9. Кликаем по треугольничкам до них.
    10. Кликаем по треугольничкам внутри новооткрытых вкладок.
    11. ???
    12. handler - это функция, которая будет выполнятся при соответсвующем событием.

    P.S. Отметьте решением, если помог
    Ответ написан
    Комментировать
  • Как передать аргумент от файла к приложению?

    abyrkov
    @abyrkov
    JavaScripter
    Не используйте кирилицу просто.
    Ответ написан
    Комментировать
  • Чему равна строка при сравнении с числом в Javascript?

    abyrkov
    @abyrkov
    JavaScripter
    Тут два небольших ньюанса:
    1. По кодам сравниваются лишь строка со стокой.
    2. При сравнении числа приводятся к строке, если мы сравнимаем на ==, !=, и строки к числам - <, >, >=, <=
    Ответ написан
    Комментировать
  • Материал по socket.io?

    abyrkov
    @abyrkov
    JavaScripter
    Потому, что на socket.io уже есть 2(!) отличнейших туториала на английском - вот
    Ответ написан
    3 комментария
  • Как вставить ссылку в js?

    abyrkov
    @abyrkov
    JavaScripter
    Вот вам нужен такой кусок кода:
    {var t,s,a={cntClass:"rd-mobilemenu",menuClass:"rd-mobilemenu_ul",submenuClass:"rd-mobilemenu_submenu",panelClass:"rd-mobilepanel",toggleClass:"rd-mobilepanel_toggle",titleClass:"rd-mobilepanel_title"},l=function(t,s){this.options=s,this.$source=e(t)};l.prototype={init:function(){var e=this;e.createDOM(),e.createListeners()},createDOM:function(){var t=this;e("body").append(e("<div/>",{"class":a.cntClass}).append(t.createNavDOM())).append(e("<div/>",{"class":a.panelClass}).append(e("<button/>",{"class":a.toggleClass}).append(e("<span/>"))).append(e("<h2/>",{"class":a.titleClass,html:"Главная"})))},
    Ответ написан
    1 комментарий
  • Почему GitHub.com до сих пор частично недоступен?

    abyrkov
    @abyrkov
    JavaScripter
    Добавьте в файл hosts(в Windows - %SystemRoot%\System32\drivers\etc\hosts, в Linux - /etc/hosts) любую из следующих строк:
    assets-cdn.gihub.com 208.73.210.200
    assets-cdn.gihub.com 208.73.210.214
    assets-cdn.gihub.com 208.73.210.214
    assets-cdn.gihub.com 208.72.210.217
    assets-cdn.gihub.com 208.72.210.198

    И все будет работать
    Ответ написан
    Комментировать
  • Можно ли найти качественную тему для Windows XP в стиле современных IDE (типа Monokai?)?

    abyrkov
    @abyrkov
    JavaScripter
    Для линукса - легко! На DevianArt'е есть темы для XFCE, насчет GNOME/KDE/Unity не знаю, есть ли они на нем, но найти сайт с темами для нужной граф. оболочки - легче легкого. Мне показалась, вам вот это подойдет. В крайнем случае, найти папку с темой, похожей для вас и допилить ее. This is Linux.

    Насчет windows'а - тут сложнее. Кастомизация всегда была ограничена. Если вы уже так не можете найти подходящую тему - нужно просто обзавестись исследователем внутренних ресурсов приложения(к примеру PE Explorer), найти файлы темы, дублировать ее и поменять значки-цвета.
    Ответ написан
    Комментировать