ponepaste/assets/jquery.limitText.js
2021-07-26 17:42:43 -04:00

155 lines
No EOL
5.8 KiB
JavaScript

/* ========================================================================
* jquery.limitText.js v0.0.1
*
* ========================================================================
* Copyright 2015 Phillip Molaro
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ========================================================================
*
* Usage:
*
<textarea id="myTextArea" cols="120" rows="30" data-status-message="#status"></textarea>
<div id="status" class="text-right"></div>
<script type="text/javascript">
$(document).ready(function () {
$('#myTextArea').limitText();
});
</script>
*
* Options:
* @param limit (integer) - The cutoff character count for the field
* Default: 200
* @param warningLimit (integer) - The remaining character count to trigger class change
* Default: 10
* @param statusMessage (string) - A jQuery selector to id an existing status container DOM element
* If left empty, a default will be added after the element
* Default: ''
* @param counterClass (string) - Class to apply to the status area, and replaced on warning
* Default: 'text-primary' (Bootstrap helper class)
* @param warningClass (string) - Class applied to status area when warningLimit is reached.
* Replaces the counterClass on warning
* Default: 'text-danger' (Bootstrap helper class)
* @param containerElement (string) - DOM element to be inserted if statusMessage is undefined
* Default: '<div>'
* @param containerClass (string) - Class applied to the status container.
* Default: 'limit-text-status' (no definition)
*/
+function ($) {
'use strict';
/**
* LimitText Class Definition
*/
var LimitText = function (element, options) {
this.options = options;
this.$element = $(element);
// if an existing container is not defined, then a default will be created
this.$status = (this.options.statusMessage.length) ?
$(this.options.statusMessage) : $(this.options.containerElement);
// Add classes to the status container, and insert base text
this.$status
.addClass(this.options.containerClass + ' ' + this.options.counterClass)
.append('<small><strong>' +
this.options.limit + '</strong> characters remaining</small>');
// reference not available til we've appended the html snippet
this.$count = $('strong', this.$status);
// insert the default message container if one isn't already defined
if (!this.options.statusMessage.length) this.$element.after(this.$status);
// set our event handler and proxy it to properly set the context
this.$element.on('input.limitText.data-api propertychange.limitText.data-api', $.proxy(this.checkCount, this));
// and run initial check of current value
this.checkCount();
};
LimitText.VERSION = '0.0.1';
LimitText.NAME = 'limitText';
LimitText.DEFAULTS = {
limit: 200,
warningLimit: 10,
statusMessage: '',
// These two are Bootstrap text emphasis classes
// that you can override in the config, or roll
// your own of the same name
counterClass: 'text-primary',
warningClass: 'text-danger',
// The default container element is only used if an
// existing container (statusMessage) is not defined
containerElement: '<div>',
containerClass: 'limit-text-status'
};
LimitText.prototype.checkCount = function () {
var currVal = this.$element.val();
if (currVal.length > this.options.limit) {
// reset the currVal, so that it stays within the limit
currVal = currVal.substr(0, this.options.limit - 1);
this.$element.val(currVal);
}
var remaining = this.options.limit - currVal.length;
this.$count.html(remaining);
if (remaining <= this.options.warningLimit) {
this.$status.removeClass(this.options.counterClass).addClass(this.options.warningClass);
} else {
this.$status.removeClass(this.options.warningClass).addClass(this.options.counterClass);
}
};
LimitText.prototype.destroy = function () {
$.removeData(this.$element[0], 'limitText');
// remove the inserted status container
if (!this.options.statusMessage.length) {
this.$status.remove();
} else {
this.$status
.removeClass(
this.options.containerClass + ' ' +
this.options.counterClass + ' ' +
this.options.warningClass)
.empty();
}
this.$element.off('input.limitText.data-api propertychange.limitText.data-api');
this.$element = null;
};
// limitText Plugin Definition
function Plugin(option) {
return this.each(function () {
var $this = $(this),
data = $this.data('limitText'),
options = $.extend({}, LimitText.DEFAULTS, $this.data(), typeof option == 'object' && option);
if (!data) $this.data('limitText', (data = new LimitText(this, options)));
if (typeof option == 'string') data[option]();
});
}
var old = $.fn.limitText;
$.fn.limitText = Plugin;
$.fn.limitText.Constructor = LimitText;
// limitText No Conflict
$.fn.limitText.noConflict = function () {
$.fn.limitText = old;
return this;
};
}(jQuery);