【发布时间】:2010-11-30 08:12:47
【问题描述】:
确定 Javascript 对象是否为事件的最安全方法是什么?
【问题讨论】:
-
@Tim Down:因为我需要区分随机 JS 对象、HTML 元素和作为参数发送给我的函数的事件。
标签: javascript javascript-events
确定 Javascript 对象是否为事件的最安全方法是什么?
【问题讨论】:
标签: javascript javascript-events
探查可能的“未知”对象以获取您希望找到的属性和方法是一种相当好的做法。
因此,假设您拥有一个事件对象,并在对其进行操作之前对其进行探测,例如
if (event.target)
{
//looks like we're an event, hide the target
var e=$(event.target);
e.hide();
}
请务必注意,我并不是建议您测试“目标”以查看它是否是一个事件:您正在测试目标,因为您将要使用该属性。我的目标是,与其试图弄清楚一个对象是否是事件,不如探测该对象以查看它是否会按照您期望的方式运行,然后使用这些行为。
这样的代码应该在具有不同支持的浏览器上正常降级,或者让您利用特定于浏览器的扩展,例如
if (event.initKeyEvent)
{
//gecko 1.9+
event.initKeyEvent(...)
}
【讨论】:
我不知道是否有可靠的方法来做到这一点,但我认为你最好的方法是鸭式打字。
无论如何,您可以根据情况检查给定对象是否具有您想要使用的预期属性,就像Paul 指出的那样。
【讨论】:
这个 isEvent 函数检查未知对象的构造函数,将其转换为字符串,然后搜索已知事件类型:
function isEvent(o){
//grab the constructor for the unknown object
var c=o.constructor;
//convert constructor to string
var s=c.toString();
/* declare IE RegExp pattern to match for 'object [Event]' */
if(document.all){
//set regExp pattern for IE
var ptr=/\[object Event\]/;
}else{
/* declare FIREFOX regExp pattern to match for 'object [*Event]' since it has
several event types:
UIEvent
KeyboardEvent
MouseEvent
FocusEvent
WheelEvent
CompositionEvent
StorageEvent
CustomEvent (Requires Gecko 6.0)
MutationEvent
Both Custom and Mutation events are not recognized prior to Gecko 6.0,
so if you want to use these, adjust regExp accordingly */
var ptr=/\[object (Keyboard|Mouse|Focus|Wheel|Composition|Storage)Event\]/;
}
return ptr.test(s); }
【讨论】:
我也有同样的担忧。于是我着手证明,离解也越来越近了。
function isEvent(a){
var txt, es=false;
txt = Object.prototype.toString.call(a).split('').reverse().join('');
es = (txt.indexOf("]tnevE") == 0)? true: false; // Firefox, Opera, Safari, Chrome
if(!es){
txt = a.constructor.toString().split('').reverse().join('');
es = (txt.indexOf("]tnevE") == 0)? true: false; // MSIE
}
return es;
}
我在
中测试了这个功能我希望这会有所帮助。
【讨论】:
老问题,但显然根据这个,event.type 是跨浏览器:
http://www.quirksmode.org/js/events_properties.html
RameshVel 在对他的回答进行编辑时添加了这一点,但投票率很低。
当然,最安全的方法是遵循公认答案的指导,但碰巧我想丢弃该对象,如果它是一个事件。
【讨论】:
使用instanceof怎么样?只要事件对象是使用构造函数new Event()创建的,例如:
var e = new Event('click');
e instanceof Event; // true
如果是事件处理程序中的事件参数,虽然它的类型是对象,但它包含原生事件作为属性,所以可以使用它来代替:
function myEventHandler(e) {
e.originalEvent instanceof Event; //true
}
这里需要注意的是,实际值可能会因浏览器而异,特别是当事件是触摸事件时,请参阅here 和其中的引用。对我来说不是问题。
【讨论】:
您可以检查对象是否具有属性 originalEvent;
event.hasOwnProperty('originalEvent')
例如:
// var event
var
isObject = typeof event ==='object', // is the given argument an object
isEvent = isObject ? event.hasOwnProperty('originalEvent') : false;
if(isEvent) {
// var `event` is an event!
} else {
// var event is NOT an event!
}
【讨论】: