以下写得很零碎,纯粹是备忘
1,
(1)如果用keydown,用中文输入法时在输入框里输汉语拼音的字母就会有感知,故只能用keyup
(2)后退问题.
如何区分是在中文输入法的输入框里的后退,还是自动完成录入框里的后退,二者的处理是不一样的。
(3)确认键
光标在form里时,按确认键浏览器会自动提交。而我想要的是一按确认键,自动录入选中的那一项。
如何在按确认键时不让form截获这个事件。要做成通用的,而不是在每一个form里写死。
(4)调试时慎用alert
alert然后确定时会自动执行blur,会影响的原来程序的执行次序
2,插件
(1)
http://code.google.com/p/jqac/ 不错
(2)http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete 很好很强大
(3)
http://www.dyve.net/jquery/?autocomplete 有遮盖select box功能
(4)http://docs.jquery.com/Plugins/AutoComplete
(5)http://mabp.kiev.ua/content/2008/04/08/autocomplete_by_your_own_hands
(6)
http://www.pengoworks.com/workshop/jquery/autocomplete.htm (7)http://huacn.blogbus.com/logs/19643985.html
测试鼠标事件和键盘事件在IE和FF下的执行次序,同时测试在中文输入法下的执行次序
<script>
function $(id){return document.getElementById(id);}
</script>
<input onmousedown="$('d').value=$('d').value+'down'" onmouseup="$('d').value=$('d').value+'up'"
onclick="$('d').value=$('d').value+'click'" ><br>
<input onkeydown="$('d').value=$('d').value+'down';" onkeyup="$('d').value=$('d').value+'up-'"
onkeypress="$('d').value=$('d').value+'press';"><br><br><br><br>
<input id='d' size=100>
你会发现,在非中文输入法模式下,IE和FF大体上按下面的顺序
(1)对key 来说 :
keydown-->keypress-->keyup如果持续按住键位,keydown会持续执行;
如果要阻止按键的默认行为,必须使用keypress(用return false),但按backspace时不行,因为backspace时只执行keydown和keyup,keyup之前回退的效果已经生效了。
(2)对mouse来说 :
mousedown-->mouseup-->click ,在IE下如果在与按下鼠标的相同元素上松开则产生click事件,
如果松开时已经离开最初按下时的元素了,则不会产生click事件;但据我观察FF下不是这样,FF下无论鼠标是否在最初的元素上松开,都会产生click事件。
在中文输入法模式下:
(1)FF
其中downup-up-是输入法切换时的键盘事件
输入第一个字母时产生down-press事件,然后输入任何字母都不会产生键盘事件, 只有按确认输入的键了,例如按space或是1,才会执行up事件,见右图。
也就是说录入一次中文时,不管中间过程怎么样,整个的键盘事件只有3个:down-press-up
(注:以上说的键盘事件都是指发生在input上的)
2,IE
其中downup-up-也是输入法切换时的键盘事件
然后在输入法框里的所有按键都产生一对downup事件,包括回退和确认都是。
无论光标在input还是在输入法框按回退,都是down-up
用style.imeMode好像无法得到当前text的输入法模式
(http://topic.csdn.net/t/20040908/13/3351801.html)
http://www.hihiyou.com/?p=5
http://realazy.org/blog/2007/10/31/solution-of-keyup-failing-when-ime-is-on/
http://topic.csdn.net/t/20040714/21/3175529.html
http://www.javaeye.com/topic/191555
另:IE中onpropertychange时要用event.propertyName == "value"
document.getElementById('tt').attachEvent('onpropertychange',function(e){
for(var item in e){
alert(item+":"+e[item]);//遍历可看到propertyName
}
});
判断表单里的元素的值有没有发生变化:
<script>
jQuery(document).ready(function(){
var inputarr =document.getElementsByTagName("INPUT");//TEXTAREA,SELECT等都可以这样用
for(var i=0;i<inputarr.length;i++){
inputarr[i].attachEvent('onpropertychange',function(e){
if(e.propertyName!='value')return; //不是value改变不执行后面的操作
else{ischanged=true}
});
}
});
</script>
奇怪的是先jQuery,再each,再用$(this).get(0).attachEvent("onpropertychange",fn); 好像不可以
还有
$("textarea").bind('propertychange',function(e) {
e.preventDefault();
// Your code here
});好像也不行