jQuery实现微博式字符统计与本地存储功能详解

作者:小满时间:2026-10-29 19:07:24浏览:105

本文介绍如何使用jQuery开发字符统计插件,实时显示剩余字符数并限制输入。同时结合HTML5的localStorage技术,实现微博发送框内容的本地持久化存储,支持跨会话保存草稿,并提供旧版浏览器兼容方案。

随着移动设备和Web应用的普及,用户对网页或应用程序的体验要求日益提高。为了提升用户体验,开发者需要打造更加人性化的应用,因为用户更倾向于选择体验优良的平台。

以微博为代表的社交平台,良好的用户体验至关重要。

例如,在发布微博时,文本框会实时提示剩余字符数。这种人性化设计不仅帮助用户了解字数限制,也有效控制了输入长度。

开发中需牢记:凡是输入,必有限制;凡是输入,必须校验。

本文将详细介绍如何实现输入字符的实时提示功能,以及本地存储(localStorage)技术的应用。

jQuery字符统计插件实现

首先,以新浪微博发送框为例,介绍如何使用jQuery实现实时提示用户剩余字符数的功能。

新浪微博限制140个中文字符(相当于280个英文字符),同时包含空格等其他字符。在用户输入接近或达到限制时,良好的体验应通过不同颜色或加粗字体进行提示。

jQuery字符统计插件实现

图1新浪微博用户输入限制

字符数统计插件会在输入框后创建一个同级元素span,用于显示当前剩余字符数。当触发输入框的keyup、keydown和change事件时,实时修改span中的剩余字符数。如果剩余字符数接近“warning”阈值(接近零),则修改CSS样式以提示用户接近输入限制。

当剩余字符达到“warning”状态时,在span元素中添加相应的样式类;当剩余字符等于或大于输入限制时,添加相应的样式类提示用户已超出字符数限制。

通过字符数统计插件,页面中动态插入如下代码:


<!-- adds element dynamic -->
<span class="counter">140</span>

默认情况下,字符限制为140个。当可输入字符数少于等于25个时提示用户,当可输入字符数少于等于0时,提示用户字符数已超出限制。下面定义默认条件下的对象:


// The default limitation.
var defaults = {
 allowed: 140,
 warning: 25,
 css: 'counter',
 counterElement: 'span',
 cssWarning: 'warning',
 cssExceeded: 'exceeded',
 counterText: ''
};

上述代码定义了defaults对象,包含allowed、warning、css、cssWarning和cssExceeded等属性。通过修改defaults对象属性,可以方便地调整字符统计插件的行为。

  • Allowed:允许输入的字符数。
  • Warning:提示用户剩余字符数接近零的阈值。
  • Css:添加到counter元素的CSS样式类名。
  • cssWarning:警告提示样式。
  • cssExceeded:超出字符限制时的提示样式。

接下来,在字符统计插件中定义calculate()方法,用于计算当前剩余字符数。如果到达了警告范围,则在页面中增加样式类“warning”;当剩余字符数少于等于零时,在页面中增加“exceeded”样式。


/***
* Calculates the char
* @param obj
*/
function calculate(obj) {

 // Get the count.
 var count = getLength($(obj).val());
 var available = options.allowed - count;

 if (available <= options.warning && available >= 0) {
  $(obj).next().addClass(options.cssWarning);
 }
 else {
  $(obj).next().removeClass(options.cssWarning);
 }
 if (available < 0) {
  $(obj).next().addClass(options.cssExceeded);
 }
 else {
  $(obj).next().removeClass(options.cssExceeded);
 }
 $(obj).next().html(options.counterText + available);
}

此外,定义getLength()方法:当输入字符为中文时,totLen加1;如果是英文字符或数字,则totLen加0.5(默认允许输入140个中文字符)。


/**
* Get the length of char.
* @param str
* @return {Number}
*/
function getLength(str) {
 var totLen = 0;
 for (var i = 0; i < str.length; i++) {
  // If the char is Chinese.
  if (str.charCodeAt(i) > 256) {
   totLen += 1;
  }
  else {
   totLen += 0.5;
  }
 }
 return Math.floor(totLen);
}

在控件中绑定keyup()、keydown()和change()事件方法。当页面对象触发这些事件时,调用calculate()方法计算当前剩余字符数,并添加相应的CSS样式到页面中。


