Изменение объекта события в Javascript - PullRequest
5 голосов
/ 21 января 2012

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

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

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

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

Помимо свойства hotKey, я планирую добавить также некоторые другие свойства, в основном, для упрощения функций обработчика событий и, таким образом, устранения обычно выполняемой логики обработчиками событий. Чтобы избежать именования, я мог бы добавить новые свойства в подобъекте. Другими словами, свойства не обязательно должны быть свойствами верхнего уровня.

Я сейчас реализую это, но надеюсь получить представление, о котором я, возможно, и не думал.

Сложение

Вопрос в том, что другие люди думают о реализации ниже. Это требует, чтобы объект события, который передается в обработчик, нуждался в изменении. Я задаю вопрос, так как на самом деле я изменяю объект, который мне не принадлежит ... но в этом случае есть преимущества в этом.

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

Ответы [ 2 ]

1 голос
/ 22 марта 2017

Привет, Хакан, ты тоже здесь :)

Попробуйте создать собственный объект события и затем отправить его с помощью функции 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" );

Все примеры приведены по этим ссылкам.

1 голос
/ 07 ноября 2013

Недостатком вашего решения является то, что вы привязали пользователя к реализации 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);
}

* это всего лишь черновик решения, вам все равно нужно учитывать отсутствие слушания и другие аспекты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...