Создание jquery функции

274
07 февраля 2018, 14:36

Всем привет. Есть следующая функция:

function changeCount(current, next, selector) {
    $(function () {                     
        $({numberValue: current}).animate({numberValue: next}, { 
            duration: 500, 
            easing: "linear", 
            step: function(val) {  
                $(selector).html(Math.ceil(val)); 
            } 
        });
    }); 
}

Действие очень простое - анимация смены цифр. Вопрос: как ее преобразовать в:

(function( $ ){
  $.fn.changeNumbers = function(next) {
  };
})(jQuery);

Т.е. чтобы в коде к ней можно было обращаться по $(selector).changeNumbers(current, next)

Сделал такое:

(function( $ ){
      $.fn.changeNumbers = function(next) {
          $({numberValue: this.text()}).animate({numberValue: next}, { 
            duration: 500, 
            easing: "linear", 
            step: function(val) {  
                $(this).html(Math.ceil(val)); 
            } 
        });
      };
    })(jQuery);

Но выдает ошибку Uncaught TypeError: Cannot read property 'createDocumentFragment' of undefined в строке $(this).html(Math.ceil(val));

Не до конца понимаю контекст this в создании функций, первый раз делаю что-то свое по jquery. Заранее спасибо за помощь!

Answer 1

В обработчике step this указывает не на исходный элемент, а на сконструированный объект {numberValue: this.text()}

Вам нужно перед запуском animate сохранить this в локальную переменную и в обработчике step обращаться к этой переменной

И еще, в jQuery принято строить цепочки вызовов. Поэтому будет здорово, если Вы вернете переданный this в функцию changeNumbers обратно

(function($) { 
  $.fn.changeNumbers = function(next) { 
    var obj = this; 
    $({numberValue: this.text()}).animate({numberValue: next}, { 
      duration: 500, 
      easing: "linear", 
      step: function(val) { 
        obj.html(Math.ceil(val)); 
      } 
    }); 
    return this; 
  }; 
})(jQuery); 
 
jQuery(function($) { 
  $('#btn').click(function() { 
    $('#num').text(50).changeNumbers(100).css({"background-color": "yellow"}); 
  }); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="num">50</div> 
<button id="btn">Go</button>

READ ALSO
Почему Webpack не собирает font-awesome?

Почему Webpack не собирает font-awesome?

Использую популярный в гайдах для новичков метод импорта стилей в приложение:

226
Почему не добавляет новую строку?

Почему не добавляет новую строку?

Привет, есть такой вот код, но когда в консоли прописываешь addTask('Hello, World!') для добавления нового пункта оно высвечивает ошибку, что это пустая...

207
Можно ли задать .serialize() параметры?

Можно ли задать .serialize() параметры?

Есть форма с чекбоксами, на нее подвязан serialize(), который хватает соответственно атрибуты name и valueПолучается: checkbox=1&checkbox=2

182