addEvent 给出空事件对象
addEvent giving null event object
我正在尝试在我的一个项目中获得IE8支持,但很难将addEventListener转换为addEvent(来自:http://ejohn.org/projects/flexible-javascript-events/)
所以,用他的代码,我有一个事件设置,如(来源在这里):
_addEvent(eventableIframes[i], 'mousemove', function (e) {
utilBarHandler(e);
});
但是,当它到达utilBarHandler
时,"e
"是null
,IE8在第783行给了我一个"需要对象"错误。我假设所需的对象是事件对象,因为当我在函数顶部注销e
时,它实际上只是空。
此外,该循环中需要事件对象(如 shortcutHandler
和 shortcutUpHandler
)的每个事件都会发生这种情况。
更新:以防万一人们错过了它,这篇文章有一堆链接,突出显示特定行。
并非所有版本的IE都将事件作为参数传递。 它在window.event
. 可以将此项添加到_addEvent填充程序或事件处理程序:
e = e || window.event
如:
_addEvent(eventableIframes[i], 'mousemove', function (e) {
e = e || window.event;
utilBarHandler(e);
});
这将在IE或其他版本中工作。
下面是两种跨浏览器事件处理,可确保在 IE 中正确设置event
和this
指针:
// add event cross browser
function addEvent(elem, event, fn) {
if (elem.addEventListener) {
elem.addEventListener(event, fn, false);
} else {
elem.attachEvent("on" + event, function() {
// set the this pointer same as addEventListener when fn is called
return(fn.call(elem, window.event));
});
}
}
// refined add event cross browser
function addEvent(elem, event, fn) {
// avoid memory overhead of new anonymous functions for every event handler that's installed
// by using local functions
function listenHandler(e) {
var ret = fn.apply(this, arguments);
if (ret === false) {
e.stopPropagation();
e.preventDefault();
}
return(ret);
}
function attachHandler() {
// set the this pointer same as addEventListener when fn is called
// and make sure the event is passed to the fn also so that works the same too
var ret = fn.call(elem, window.event);
if (ret === false) {
window.event.returnValue = false;
window.event.cancelBubble = true;
}
return(ret);
}
if (elem.addEventListener) {
elem.addEventListener(event, listenHandler, false);
} else {
elem.attachEvent("on" + event, attachHandler);
}
}
@jfriend00建议的快速而肮脏的修复,e = e || window.event
,是 99% 的方式,但我仍然遇到问题。经过更多的摆弄,我找到了答案。我不想要window.event
,因为它是一个iframe。相反,我想要iframeElement.contentWindow
.像这样将其添加到我的回调中就可以解决问题:
_addEvent(eventableIframes[i], 'mousemove', function (e) {
// self.iframeElement == <iframe>
e = e || self.iframeElement.contentWindow;
utilBarHandler(e);
});
相关文章:
- 如何从jQuery的事件对象中检索属性
- 如何在JavaScript中基于事件对象获取文件名
- 如何避免在这种情况下修改事件对象
- 如何在事件处理程序中获取 javascript 事件对象
- 如果在设置侦听器之前触发了 DOMContentLoaded 事件,如何检索“事件”对象
- addEvent 给出空事件对象
- 修改鼠标事件对象的“目标”以进行事件委派
- 如何将参数传递给backbone.js中事件对象中绑定的函数
- 从ng重复奇数内部的ng点击访问事件对象
- 如何从 React 中的事件对象访问自定义属性
- 如何将事件对象传递给对象中的函数
- 正在发送事件对象
- 是否可以获得“”的事件对象;当前“;或“;最后一个“;事件,而不将其作为处理程序中的参数接收
- 如何将事件对象字符串化
- 通过angular传递关于事件预防的信息;s事件对象
- Javascript事件对象:其中是选择器
- Meteor.js:如何检索事件对象的父元素的数据属性
- JavaScript 如何重新识别事件对象变量
- 事件对象在此代码中的工作原理
- 是为响应 DOM 事件而创建的多个事件对象