我该如何使用jQuery创建类似Twitter "剩余字符" 的倒数计时器?同时还需要将输入限制在文本区域内。
创建一个 span
和 textarea
并为它们分别设置唯一的选择器(使用 ID 或 class),例如:
<textarea class="message" rows="2" cols="30"></textarea>
<span class="countdown"></span>
然后创建一个更新函数,如下所示:
function updateCountdown() {
// 140 is the max message length
var remaining = 140 - jQuery('.message').val().length;
jQuery('.countdown').text(remaining + ' characters remaining.');
}
并使该函数在页面加载时运行,以及在消息更改时运行:
jQuery(document).ready(function($) {
updateCountdown();
$('.message').change(updateCountdown);
$('.message').keyup(updateCountdown);
});
.live()
已被弃用,请使用 .on()
来绑定事件处理程序:$('.message').on('input', function() {...})
。 - Quentin我成功地使用了Aaron Russell的 simply countable jQuery插件,虽然如果我是作者的话,我会稍微改进一下(自动计数器div的创建,使用"data-maxlength"属性代替插件选项等)。
简单用法:
$('#my_textarea').simplyCountable();
高级用法:
$('#my_textarea').simplyCountable({
counter: '#counter',
countable: 'characters',
maxCount: 140,
strictMax: false,
countDirection: 'down',
safeClass: 'safe',
overClass: 'over',
thousandSeparator: ','
});
对于这样简单的任务,使用jQuery、Mootools或类似库实在是自杀行为,除非你已经在使用它们进行其他操作。
以下是一个简单的JavaScript函数:
function limitTextCount(limitField_id, limitCount_id, limitNum)
{
var limitField = document.getElementById(limitField_id);
var limitCount = document.getElementById(limitCount_id);
var fieldLEN = limitField.value.length;
if (fieldLEN > limitNum)
{
limitField.value = limitField.value.substring(0, limitNum);
}
else
{
limitCount.innerHTML = (limitNum - fieldLEN) + ' charachter(s) to go.';
}
}
<input type="text" value="" name="title" id="title" maxlength="100" onkeyup="limitTextCount('title', 'divcount', 100);" onkeydown="limitTextCount('title', 'divcount', 100);">
<br>
<div id="divcount">100 charachter(s) to go..</div>
function pluralize(count, word){
if (count == 1 || count == -1){
return String(count) + ' ' + word;
}else{
return String(count) + ' ' + word + 's';
}
}
function updateCountdown() {
// 140 is the max message length
var remaining = 140 - jQuery('#micropost_content').val().length;
jQuery('.countdown').text(pluralize(remaining,'character') + ' remaining');
}
...
我更新了@Brian McKenna的版本,以支持带有maxlength属性的多个文本区域/文本框。
演示在这里
<textarea class="message" rows="2" cols="30" maxlength="60"></textarea>
<span class="countdown"></span>
<textarea class="message" rows="2" cols="30" maxlength="100"></textarea>
<span class="countdown"></span>
jQuery(document).ready(function($) {
updateCountdownAll();
$('.message').live('input', updateCountdown);
});
function updateCountdownAll() {
$('.message').each(function () {
updateCountdown(this);
});
}
function updateCountdown(e) {
var currentElement;
if (e.target) {
currentElement = e.target;
}
else {
currentElement = e;
}
var maxLengh = $(currentElement).attr('maxlength');
var remaining = maxLengh - $(currentElement).val().length;
$(currentElement).nextAll('.countdown:first').text(remaining + ' character(s) remaining.');
}
function addCharacterCount(input) {
var $input = $(input),
maxLength = $input.data('maxlength'),
remaining = maxLength - $input.val().length;
$('<label><input type="text" id="' + input.id + '-counter" size="3" value="' + remaining + '" /> Characters remaining (max ' + maxLength + ')</label>').insertAfter(input);
}
$('form .limited').each(function () {
addCharacterCount(this);
});
$('form .limited').live('keyup', function() {
var $element = $(this),
maxLength = $element.data('maxlength');
$("#" + this.id + "-counter").val(maxLength - $element.val().length);
});
<form>
<!-- remember to markup your forms properly using labels! -->
<label for="textareaChars">No more than 100 characters</label>
<textarea id="textareaChars" maxlength="100"></textarea>
<p><span id="chars">100</span> characters remaining</p>
</form>
$( document ).ready(function() {
var maxLength = 100;
$('textarea').keyup(function() {
var length = $(this).val().length;
var length = maxLength-length;
$('#chars').text(length);
});
});
function charactersRemaining(elementID, messageElementID, maxCharacters)
{
var remaining = maxCharacters - $('#' + elementID).val().length;
$('#' + messageElementID).text(remaining + ' characters remaining.');
}
那么我可以在整个应用程序中重复使用该函数(例如,如果我有以下HTML):
<textarea class="form-control" asp-for="Comments" rows="3"></textarea>
<span id="commentsCharsRemaining" class="text-primary"></span>
只需添加这两个 jQuery 语句即可使其工作:
$('#Comments').change(function () {
charactersRemaining('Comments', 'commentsCharsRemaining', 2000)
});
$('#Comments').keyup(function () {
charactersRemaining('Comments', 'commentsCharsRemaining', 2000)
});
使用jQuery
将此文件保存为jquery.textlimiter.js
(function($) {
$.fn.extend( {
limiter: function(limit, elem) {
$(this).on("keyup focus", function() {
setCount(this, elem);
});
function setCount(src, elem) {
var chars = src.value.length;
if (chars > limit) {
src.value = src.value.substr(0, limit);
chars = limit;
}
elem.html( limit - chars );
}
setCount($(this)[0], elem);
}
});
})(jQuery);
用法
<textarea id="text" maxlength="100" cols="50" rows="5" placeholder="Enter Text"></textarea>
<div id="chars">100</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
<script src="path/to/jquery.textlimiter.js"></script>
<script>
$(document).ready( function() {
var elem = $("#chars");
$("#text").limiter(100, elem);
});
</script>