3

Je rencontre une erreur dans le mode de compilation avancé.Comment fonctionne Google Closure EventTarget?

Uncaught TypeError: Object #<d> has no method 'attachEvent' 

Après un peu de magie carte source Je pensais que cela est jeté de goog.events.listen appel, où le premier argument est mon objet personnalisé, héritant goog.events.EventTarget.

Ceci est source

goog.events.EventTarget.prototype.addEventListener = function(
    type, handler, opt_capture, opt_handlerScope) { 
    goog.events.listen(this, type, handler, opt_capture, opt_handlerScope); 
}; 

de fermeture Donc cette fonction se termine sur un prototype de mon objet, avec customEvent_ = true, puis dans goog.events.listen

// Attach the proxy through the browser's API 
if (src.addEventListener) { 
    if (src == goog.global || !src.customEvent_) { 
    src.addEventListener(type, proxy, capture); 
    } 
} else { 
    // The else above used to be else if (src.attachEvent) and then there was 
    // another else statement that threw an exception warning the developer 
    // they made a mistake. This resulted in an extra object allocation in IE6 
    // due to a wrapper object that had to be implemented around the element 
    // and so was removed. 
    src.attachEvent(goog.events.getOnString_(type), proxy); 
} 

(La dernière ligne est celle qui jette

Cela ne devrait-il pas se terminer par un débordement de pile? Pourquoi cela se passe-t-il dans la branche else si mon objet hérite addEventListener de EventTarget? En mode de compilation simple, tout fonctionne bien. Comment cela fonctionne-t-il, et pourquoi ai-je l'erreur seulement en mode de compilation avancé?

+0

Pourriez-vous s'il vous plaît partager votre implémentation réelle de l'objet? – zakelfassi

Répondre

1

Pouvez-vous ajouter du code? À quoi ressemble votre événement personnalisé? Fondamentalement, le 'addEventListener' par défaut de JS est réécrit. IE n'implémente pas addEventListener, mais uniquement attachEvent et l'objet d'événement renvoyé n'est pas un événement normal, mais un goog.events.BrowserEvent.

En mode Compilation avancée, le compilateur aplatit (minimise) les propriétés de tous les objets, y compris l'objet événement. Les propriétés de votre événement personnalisé peuvent être aplaties en mode de compilation avancé (c'est probablement le cas ici) et pour cette raison, attachEvent() n'existe pas dans le prototype. il est peut-être devenu aE() ou quelque chose comme ça. Mettez un peu plus de code avant que quelqu'un ne puisse proposer de vraies suggestions utiles.

Questions connexes