Есть ли обходной путь для обратных вызовов addEventListener с возвращаемым значением? - PullRequest
3 голосов
/ 07 апреля 2010

Я в настоящее время экспериментирую с пользовательскими событиями (уровень 2 DOM), и теперь я пришел к проблеме, что addEventListener() не будет принимать обратные вызовы, которые возвращают значение - или, по крайней мере, я не знаком с правильным подходом к этому.

В основном я хочу вот что:

    addEventListener("customEvent",
        function() {
            return true ;
         },
    false) ;

чтобы при создании экземпляра функции-оболочки new wrapper(),

     function wrapper() {
         addEventListener(...) ;
     }

это будет правильно возвращено, true всякий раз, когда событие инициируется и перехватывается.

Пожалуйста, имейте в виду, что это экспериментально: я знаю, что существует множество решений, которые не требуют возврата от метода addEventListener. Мне просто любопытно, есть ли обходной путь или это фактически тупик, и я не должен беспокоиться.

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 27 февраля 2011

AddEventListener по спецификации не возвращает и не будет возвращать значение. Если бы addEventListener должен был возвращать значение, это было бы бесполезно, так как событие, которое вызывает callbackFunction, получило бы возвращаемое значение, а не addEventListener, который просто зарегистрировал его.

addEventListener( 'onload', function() {

  // do something

  return true;

  // bool(true) would be returned to window.event[onload] and not to addEventListener if that were the case which would still make it useless to you.

}, false );

С учетом вышесказанного, существует грязный метод, но он должен дать вам то, что вы хотите.

var eventTracker = {

  retVal: false,

  retEvt: false,

  trigger: function( e ) {

    e = e || window.event;

    // some code here
  }

};

function someFn(e) {

  e = e || window.event;

  // Some code here

  eventTracker.retVal = true;

  eventTracker.retEvt = e.type;

  eventTracker.trigger.call( e );

}

// Bind the event in all browsers
if ( window.addEventListener ) {
    window.addEventListener( 'load', someFn, false );
} else if ( window.attachEvent ) {
    window.attachEvent( 'onload', someFn );
} else {
    window.onload = someFn;
}
...