Ответы пользователя по тегу JavaScript
  • Datepicker Angular ui?

    Может ошибки какие-нибудь в консоли? Другая версия библиотек?

    И у вас у инпута стоит атрибут value="today" - если есть ng-model, то это не нужно. Вы просто устанавливаете в значение инпута строку "today".
    Ответ написан
  • Angularjs && ui-router - как реализовать переход между parentPage и childPage без перезагрузки?

    Не совсем понятно. У Вас получается одна вьюха
    <div ui-view="page"></div>
    На все роуты. Т.е. при переходе на любую из страниц эта вьюха полностью обновляется
    Ответ написан
  • Пример работы с директивами?

    Вот, например есть селект и директива, меняющая текст в зависимости от значения селекта (рабочий пример):

    app.js
    angular.module('myApp',[]);
    
    angular.module('myApp')
        .controller('myCtrl',[ '$scope',
            function($scope){
              $scope.options = [
                {name:'text1'},
                {name:'text2'}
              ];
              $scope.selectedText = $scope.options[0];
            }
        ])
        .directive('myDirective', [ function () {
            return {
                    restrict: 'AE',
                    scope: {
                        selectedValue: '=ngModel',
                    },
                    templateUrl: 'directive-template.html',
                    link: function(scope,elem,attrs) {
                    
                    },
                    controller: function($scope) {
                      $scope.isChosen = function(v) {
                        return $scope.selectedValue == v;
                      };
                    }
                };
        }])
    ;

    index.html
    <body ng-controller="myCtrl">
        <p>Hello world!</p>
        <select ng-model="selectedText" ng-options="opt.name for opt in options"></select>
        <div ng-model="selectedText.name" my-directive=""></div>
      </body>

    directive-template.html
    <div>
      <h1 ng-show="isChosen('text1')"> ТЕКСТ 1 </h1>
      <h1 ng-show="isChosen('text2')"> ТЕКСТ 2 </h1>
    </div>
    Ответ написан
  • Как при помощи angular можно изменить валюту сайта?

    Используйте фильтры.
    <span>{{price | myCurrencyFilter}}</span>
    Ответ написан
    Комментировать
  • Как такое переписать на angular?

    Как сделать на angular так, чтобы при нажатии "заказать" парсились данные товара

    У вас уже есть все данные в disks. Зачем их парсить?

    1. Используйте ngClass,ngSrc:
    Вместо:
    <div ng-repeat="disk in disks | filter:search" class="product-block {{disk.Genre}}">
    <img id="{{disk.ID}}_img" src="img/{{disk.Image}}" alt="">


    2. Уберите все эти ID. Это не angular way.

    3. Если Вам нужна кнопка - используйте кнопку, а не ссылку:
    Вместо:
    <a href="" id="{{disk.ID}}">Заказать</a>
    Надо:
    <button type="button">Заказать</button>

    4. Используйте ngClick директиву:
    <button type="button" ng-click="order(disk)">Заказать</button>


    5. Для использования localstorage я рекомендую использовать специальный сервис (можно взять этот).

    6. Сохранение
    В контроллере:
    // Где-то внутри Вашего контроллера
    // $scope.orderList - список заказов
    $scope.order =  function(disk) {
        // Добавляем заказ. Будет выглядеть примерно так:
        $scope.orderList.push(disk);
    }


    7.
    Товары, добавленные в корзину, храню в localstorage, так вот: как его очистить, чтобы данные на странице обновились без перезагрузки страницы?

    $scope.clearAllOrders = function() {
        $scope.orderList.length = 0;
    }


    8. При удалении аналогично - используйте Ваш контроллер и ngClick:
    <button type="button" ng-click="del(disk)">Отменить заказ</button>

    В контроллере:
    // Где-то внутри Вашего контроллера
    $scope.del=  function(disk) {
        // Удаляем заказ. Будет выглядеть примерно так:
        // Получаем индекс диска в массиве $scope.orderList
        // Будьте внимательные - поиск идет по ссылке, а не по значению
        var diskIndex = $scope.orderList.indexOf(disk) ;
        $scope.orderList.splice(diskIndex,1);
    }


    9.
    То есть удаляется конкретный объект из массива и localstorage сохраняется с новыми данными.
    reloader() - функция перезагрузки страницы.
    Так вот, интересует как это можно реализовать без перезагрузки страницы.

    Нормально через сервисы организуйте структуру данных и сделайте биндинги - все остальное за вас сделает ангуляр.
    Вам подойдет watch:
    // $scope.orderList - массив заказов
    $scope.$watch('orderList',function(nv,ov){
       localStorageService.set('ключ',angular.toJson(nv));
    });


    Получается связь scope.orderList -> localStorage и все синхронизировано

    UPD2.
    Я изменил ответ - убрал лишний мусор, теперь все ок.
    Ответ написан
  • Как прижать футер вниз и чтобы его высота менялась при добавлении контента?

    Никакого JS. Смотрите пример c bottom:0. Работает с любым количеством контента.

    Вот еще один способ (тут надо жестко задавать высоту футера)
    Ответ написан
  • Клон исчезает, а исходный div остается, как сделать наоборот?

    Вы и сами почти решили задачу :)

    Адекватный вариант (jsfiddle):
    $(function() {      
        $(".group").draggable({
                    containment: 'document',
                    zIndex: 9999,
                    helper: 'clone',
                    appendTo: '.anotherDiv'
        }).on("drag",function(e){
            // Когда начинаем перемещать - удаляем оригинал
            $(this).remove();
        });
    });


    Еще есть неадекватный вариант (jsfiddle) если хотите вручную все это проделывать (или показывать другой элемент и т.д.):
    $(function() {
        // При нажатии кнопки мышки на элементе
        $(".group").mousedown(function(e){
            var $this = $(this);        
            // Клонируем оригинал
            var clonedNode = $this.clone(); 
            // Устанавливаем координаты и абсолютное позиционирование относительно body
            // Чтобы вставить новый блок в то же место где был оригинал
            clonedNode.css($this.offset());         
            clonedNode.css({position:'absolute'}); 
            // Делаем элемент перетаскиваемым
            clonedNode.draggable({
                    containment: 'document',
                    zIndex: 9999,
                    appendTo: '.anotherDiv'
            });
            // Добавляем клон на страницу (в body), а оригинал - удаляем
            $('body').append(clonedNode); 
            $this.remove();
            // Говорим клону, что на него пользователь нажал мышкой (начал перетаскивать)
            clonedNode.trigger(e);
        });
    });


    UPD1:
    Если Вам нужно, чтобы блок добавлялся в контейнер в который вы его бросаете - настройте droppable. Я покопался - написал более полный пример (jsfiddle)
    $(function() {    
        // Для всех элементов инициализируем draggable
        $(".group").map(initDraggable);
        // Инициализируем droppable
        $(".anotherDiv").droppable({
            accept:  '.group',
            drop:  function(event, ui) {
                // Если мы успешно бросаем элемент - клонируем его
                // Не забудем удалить класс hiddenGroup - т.к. оригинал перетаскиваемого элемента был спрятан
                $(this).append($(ui.draggable).clone().removeClass('hiddenGroup'));
                // Удалим оригинал
                $(ui.draggable).remove();
            }
        });    
        
        function initDraggable(){        
            // Сохраняем элемент
            var $el = $(this);        
            $el.draggable({
                    containment: 'document',
                    zIndex: 9999,
                    helper: 'clone',
                    appendTo: '.anotherDiv',
                    revert: function(isValidDrop){
                        // Эта функция вызывается, когда элемент закончили перетаскивать
                        // Параметр isValidDrop - истина, если элемент успешно перетащен (его бросили в контейнер anotherDiv)
                        if(!isValidDrop){                                   
                            // Если же элемент был брошен не там, то сделаем оригинал снова видимым 
                            // (клон пропадет, если мы вернем false см. ниже)
                            $el.removeClass('hiddenGroup');                        
                        }
                        // По-хорошему надо возвращать !isValidDrop, но тогда при отмене перетаскивания
                        // будет анимация (блок полетит обратно на свое место) 
                        // и одновременно с этим будет показан оригинал (из условия выше) - выглядит некрасиво
                        return false;//!isValidDrop;
                    }
            }).on("drag",function(e){
                // При начале перетаскивания - прячем оригинальный блок
                $el.addClass('hiddenGroup');
            });
        }
    });


    UPD2:
    Последний вариант, все как Вы просили (надеюсь) (jsfiddle):
    $(function() {      
        $(".group").map(initDraggable);
        $(".anotherDiv").droppable({
            accept:  '.group',
            drop:  function(event, ui) {
                // Добавим position: absolute           
                // И клонируем наш хэлпер, а не оригинал
                var $cloned = $(ui.helper).clone().addClass('droppedGroup'); 
                
                $(this).append($cloned);     
                initDraggable.apply($cloned);
                $(ui.draggable).remove();
            }
        });    
        
        function initDraggable(){        
            var $el = $(this);
            
            $el.draggable({
                containment: 'document',
                zIndex: 9999,
                helper: 'clone',
                appendTo: '.anotherDiv',
                start:  function(event, ui){ 
                    $el.addClass('hiddenGroup');
                },
                revert: function(isValidDrop){
                    if(!isValidDrop){                  
                        $el.removeClass('hiddenGroup');                        
                    }
                    return false;//!isValidDrop;
                }
            });
        }
    });
    Ответ написан
  • Какой движок/cms использовать для WEB , если данные приходят в json формате?

    Angular, backbone, ember и др - фреймворков полно. Выбирайте на Ваш вкус)
    Я за ангуляр.
    Ответ написан
    Комментировать
  • Как сделать два события на onclick с setTimeout на втором событии?

    <span  onclick="clickHandler()"  class="loadvid2">МУЗТВ Онлайн  ></span>


    function clickHandler(){
        // Событие 1
        setTimeout(function(){
            // Событие 2, через 5 секунд
        }, 5000);
        return false;
    }
    Ответ написан
  • Как создать действие в поле input (text) при вводе определенного числа?

    В самом простейшем варианте (на jQuery):
    $('.my_input').keyup( function() {
        var $this = $(this);
        var v = parseInt($this.val(), 10);
        if(v >= 100000)
        {
            $('.my_div').show();
        }
    });
    Ответ написан
  • Почему приложение уходит в бесконечный цикл?

    iNikNik
    @iNikNik Автор вопроса
    Это провал :(
    Один из jQ-плагинов портил кровь - убрал его и все стало хорошо. Непонятно, почему бесконечный цикл не возникал, если jq после ангуляра подключать, ну да ладно. Уже не важно.

    Неужели убрали возможность в /tmp перенести вопрос ?(
    Ответ написан
    Комментировать
  • Как использовать данные от фабрики в ангуляр?

    Если использовать promises, то можно сделать так:
    $scope.getTotalAmount = function(index){
        //тут посложнее логика
        if(!$scope.billings.$resolved)
            return 0;
        return $scope.billings[index].bills;
    }

    Но это не поможет, если произошла ошибка в ходе запроса (promise rejected).

    Можно сделать так:
    $scope.getTotalAmount = function(index){
        //тут посложнее логика
        if(!$scope.billings[index])
            return 0;
        return $scope.billings[index].bills;
    }
    Ответ написан
  • Почему Angular не считает объекты?

    По мне так у Вас очень странное решение. Я бы сделал
    function getTotal() {
      return $scope.customers.length;
    }

    И во вьюхе использовал {{getTotal()}} . А у Вас получается, что надо вызывать getTotal каждый раз, когда изменяется массив customers.
    + getTotal по логике - получить количество чего-то, а у вас она ничего не возвращает.
    Ответ написан
  • Что делает такой код JQuery?

    Создает новый DOM элемент из переданного HTML-кода. Документация:

    jQuery( html [, ownerDocument ] )
    Description: Creates DOM elements on the fly from the provided string of raw HTML.


    А насчет того, что у Вас пропадает - приведите подробнее пример.
    Ответ написан
    Комментировать
  • Почему не работает замыкание в jQuery.on()?

    Почему когда counter() вставить в $('.txt').on('click'...) - не работает?

    Вы пытаетесь сделать замыкание на переменную, которой в этот момент еще нет. Соблюдайте логику выполнения - сначала определяем counter и лишь затем делаем на него замыкание:
    function makeCounter() {
        var currentCount = 0;     
        return function() {
            return ++currentCount;
        };
    }
    		 
    var counter = makeCounter();	
    
    $('.txt').on('click', function(){
        console.log($(this).text());
        counter();
    });


    Если Вам нужно сохранить последний элемент, на который кликнули - код может выглядеть вот так:
    $(function(){
        var $lastClicked;
        $('.txt').on('click', function(){
            $lastClicked = $(this);
        });
    });


    Главное помните - не засоряйте глобальную область видимости без особой необходимости.
    Ответ написан
  • Как называется скрипт, определяющий что пользователь собирается закрыть страницу?

    Может автор имел ввиду скрипт, который на основе поведения пользователя определяет момент когда пользователь захотел покинуть сайт?
    Я слышал, что есть подобный сервис, назывался он callback hunter как-то так. На сколько он рабочий - не знаю))))

    Ну а если нет - присоединяюсь к остальным, в аду приготовлен отдельный котел, для тех, кто так делает )))
    Ответ написан
    Комментировать
  • Объект function?

    Это анонимная функция - функция без названия.
    Использовать можно вот так:
    var f = function() {
    };
    f();
    Ответ написан
    Комментировать
  • Как отправить по отдельности несколько одинаковых форм с разными ID?

    Не надо использовать велосипедов. Да и плагин совершенно не нужен. Как советуют на stackoverflow
    return false;
    - это то, что Вам нужно. Я отписался в комментарии под вопросом - код абсолютно рабочий, страница не перезагружается.
    Убедитесь, что обработчик вызывается и по возможности используйте последнюю версию jq.

    Как уже Вам советовали используйте атрибут name для полей, в целом код может выглядеть вот так:
    <form id="form" action="/cart/add" method="post"> 
        <input type="hidden" value="15>" name="articleId" /> 
        <button type="submit">В корзину</button> 
    </form>

    В форме я заменил input[type=submit] на button[type=submit] -- это более общепринято :) И добавил атрибут name = articleId

    $(function(){
        $('#form').submit(function(e) {        
            var $this = $(this);
            var data = {};
            $this.find('input').each(function(){
                var $el = $(this);
                var key = $el.attr('name');            
                if(key)
                    data[key] = $el.val();
            });
            $.post($this.attr('action'),data)
             .done(function(r){
                 console.log('good call back');
             })
             .fail(function(r){
                console.log('bad call back');
             });
            e.preventDefault();
            return false;
        });
    });

    Тут реализована автоматическая сборка полей формы в переменную data: данные группируются по data[input.name] = val. Адрес post-запроса из атрибута 'action' формы .Пример - jsfidle

    Если хотите реализовать в виде плагина - можно сделать нечто подобное:
    jQuery.fn.extend({
        myFormSubmit: function(o){
            var opts = {
                doneCb: function() {},
                failCb: function() {}
            };
            opts = $.extend(opts,o);
            return this.each(function(){
                $(this).submit(function(e) {        
                    var $this = $(this);
                    var data = {};
                    $this.find('input').each(function(){
                        var $el = $(this);
                        var key = $el.attr('name');            
                        if(key)
                            data[key] = $el.val();
                    });
                    $.post($this.attr('action'),data)
                     .done(opts.doneCb)
                     .fail(opts.failCb);
                    e.preventDefault();
                    return false;
                });
            });
        }
    });
    
    $(function(){
        $('#form').myFormSubmit({
            doneCb: function(r){
                console.log('good call back');
            },
            failCb: function(r){
                console.log('bad call back');
            }
        });
    });

    jQuery.fn.extend - добавляет новый метод в jq. Пример - jsfiddle

    PS я использовал свежую версию jQuery.
    Ответ написан
    2 комментария
  • Как загнать node на хостинг?

    Стартануть сервер можно сделав package.json на подобии того, что используется в angular-seed:
    {
        ...
        "scripts": {
            ...
            "start": "http-server -a localhost -p 8000 -c-1",
            ...
        }
        ...
    }


    Вот ссылка на пакет http-server.
    При такой настройке можно запустить сервер в консоли командой "npm start". А сам сервер Вам уже порекомендовали @zhak55 и @rock .
    Ответ написан
    Комментировать
  • Почему скрипт не рабтает?

    Потому что при нажатии кнопки выполнится только вот эта конструкция:
    function(){
        btn_status = 'номер_кнопки';
    }


    Чтобы все заработало, при нажатии на кнопку надо вызывать еще и код со свитчем
    switch(btn_status){
        // ..
    }


    Но мне крайне не нравится Ваша конструкция. Во-первых: если вы используете jQuery, то используйте его везде. Вместо:
    btn_3.onclick = function(){
        btn_status = '3';
    }

    Пишите:
    $(btn_3).click(function(){
        btn_status = '3';
    });


    Во-вторых: можно использовать this для смещения кнопки:
    $(btn_3).click(function(){
        btn_status = '3';
        $(this).css({
            marginLeft : '5px'
        });
    });
    Ответ написан
    Комментировать