// Binds text area keyup, keydown and change event.
this.each(function() {
 $(this).after('<' + options.counterElement + ' class="' + options.css + '">' + options.counterText + '</' +
    options.counterElement + '>');
 calculate(this);
 $(this).keyup(function() { calculate(this), storeWeibo(this) });
 $(this).keydown(function() { calculate(this), storeWeibo(this) });
 $(this).change(function() { calculatea(this) });
});

Web Storage本地存储应用

其次,介绍Web Storage技术。许多用户注意到,如果在发微博时未发送内容,下次打开页面或重新打开浏览器,发送框中仍保存着未发送的微博。

实现这一功能的方法多样,例如可以使用Cookies、Session等技术。

随着HTML5规范的制定,W3C制定了网络存储(Web Storage)规范。它提供将数据存储在客户端的功能,直到Session过期(会话存储)或超出本地容量(本地存储)。相比传统的Cookies,Web Storage功能更强大、实现更简单且容量更大(大部分浏览器支持5M的本地存储)。

会话存储:它将数据保存在会话中,一旦关闭浏览器选项卡,会话中的数据将失效。

本地存储:当数据需要持久保存在客户端时,可使用本地存储(Local Storage)。它以key/value形式存储数据,即使关闭页面或浏览器后重新打开,数据依然存在。一个简单的应用是记录用户访问页面的次数。

jQuery字符统计插件实现

图2存储空间的对比

接下来,介绍如何使用本地存储保存用户数据。

localStorage提供了setItem()、getItem()、removeItem()、key()和clear()共5个方法,以及一个length属性,具体定义如下:


// Storage definition.
interface Storage {
 readonly attribute unsigned long length;
 DOMString key(in unsigned long index);
 getter any getItem(in DOMString key);
 setter creator void setItem(in DOMString key, in any value);
 deleter void removeItem(in DOMString key);
 void clear();
};

在现代浏览器中使用本地存储非常简单,只需在Javascript代码中直接调用localStorage对象的方法或属性即可。


// stores the username 'jkrush',
// then get the username.
localStorage.setItem('username', 'jkrush');
var userName = localStorage.getItem('username');

上述示例通过调用localStorage的setItem()和getItem()方法实现数据的存储和获取。由于localStorage以Key/Value形式存储数据,存储时需要提供Key/Value值,然后通过getItem()方法获取存储在Key中的值。

由于本地存储以Key/Value形式进行存储,存储字符串类型数据很容易,但若需存储对象类型,本地存储则显得力不从心。

假设将一个student对象存储到localStorage中,具体代码如下:


// Defines a student object.
var student = {
 name: 'JK_Rush',
 age: '26',
 sex: 'male'
};

// Prints student object
console.log(student);

// Stores student object.
// Gets student object again.
localStorage.setItem('student', student);
console.log(localStorage.getItem('student'));

jQuery字符统计插件实现

图3 localStorage存储对象

通过上述示例,注意到在Firebug的控制台中输出的并不是真正的student对象,而是student对象的信息字符串。

那么如何把对象存储到localStorage中呢?可以将对象序列化为JSON数据进行存储,最后通过反序列化将JSON数据转换为对象。具体实现如下:


// Defines a student object.
var student = {
 name: 'JK_Rush',
 age: '26',
 sex: 'male'
};

console.log(student);

// Serializes the object to json string.
localStorage.setItem('student', JSON.stringify(student));

// Deserializes the json string to object.
console.log(JSON.parse(localStorage.getItem('student')));

上述示例中,在存储student对象之前,使用JSON的stringify()方法将对象序列化为JSON字符串,然后存储到localStorage中;若需获取student对象,只需使用JSON的parse()方法将字符串反序列化为对象。

jQuery字符统计插件实现

图4 localStorage存储对象

插件与本地存储结合开发

上述实现了将student对象转换为JSON格式字符串并存储到localStorage中。接下来,在前面的例子中添加localStorage功能,具体代码如下:


