2015-02-28 2 views
0

Я хочу использовать замыкание как EventListener (им работать в библиотеке маршрутизации), поэтому я создал класс, который делает именно это назначениеCant использовать замыкание в качестве слушателя событий для PushState

'use strict'; 
var RouteManager = RouteManager || {}; 

RouteManager.OnClickDelegate = function(UrlHandler) 
{ 
    var handler = UrlHandler; 

    return function delegate(e) 
    { 
     e = e || window.event; 
     var element = e.target || e.srcElement; 
     if (element.tagName == 'A') { 
      console.log("link click"); 
      window.history.pushState({},"",e.href); 
      //this.handler.handle(element.href); 
      return false; 
     } 
    }; 
}; 

:

document.onclick = RouteManager.OnClickDelegate(new UrlHandler()); 

Однако, несмотря на назначение закрытия в качестве слушателя событий работает («ссылка нажмите» регистрируются правильно) состояние разве толкнул

сделать дела даже незнакомым, это работает правильно:

document.onclick = (function(UrlHandler){ 
    var uh = UrlHandler; 
    return function delegate(e) 
    { 
     e = e || window.event; 
     var element = e.target || e.srcElement; 
     if (element.tagName == 'A') { 
      console.log("link click"); 
      window.history.pushState({},"",e.href); 
      //this.handler.handle(element.href); 
      return false; 
     } 
    }; 
})(new UrlHandler()); 

Любые идеи?

Кроме того, пожалуйста, не предлагают библиотеку работать маршрутизации, его не то, что им просят

+0

Почему закрытие? Вы вообще не используете 'UrlHandler' /' handler'/'uh'. – Bergi

+0

Очень маловероятно, что один работает, а другой нет. Обратите внимание, однако, что вы, вероятно, захотите использовать 'element.href' вместо' e.href'. – Bergi

+0

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

ответ

0

состояние разве толкнул

Вероятно потому, что e.href является undefined. Вы хотите element.href.


Обратите внимание, что в вашем закрытии вы можете использовать переменную параметра напрямую, вам не нужно это объявление локальной переменной. Просто используйте это:

RouteManager.OnClickDelegate = function(handler) { 
    return function delegate(e) { 
     e = e || window.event; 
     var element = e.target || e.srcElement; 
     if (element.tagName == 'A') { 
      console.log("link click"); 
      window.history.pushState({}, "", element.href); 
      handler.handle(element.href); 
      return false; 
     } 
    }; 
}; 

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

  • Нет связанных вопросов^_^