这两个小问题一是关于实现Ctrl+<回车>发送消息,另外一个是关于用javascript注册带参数的事件。
网上有一些例子,中文的例子基本上是只能用于IE浏览器的,细心就会发现,很多论坛也只能是IE浏览器可以Ctrl+<回车>发表帖子,Firefox不能用。其实并不是Firefox、Opera之类的浏览器没有这个功能,而是最早写这个脚本的人没有考虑其他浏览器,然后这段代码炒来炒去炒到多浏览器的时代就残废成现在这个样子了。我们来看一看这段代码,这是一个可以实现多浏览器快捷键的例子
<html><head><script>
function isAccessKey(e){
var keynum;
if(window.event) // IE
{
keynum = e.keyCode;
}
else if(e.which) // Netscape/Firefox/Opera
{
keynum = e.which;
}
if(e.ctrlKey && keynum == 13)
alert("你按下了Ctrl+<回车>");
}
</script></head><body>
<input type="text" name="name" size="20" value="" onkeydown="isAccessKey(event);">
</body></html>
其中无非是针对浏览器对window.event的支持性做了个判断,根据不同的支持性使用不同的方法获取按键值,很简单的分段函数就能很好的解决这个问题,对非IE浏览器一刀切的时代已经过去了。
另一个问题:
在一个项目中很可能作html代码的人和做javascrip以及CSS的人并不是一个,还看上面的那个例子,input那行很肯能会写成<input id="iptId">,然后CSS开发人员会写个#iptId{width:50px;font-size:10pt}之类的,javascipt程序员对iptId注册onkeydown事件。我恰恰在这里遇见了问题,常用的注册事件的方式有四种:
1.<button onclick="alert('aaa')"></button>
2.element.onclick=function(){}
3.element.onclick=new Function()
4.element.attachEvent("onclick",function(){})
1不是风格,2、3、4在IE中不能注册带参数的事件(至少我没研究出来),于是我想了个万能的办法,就是不到万不得已不能用的办法——修改并刷新input标记的outerHTML,程序是这样的:
document.getElementById("iptId").setAttribute("onkeydown","isAccessKey(event)");
document.getElementById("iptId").outerHTML = document.getElementById("iptId").outerHTML;
先用DOM的方法对input加一个onkeydown="isAccessKey(event)"的属性,然后刷新。我的测试是在IE7(我没ie6)、firefox下都正常使用,效果不错。不过我觉得这种方法并不好,可以算是一个另类的路子,还是等哪天我找到正统的方式再介绍给大家吧。
没有评论:
发表评论