/**
* Store user data into local storage.
* @param obj
*/
function storeWeibo(obj) {

 // Checks the browser supports local storage or not.
 if (window.localStorage) {
  localStorage.setItem('publisherTop_word', $(obj).val());
 }
 else {

  // For instance, ie 6 and 7 do not support local storage,
  // so we need to provider other way.
  window.localStorage = {
   getItem: function(sKey) {
    if (!sKey || !this.hasOwnProperty(sKey)) { return null; }
    return unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g,
       "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"), "$1"));
   },
   key: function(nKeyId) {
    return unescape(document.cookie.replace(/\s*\=(?:.(?!;))*$/, "").split(/\s*\=(?:[^;](?!;))*[^;]?;\s*/)[nKeyId]);
   },
   setItem: function(sKey, sValue) {
    if (!sKey) { return; }
    document.cookie = escape(sKey) + "=" + escape(sValue) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
    this.length = document.cookie.match(/\=/g).length;
   },
   length: 0,
   removeItem: function(sKey) {
    if (!sKey || !this.hasOwnProperty(sKey)) { return; }
    document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
    this.length--;
   },
   hasOwnProperty: function(sKey) {
    return (new RegExp("(?:^|;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
   }
  };
  window.localStorage.length = (document.cookie.match(/\=/g) || window.localStorage).length;
 }
}

现在在自定义字符统计插件(jquery.charcount.js)中添加storeWeibo()方法。首先判断当前浏览器是否支持localStorage,主流浏览器如Chrome、Firefox、Opera、Safari以及IE 8都支持本地存储(localStorage)和会话存储(sessionStorage)。

如果浏览器支持本地存储,可直接调用localStorage的setItem()方法,将textarea中的数据保存起来;当再次打开页面或浏览器时,首先检查localStorage是否存储了相应数据,若有,则将数据取出并显示到textarea中。

但由于部分用户可能使用旧版浏览器(如IE6和IE7),考虑到兼容性,必须提供支持旧版浏览器的方案。

已知旧版浏览器(如IE6和IE7)支持Cookies的持久化存储方式,因此使用Cookies实现getItem()、setItem()和removeItem()等方法。

jQuery字符统计插件实现

jQuery字符统计插件实现

图5 主流浏览器支持Web Storage

现在,已完成字符统计插件jquery.charcount.js的开发。由于时间关系,发送框的界面设计已就绪,具体HTML代码如下:


<!-- From design-->
<body>
 <form id="form" method="post">
 <h2>
  有什么新鲜事想告诉大家?</h2>
 <div>
  <label class="mali_oglas_kategorija" for="message">
   有什么新鲜事想告诉大家?<b></b></label>
  <textarea id="weiboMsg" placeholder="请Fun享"></textarea>
  <span class="counter"></span>
  <input onclick="SaveCache()" type="submit" value="发布">
 </div>
 </form>
</body>

jQuery字符统计插件实现

图6 发送框界面设计

接下来,在页面代码中引用jQuery库和自定义字符统计插件jquery.charcount.js,具体代码如下:


<!-- Adds Javascript reference -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript" src="./js/jquery.charcount.js"></script>

上述直接引用了Google提供的jQuery库,当然也可将jQuery库下载到本地并引入到项目中。接下来在HTML页面中添加调用字符统计插件的代码,具体代码如下:


 <!-- When document ready invokes charCount function-->
<script type="text/javascript">
 $(document).ready(function () {
  // Uses default setting.
  $("#weiboMsg").charCount();
 });
</script>

上述完成了在页面代码中调用字符统计插件。每当在文本框中输入字符时,都会实时显示剩余的字符数,且输入的字符都会保存到localStorage中。

接下来,分别在Chrome和Firefox中查看保存在localStorage中的数据。

首先,打开Chrome的“开发者工具”(Ctrl+Shift+I),然后选择“Resources”选项,此时即可看到保存在localStorage中的数据。

jQuery字符统计插件实现

图7 Chrome的本地存储

同样,打开Firefox的“Firebug”(F12),然后选择“DOM”选项,查找window对象下的localStorage,即可看到保存在localStorage中的数据。

jQuery字符统计插件实现

图8 Firefox的本地存储

已知IE8也支持localStorage对象,但在测试中发现IE8中一直提示localStorage对象未定义。后经Stackoverflow查询得知,在IE8中,localStorage对象依赖于域名,因此需要运行在Web服务器中才能成功保存数据到localStorage中。

注意到微博通过本地存储技术,保存用户在发送框中的数据。一旦数据发送,就清空本地存储;反之,则保存用户的输入。

本文通过微博发送框例子,介绍了如何定义jQuery字符统计插件和本地存储技术。首先,限制用户输入是必要的,但如何有效且人性化地提示用户输入限制?这里通过定义一个jQuery插件,动态统计剩余字符数,希望对大家学习javascript程序设计有所启发。

作者最新文章