* 该方法用于截取字符串,根据字符和汉语的占位符有对应不同的处理
*
* eg: var titleValue = '1112322';
var showValue = oleSubstring(titleValue, 4);
if (titleValue == showValue) {
titleValue = '';
}
* @param titleValue 被截取的字符串
* @param splitLength 需要截取的长度
* @returns 截取后的字符串
*/
function oleSubstring(titleValue, splitLength) {
var str_length = 0;
var showValue = new String();
var titleValueLength = titleValue.length;
for ( var i = 0; i < titleValueLength; i++) {
var charValue = titleValue.charAt(i);
str_length++;
if (escape(charValue).length > 4) {
// 中文字符的长度经编码之后大于4
str_length++;
}
if (str_length > splitLength) {
break;
}
showValue = showValue.concat(charValue);
}
if (str_length > splitLength) {
showValue = showValue.concat("...");
}
return showValue;
}
由于javascript是unicode编码的,所有的字符对于它来说一个就是一个,但是后台程序不是,通常在后台程序中一个中文是占两个字节的,这就导致了前后端校验长度不一致,这个问题可以通过正则来解决。
附赠另一小则技巧:
有时候为了美观,不影响布局和界面,会以一些文案进行截字,但是中文的宽度和英文的宽度不一样,如果按照英文标准来截中文的,或者按中文标准截英文的,显然会忽长忽短,特别是昵称这类容易既有中文又有英文的东西,同样我们可以用上面的思路
这里我们认为一个中文字符是两个英文字符的宽度,如果你是完美主义者,应该想到j和w,m的宽度是不一样的,w和m以及大写的部分字母和中文的宽度是一致的,这个函数的正则还有相当大的改进空间,同时也可以指定截字的起始位置。
function beautySub( str, len) {
var reg = /[\u4e00-\u9fa5]/g, //专业匹配中文
slice = str.substring(0,len),
/**其实是一种利用符号进行的类型转换,转换成数字类型
~~true == 1
~~false == 0
~~"" == 0
~~[] == 0
~~undefined ==0
~~!undefined == 1
~~null == 0
~~!null == 1
整数的操作
JavaScript中是没有整型概念的,但利用好位操作符可以轻松处理,同时获得效率上的提升。
|0和~~是很好的一个例子,使用这两者可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快。在处理像素及动画位移等效果的时候会很有用。性能比较见此。
var foo = (12.4 / 4.13) | 0;//结果为3
var bar = ~~(12.4 / 4.13);//结果为3
顺便说句,!!将一个值方便快速转化为布尔值 !!window===true 。
*/
realen = len - ( ~~( slice.match(reg) && slice.match(reg).length ) );
return slice.substring(0, realen ? realen : 1);
}