xbase-2.x-dev/js/libraries/jquery.showmore.js

js/libraries/jquery.showmore.js
/**
 * Example:
 *
 * <div class="my-block">
 *   <div class="my-block__content">...</div>
 * </div>
 *
 * <script>
 *   $('.my-block').showMore({
 *     contentElement: $('.my-block__content'),
 *   });
 * </script>
 *
 * <style>
 *   .my-block__content {
 *     max-height: 100px;
 *     overflow: hidden;
 *   }
 * </style>
 */
;(function($, window, document, undefined) {

  'use strict';

  var pluginName = 'showMore';
  var defaults = {
    contentElement: null,
    maxHeightElement: null,
    linkElement: null,
    linkTextOpen: Drupal.t('Open'),
    linkTextClose: Drupal.t('Close'),
    minDifference: 5,
  };

  function Plugin (element, options) {
    var plugin = this;
    plugin.element = element;
    plugin.settings = $.extend({}, defaults, options);
    plugin._defaults = defaults;
    plugin.init();
  }

  $.extend(Plugin.prototype, {
    /**
     * Init.
     */
    init: function () {
      var plugin = this;
      var $element = $(plugin.element);
      var settings = plugin.settings;

      $element.addClass('show-more');

      // Process content
      if (!settings.contentElement) {
        settings.contentElement = $element.find('.show-more__content');

        if (settings.contentElement.length == 0) {
          settings.contentElement = $('<div class="show-more__content" />');
          $element.wrapInner(settings.contentElement);
        }
      }
      else {
        settings.contentElement = $(settings.contentElement);
        settings.contentElement.addClass('show-more__content');
      }

      // Process link
      if (!settings.linkElement) {
        settings.linkElement = $element.find('.show-more__link');

        if (settings.linkElement.length == 0) {
          settings.linkElement = $('<a class="show-more__link" href="#">' + settings.linkTextOpen + '</a>');
          settings.linkElement.appendTo($element);
        }
      }
      else {
        settings.linkElement = $(settings.linkElement);
        settings.linkElement.addClass('show-more__link');
      }
      settings.linkTextOpen = settings.linkElement.text();

      if (!settings.maxHeightElement) {
        if (parseInt($element.css('max-height'), 10) > 1) {
          settings.maxHeightElement = $element;
        }
        else {
          settings.maxHeightElement = settings.contentElement;
        }
      }

      // Click handler
      settings.linkElement.on('click', function (event) {
        var $link = $(this);

        // Open
        if (!$element.hasClass('show-more--open')) {
          $element.addClass('show-more--open');
          $link.html(settings.linkTextClose);
        }
        // Close
        else {
          $element.removeClass('show-more--open');
          $link.html(settings.linkTextOpen);
        }

        event.preventDefault();
      });

      var resizeObserver = new ResizeObserver(function (entries) {
        plugin.refresh();
      });
      resizeObserver.observe(settings.maxHeightElement[0]);
    },

    /**
     * Refresh.
     */
    refresh: function () {
      var plugin = this;
      var $element = $(plugin.element);
      var settings = plugin.settings;

      $element.removeClass('show-more--active show-more--inactive');

      var maxHeight = parseInt(settings.maxHeightElement.css('max-height'), 10);
      var realHeight = settings.maxHeightElement[0].scrollHeight;

      if (maxHeight <= 1 || maxHeight + settings.minDifference >= realHeight) {
        $element.addClass('show-more--inactive');
      }
      else {
        $element.addClass('show-more--active');
      }
    },
  });

  $.fn[pluginName] = function (options) {
    return this.each(function () {
      if (!$.data(this, pluginName + 'Plugin')) {
        $.data(this, pluginName + 'Plugin', new Plugin(this, options));
      }
    });
  };

})(jQuery, window, document);

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc