这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
而在 FireFox 中却没有这样的对象,如果有函数嵌套调用,需要不停的向下传递 Event,例如下面的场景。
在 IE 下 JavaScript 中可以在任何地方使用全局的 window.event 来取得本次 JavaScript 被触发的 Event,从而取得 KeyCode,EventSourceElement 等对象。
- <div style="background-color:Red; width:300px; height:300px;" onclick="Test(event,this);" id="panel"></div>
- function Test(event,dom){
- Test1(event);
- }
- function Test1(event){
- Test2(event);
- }
- function Test2(event){
- alert(event.target.id);
- }
在 Test2 方法中需要使用 event,就需要写成这样。如果在某种场景下,比如添加新功能,需要修改原来的 Test2 方法,需要访问 event 对象,而原来 Test2 方法的签名是 Test2(),没有参数 event,这时需要修改 Test2() 为 Test2(event) 十分的不美观,虽然 JavaScript 这样的修改,是方法的重载,但是也破坏了原来的方法签名。 在 FireFox 中是否有 window.event 这样的全局变量来获取 event? 不幸的是 FireFox 的对象模型中是没有的,但是可以使用变通的方法取得。例如:
- function GetEvent(caller){
- if(document.all)
- return window.event; //For IE.
- if(caller == null || typeof(caller) != "function")
- return null;
- while(caller.caller != null){
- caller = caller.caller;
- }
- return caller.arguments[0];
- }
这里使用 document.all 判断是否是 IE 浏览器的做法是不好的,应该使用 UserAgent 来判断,JQuery 等类库中有好的实现。 这样上面的 Test2 方法就可以不用修改方法签名了:
- function Test2(){
- var event = GetEvent(Test2);
- alert(GetEventTarget(event).id);
- }
- function GetEventTarget(event){
- if(document.all)
- return event.srcElement;
- return event.target;
- }
为什么可以写出 GetEvent 方法,取得 Event? 因为在 Firefox 的事件模型中最初的事件调用是将 event 显示的传递给方法的,所以可以写出 GetEvent 方法,取得唤起 JavaScript 的 event。
来源: http://www.phperz.com/article/17/0417/287111.html