2012-01-21 74 views
3

在Javascript中,通常的理解是,您不应该修改您不属于的对象。我理解并同意这些论点。尽管如此,我正在考虑添加Event对象的一些属性。首先,我会写一点背景知识,以及后面的内容,然后我希望能够通过专业和专业的方式从您那里获得一些智能反馈。使用Javascript修改事件对象

我写过一个事件管理器,它有像addEvent,removeEvent等方法。当事件被触发时,我将调用处理程序,将事件对象传递给eventlisteners注册时传入的事件处理程序。

在传递事件对象之前,我将为事件对象添加一些属性。例如; “hotKey” - 具有诸如“shift-c”,“alt-d”或“meta-a”等可能的值。 (最后一个对应于Window上的“ctrl-a”和MacOS上的“cmd + a”等。换句话说,根据操作系统,它将正确匹配,并且处理程序逻辑模式不需要关心它是否处于开启状态哪个操作系统或它是什么元键)

其含义是处理程序代码变得更小,这要归功于所有需要的“if-then”语句已由事件管理器执行,例如当与关键相关的事件已经被解雇。事件处理程序几乎需要有一个switch-statement并且做有趣的事情。

除了hotKey属性,我还计划添加一些其他属性,主要是为了简化事件处理函数,从而消除事件处理程序通常执行的逻辑。为了避免命名colissions,我可能会将这些新属性添加到子ojbect中。换句话说,这些属性不需要是顶级属性。

我正在执行此操作,但我希望获得我可能没有想到的见解。

加成

的问题是,别人怎么想下面的执行。这要求传递给处理程序的事件对象需要修改。我在问这个问题,因为我实际上正在修改一个我不拥有的对象......但在这种情况下,这样做有好处。

addEvent(document, "keyup", function(event) { 
    switch (event.hotKey) { 
     case 'meta-c': 
      // code here 
      break; 
     case 'meta-a': 
      // code here 
      break; 
    } 
}); 
+1

如果你只是问是否可以修改事件对象,我认为这是属于[codereview](http://codereview.stackexchange.com/) – Esailija

回答

0

解决方案的draback是你的用户与您实现event.hotKey。如果另一个库添加它自己的实现event.hotKey,它的功能与您的完全不同,那么尝试使用它们的用户将会遇到一些难以调试的问题。

而是改变事件对象本身,您需要单独提供的功能:

function MyEvent(event) { 
    var myEvent = clone(event); 
    myEvent.hotKey = ... 
    return myEvent; 
} 

addEvent(document, "keyup", function(event) { 
    switch (MyEvent(event).hotKey) { 
     case 'meta-c': 
      // code here 
      break; 
     case 'meta-a': 
      // code here 
      break; 
    } 
}); 

如果你不喜欢的事实,处理程序必须包装的情况下,则可以更改该监听功能:

function myAddEvent (target, type, handler, capture, scope) { 
    var myHandler = function(event){ 
    handler.call(scope,MyEvent(event)); 
    } 
    addEvent(target, type, myHandler, capture); 
} 

*这只是一个解决方案草案,你还是需要考虑unlistening等方面

0

喜雅,你也在这里:)

尝试创建自己的event object,然后使用trigger()函数发送它。

//Create a new jQuery.Event object without the "new" operator. 
 
var e = jQuery.Event("click"); 
 
    
 
// trigger an artificial click event 
 
jQuery("body").trigger(e);

触发

$("#foo").on("click", function() { 
 
    alert($(this).text()); 
 
}); 
 
$("#foo").trigger("click");

所有的例子都在这些链接。

+0

为了保护你的答案免受链接腐烂或更改内容,请在您的答案中包含链接内容的相关部分。 –

+0

好的迈克尔L我会这样做,谢谢 –