2012-01-21 4 views
3

В Javascript общее понимание заключается в том, что вы не должны изменять объекты, которые у вас нет. Я понимаю и соглашаюсь с аргументами. Несмотря на это, я подумываю добавить пару свойств объекта Event. Сначала я напишу небольшой фон, а также то, что будет иметь последствия, и после этого я надеюсь получить от вас разумные отзывы, с про-и-кон.Изменение объекта события в Javascript

Я написал диспетчер событий, который имеет методы, такие как addEvent, removeEvent и т. Д. Когда события запускаются, я буду вызывать обработчики, передавая объект события обработчикам событий, прошедшим, когда регистраторы событий зарегистрированы ,

Прежде чем передать объект события, я добавлю пару свойств объекта события. Например; «hotKey» - с возможными значениями, такими как «shift-c», «alt-d» или «meta-a». (Последний соответствует «ctrl-a» на Window и «cmd + a» на MacOS и т. Д. Другими словами, в зависимости от ОС он будет правильно соответствовать, а логический шаблон обработчиков не должен заботиться о том, включен ли он какая ОС или какая мета-клавиша)

Последствия того, что код обработчиков уменьшается, благодаря тому, что все необходимые операторы if-then выполнялись диспетчером событий, когда, например, когда связанные с ключевыми событиями. Обработчик событий в значительной степени должен иметь оператор switch-statement и делать забавные вещи.

Помимо свойства hotKey, я планирую добавить некоторые другие свойства, в основном для упрощения функций обработчика событий и, тем самым, для устранения часто выполняемой логики обработчиками событий. Чтобы избежать именования колонок, я мог бы добавить новые свойства в sub-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

Hi Hakan вы также здесь :)

Попробуйте создать свой собственный 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

ОК Майкл Л Я сделаю это, спасибо –

Смежные вопросы