与之相关的链接:http://blog.csdn.net/lgg201/archive/2010/05/28/5630392.aspxhttp://blog.csdn.net/lgg201/archive/2010/05/28/5629526.aspx
1. $('#diary_title').bind('keydown', function(event) {
2. if($(this).val().len() >= 50) $(this).attr('maxLength', $(this).val().length);
3. }).bind('input', function(event) {
4. $(this).val($(this).val().chinesesubstr(0, 50));
5. }).bind('propertychange', function(event) {
6. $(this).val($(this).val().chinesesubstr(0, 50));
7. });
对字符串扩展, 并使用了上面代码做了input的长度限制之后, 运行一直良好, 直到今天测试提到IE7下输入框键一直按下输入导致的Stack overflow at line xxx的错误...
本来以为是自己些的截取字符串方法造成的溢出, 结果不是, 不过所幸找到一个原来字符串截取的bug, 以下是修正后的汉字截取
/**
* 扩展了String的chinesesubstr方法, 用于非ascii的字符截取
* @param {} begin 开始字符数
* @param {} num 截取的字符数
* @return {}
*/
String.prototype.chinesesubstr = (function(begin, num) {
var ascRegexp = /[^\x00-\xFF]/g, i = 0;
var chs = this.toCharArray();
while(i++ < begin) (ascRegexp.test(this.charAt(i)) && begin --);
i = begin;
var end = begin + num;
while(i++ < end && i < this.length) (ascRegexp.test(this.charAt(i)) && end --);
return this.substring(begin, end);
});
万般无奈, 看到IE7响应的是propertychange事件, 就在该事件中增加了alert, 发现的问题是, 输入或点击等操作, 只要稍微碰触到该元素, 就会导致多次alert, 我们知道, 其实alert是modal的, 也就是它弹出来之后, 我们对浏览器是无法操作的, 因此, 就猜测propertychange在IE7是异步响应的, 因此, 在propertychange事件的处理中把多余的调用屏蔽了(propertychange对我来说, 不需要那么频繁的响应, 一个输入动作一次足以), 如下:$('.selector').bind('input', function(event) {
if($.syncProcessSign) return ;
$.syncProcessSign = true;
if($(this).val().len() >= 60) $(this).val($(this).val().chinesesubstr(0, 60));
$.syncProcessSign = false;
}).bind('propertychange', function(event) {
if($.syncProcessSign) return ;
$.syncProcessSign = true;
if($(this).val().len() >= 60) $(this).val($(this).val().chinesesubstr(0, 60));
$.syncProcessSign = false;
})增加一个全局的同步信号, 如果正在处理, 就直接返回.....果然, 问题解决了......
依然疑惑的是IE7中, propertychange事件的响应究竟是因为异步还是因为bug导致一个动作引发多次响应.期待高手解答中.
1. $('#diary_title').bind('keydown', function(event) {
2. if($(this).val().len() >= 50) $(this).attr('maxLength', $(this).val().length);
3. }).bind('input', function(event) {
4. $(this).val($(this).val().chinesesubstr(0, 50));
5. }).bind('propertychange', function(event) {
6. $(this).val($(this).val().chinesesubstr(0, 50));
7. });
对字符串扩展, 并使用了上面代码做了input的长度限制之后, 运行一直良好, 直到今天测试提到IE7下输入框键一直按下输入导致的Stack overflow at line xxx的错误...
本来以为是自己些的截取字符串方法造成的溢出, 结果不是, 不过所幸找到一个原来字符串截取的bug, 以下是修正后的汉字截取
/**
* 扩展了String的chinesesubstr方法, 用于非ascii的字符截取
* @param {} begin 开始字符数
* @param {} num 截取的字符数
* @return {}
*/
String.prototype.chinesesubstr = (function(begin, num) {
var ascRegexp = /[^\x00-\xFF]/g, i = 0;
var chs = this.toCharArray();
while(i++ < begin) (ascRegexp.test(this.charAt(i)) && begin --);
i = begin;
var end = begin + num;
while(i++ < end && i < this.length) (ascRegexp.test(this.charAt(i)) && end --);
return this.substring(begin, end);
});
万般无奈, 看到IE7响应的是propertychange事件, 就在该事件中增加了alert, 发现的问题是, 输入或点击等操作, 只要稍微碰触到该元素, 就会导致多次alert, 我们知道, 其实alert是modal的, 也就是它弹出来之后, 我们对浏览器是无法操作的, 因此, 就猜测propertychange在IE7是异步响应的, 因此, 在propertychange事件的处理中把多余的调用屏蔽了(propertychange对我来说, 不需要那么频繁的响应, 一个输入动作一次足以), 如下:$('.selector').bind('input', function(event) {
if($.syncProcessSign) return ;
$.syncProcessSign = true;
if($(this).val().len() >= 60) $(this).val($(this).val().chinesesubstr(0, 60));
$.syncProcessSign = false;
}).bind('propertychange', function(event) {
if($.syncProcessSign) return ;
$.syncProcessSign = true;
if($(this).val().len() >= 60) $(this).val($(this).val().chinesesubstr(0, 60));
$.syncProcessSign = false;
})增加一个全局的同步信号, 如果正在处理, 就直接返回.....果然, 问题解决了......
依然疑惑的是IE7中, propertychange事件的响应究竟是因为异步还是因为bug导致一个动作引发多次响应.期待高手解答中.
解决方案 »
- jquery autoComplete 怎样在autocomplete里显示html代码
- 新手问个问题
- 这个数据检查怎么写?递归把头搞晕了,请高手解救,谢谢!
- JavaScript的重定义方法的问题
- 请教如何用javascript实现这个页面上的功能,谢谢!
- 很简单,就是不懂。一个获取函数值的问题
- 急!!在线等待!期盼高手!!页面的跳转的问题!!!!!!!!!!!
- 帮一个小妹要一份简单的个人网站的源码(学校期末考试)?谢谢!
- 怎么能在.js文件中输入繁体中文呢??帮我看看。。
- 请问如知道<textarea里面的文字有多少行了?并且,每一个后加入一个“|”,请问如何实现,我想java高手应该没有问题吧。代码如下。
- 关于store 数据的保存?
- 页面rewrite报JS错误
你看一下就明白,只要HTML的改变就会触发该事件多次
event.propertyName
比如改变SELECT的 value
就会触发两次
event.propertyName分别为selectedIndex和 value
我是在input[type=text]上绑的这个事件, 在点击inpu的时候, 也会触发两次
包括设置它自己的时候document.getElementById(id).onpropertychange = function(){
alert("onpropertychange");
}
上面这句是绑定事件,而此时也同时触发了该事件
你的FF是什么版本我在 FF和Chrome下均不会相应onpropertychange,如果真的相应了多次,自己看下event对象的propertyName不就都明白了
没有明白过来代码逻辑问题出在哪里.....可以说明吗???不然看这帖的岂不都被我误导了...另外, 如果不使用propertychange, 在IE7下怎么做这个需求? change肯定不可以, input又貌似不支持...Thank in advance.
keyup的问题在于用户按住按键不松开会出好多, 这个时候如果再截会有闪烁, 我家测试专测这种东西