2010-03-18 6 views
0

Lorsque vous utilisez ECMAScripts typeof sur les éléments de plug-ins (c.-à-embed ou object), Safari & FireFox retour "function":typeof pour les éléments du plugin html

typeof(window.document['myPlugin']) // "function" 

Cela ne peut pas être influencé sur le côté du plug-in, comme le navigateur doesn n'appelle pas le plugin ici. Assez drôle, dans IE la même ligne évalue à "object".

Est-ce simplement le comportement dépendant de l'implémentation selon ECMAScript §11.4.3 ou est-ce que je manque quelque chose ici?

+0

Pouvez-vous l'appeler en tant que fonction? – SLaks

+0

'window.document ['myPlugin']()' mène au navigateur essayant d'invoquer la fonction par défaut - il n'en a pas cependant. –

Répondre

1

Les spécifications sont toutes très vagues quant à la façon dont typeof doit se comporter avec un objet plugin, car ECMAScript n'a pas été écrit avec des plugins à l'esprit. Par conséquent, sur IE avec un contrôle activex, il aura tendance à répondre avec "objet" parce que c'est ainsi qu'ils ont décidé de le traiter; Firefox et moi pensons que Safari répond avec "fonction" parce que c'est ainsi qu'ils ont décidé de s'en occuper.

Les deux réponses ont un sens; rappelez-vous que lorsque vous accédez au plugin avec document.getElementById ("myPlugin"), vous n'obtenez pas seulement une référence au plugin, vous obtenez une référence à l'élément HTML qui héberge le plugin, ce qui arrive aux appels proxy le plugin. Étant un élément HTML, il possède d'autres propriétés et méthodes que vous ne connaissez même pas.

Il semblerait que l'objet aurait plus de sens dans ce cas, mais un objet ne le fait généralement pas, ne peut pas avoir une fonction par défaut, et donc je suppose que firefox est déterminé à répondre que c'est une fonction car il y a impossible dans le NPAPI d'interroger pour voir si la fonction par défaut existe, à moins d'appeler InvokeDefault. Si vous pouvez également appeler une méthode par défaut sur une interface ActiveX IDispatch, cela ressemble plus à un effet secondaire accessoire qu'à une fonctionnalité de conception.

Pas une réponse très scientifique, mais qui pourrait aider.

+1

Après avoir obtenu 'GetValue()' et en regardant la définition de l'objet natif et hôte (http://bclary.com/2004/11/07/#a-4.3.6, pourquoi je ne l'ai pas fait auparavant?) ce devrait être un objet hôte et donc * implémentation définie * où votre raisonnement convient bien. –

Questions connexes