FF下不能通过window.event来获取event的对象,处理这个问题真是一个麻烦。今天找到一种比较妥善的方法,记录如下:
1、对于单函数
tc.tbl.onmouseover=function(eventTag){
var event=eventTag||windows.event;
var e=event.srcElement||event.target;
}
document.onkeydown=keyDown
function keyDown(e){
if((e ? e.which : event.keyCode)==13 ){
alert("ok")
}
}
2、对于函数间传递event对象
对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.jser们应该了解,:-)
JScript中,函数的调用是有一个 func.caller 这个属性的.
例如
function A()
{
B();
}
function B()
{
alert(B.caller);
}
如果B被A调用,那么B.caller就是A
另外,函数有一个arguments属性. 这个属性可以遍历函数当前执行的参数:
function myalert()
{
var arr=[];
for(var i=0;i arr[i]=myalert.arguments[i];
alert(arr.join("-"));
}
alert("hello","world",1,2,3)
就能显示 hello-world-1-2-3
(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)
根据这两个属性,我们可以得到第一个函数的event对象:
btn.onclick=handle_click;
function handle_click()
{
showcontent();
}
function showcontent()
{
var evt=SearchEvent();
if(evt&&evt.shiftKey)//如果是基于事件的调用,并且shift被按下
window.open(global_helpurl);
else
location.href=global_helpurl;
}
function SearchEvent()
{
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event) // 如果就是event 对象
return arg0;
}
func=func.caller;
}
return null;
}
这个例子使用了SearchEvent来搜索event对象. 其中 'Event' 是 FireFox 的 event.constructor .
在该例子运行时,
SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以 func=func.caller 时,func变为handle_click .
handle_click 被 FireFox 调用, 虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event !
针对上面的知识,我们可以结合 prototype.__defineGetter__ 来实现 window.event 在 FireFox 下的实现:
下面给出一个简单的代码.. 有兴趣的可以补充
if(window.addEventListener)
{
FixPrototypeForGecko();
}
function FixPrototypeForGecko()
{
HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);
window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);
Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);
}
function element_prototype_get_runtimeStyle()
{
//return style instead...
return this.style;
}
function window_prototype_get_event()
{
return SearchEvent();
}
function event_prototype_get_srcElement()
{
return this.target;
}
function SearchEvent()
{
//IE
if(document.all)
return window.event;
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event)
return arg0;
}
func=func.caller;
}
return null;
}
</body></html>
无意中发现这个,firefox 如果不是 inline 方式书写事件,得不到“当前”event(IE则可以),突然想到以属性的方式来添加事件,果然可以,不知道这算不算 W3C 的本意?以前必须在元素 inline 方式书写类似 onclick=getEvent(event) 这样的方式以参数传递的方式得到当前事件对象。但这样的代码与全部书写也好不了多少,也不能说是“干净”的代码。(注意下面代码中的注释)
JS:
<script>
window.onload=ctrlEnter;
function ctrlEnter(){
//这句是对 IE 的,firefox 这样得不到当前事件对象
//document.forms[0].bbb.onkeydown=function(){if(event.ctrlKey&&event.keyCode==13){document.forms[0].submit()}}
//这句是对 firefox 的,IE不可以这样
document.forms[0].bbb.setAttribute("onkeydown","if(event.ctrlKey&&event.keyCode==13){this.form.submit()}")
}
</script>
<body>
<div id="show">按ctrl+enter键提交</div>
<form method="get">
<input name="aaa" onkeydown="if(event.ctrlKey&&event.keyCode==13){this.form.submit()}" />
<input name="bbb" />
<input name="ccc" onkeydown="if(event.ctrlKey&&event.keyCode==13){alert(1)}" />
</form>
页面:
<body>
<input id="txtReply" />
<script>
document.getElementById("txtReply").onkeydown=Reply;
function Reply()
{
alert(1)
}
</script>
分享到:
相关推荐
最近在使用python过重遇到这个问题,NameError: name 'xxx' is not defined,在学习python或者在使用python的过程中这个问题大家肯定都遇到过,在这里我就这个问题总结以下几种情况: 错误NameError: name ‘xxx’ ...
但是在项目经过本地测试没有任何问题,打包上线后却会报错 webpackJsonp is not defined。这是因为公共文件必须在自己引用的js文件之前引用。 可以手动改文件引用,但是推荐以下解决办法: 找到build→webpack.prod...
ReferenceError: AMap is not defined AMap未定义
. eclipse 4.1 导入项目后 Target runtime Apache Tomcat v6.0 is not defined
彻底解决 __vd_version_info__ is not defined 等出错问题,完美反编译出微信小程序, 已测试。直接下载后按照 qwerty472123/wxappUnpacker 方式使用。原qwerty472123/wxappUnpacker的版本已过时。
luckysheet源码包
在项目下执行如下命令 ...报如下图错误 解决办法: ...文档里说: 所以我命通过命令安装扩展: ...composer require topthink/think-multi-app 出现如下图说明安装成功了 ...Successed 出现这个说明大功告成,可以开始你的多...
利用clipboard.js,复制文本或者隐藏域到剪切板,没有flash限制,兼容ie.chrome.firefox
// add event listeners GEvent.addDomListener(buttonDiv, 'click', function(e) { me.buttonclick_(e); }); GEvent.addDomListener(backButtonDiv, 'click', function(e) { me.backbuttonclick_(e); }); ...
含有时分秒的设置,解决了火狐和IE兼容的问题。 在火狐中不会出现$dp is not defined错误
Environment variable ORACLE_UNQNAME not defined错误解决
1. 之前稳定版开发工具用的好好的,突然某天真机调试一直报错: ReferenceError: define is not defined 2. 找解决办法后发现,更新至开发版最新版可以解决,如附件,下载安装后,即可解决该问题。
首先打开.electron-vue/webpack.renderer.config.js,在大约第125行的new HtmlWebpackPlugin中任意位置
DC错误信息注释_design complier error report annotations, DC综合时的报错信息的较...UID-4 (error) Current design is not defined. UID-5 (error) Current design ’%s’ has no schematic. UID-。。。。。。。。
主要介绍了webpack DllPlugin xxx is not defined解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Uncaught ReferenceError: ReconnectingWebSocket is not defined; 说明缺少包资源,需引入reconnecting-websocket.js和reconnecting-websocket.minjs 创建WebSocket对象使用ReconnectingWebSocket 如下: var ws =...
[Vue warn]: Error in v-on handler: “ReferenceError: Toast is not defined” 解决方法: handleClick(){ this.$toast('点击提示') } 补充知识:vue+vant移动端遇到的那些问题 1、项目引用了lib-flexible 跟px...
ReferenceError: document is not defined 本次package.json使用版本信息: { vue-loader: ^15.4.2, mini-css-extract-plugin: ^0.4.3, webpack: ^4.20.2, webpack-cli: ^3.1.2 ... } 相关代码 问题原因: ...