2012-01-21 72 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我會這樣做,謝謝 –