2008-11-17 6 views
7

ContexteOutil qui détecte les noms de fonction javascript en double dans une page Web?

Nous avons une application web dans lequel plusieurs développeurs ont écrit plusieurs fichiers .js qui manipulent les DOM et le problème des noms de fonction en double est glissée dans notre application.

Question

Quelqu'un peut-il recommander un outil qui nous avertira lorsque nous écrivons accidentellement une page web avec deux fonctions javascript avec le même nom?

Exemple

page HTML

<script language="JavaScript" src="test.js" type="text/javascript"></script> 
<script>function foo() {alert('bar');}</script> 

test.js

function foo() {alert('foo');} 

Depuis foo() est déclaré deux fois dans la page, apparemment seulement celui qui a priorité est chargé.

Les outils que j'ai utilisés semblent ignorer cela. Firebug montre seulement la fonction chargée. Netbeans montrera les deux fonctions dans le navigateur (sans avertissement), mais ne regarde qu'un seul fichier à la fois (ie, je ne peux pas le pointer sur le fichier HTML et le voir et le .js en même temps.) Et web Les extensions de développeur me permettent de regarder tout à la fois, mais pas d'erreurs ou d'avertissements. La console d'erreur de Firefox ne génère aucun avertissement ni erreur. Ni IE.

Merci!

Répondre

3

Eh bien, l'utilisation d'un analyseur n'est peut-être pas toujours idéale car cela nécessite une étape supplémentaire de copier et coller votre code, et tout le monde, dans l'analyseur et même alors, je ne suis pas sûr qu'il attraperait ce que vous voulez. La solution éprouvée par le temps pour le développement Javascript collaboratif consiste à nommer votre code.

var myNamespace = function(){ 
    var myPrivateProperty; 
    var myPrivateFunction = function(){}; 
    return{ 

     myPublicProperty: '', 
     myPublicFunction: function(){} 


    } 

}(); 

Ceci est basé sur Douglas Crockford de module pattern.

Ensuite, vous pouvez appeler vos fonctions publiques ainsi:

myNamespace.myPublicFunction(); 

Et vos biens publics:

myNamespace.myPublicProperty; 

Chaque développeur peut se développer dans leur propre espace de noms afin de ne pas marcher sur le code des autres .

+0

Puisqu'il est clair qu'il n'y a pas un outil idéal qui fonctionnera pour notre situation spécifique, j'ai apporté cette idée à mon patron - il m'a fait lancer un PoC et il semble que nous allons l'utiliser à l'avenir. Nous pourrions même essayer de l'implémenter sur du code existant. Merci! – steve

1

Ma solution serait un simple analyseur HTML pour Java (j'ai juste piraté un avec des expressions rationnelles, vous pouvez essayer http://java-source.net/open-source/html-parsers/jtidy) et la bibliothèque Apache Rhino (http://www.mozilla.org/rhino/doc.html).

Il devrait être possible de surcharger l'analyseur syntaxique dans Rhino pour renvoyer une erreur si une fonction est redéfinie.

J'utilise une version légèrement modifiée de env.js (http://jqueryjs.googlecode.com/svn/trunk/jquery/build/runtest/env.js) de John Resig pour émuler un navigateur. Cela me permet de tester JavaScript dans les tests JUnit. Je peux remplir des formulaires, de les soumettre, vérifier la mise en page des pages, etc.

Voir mon blog pour plus de détails: http://blog.pdark.de/2008/11/18/testing-the-impossible-javascript-in-a-web-page/

+0

les liens du blog est mort –

+0

@AliQanavatian Merci, fixé. –

5

Je l'ai souvent utilisé JSLINT

En bref, il est un « compilateur » pour JavaScript en utilisant JavaScript. J'ai beaucoup appris en regardant les vidéos de formation de Douglas Crockford.

Il vérifie non seulement les fonctions en double, mais aussi les variables globales et tout un tas d'autres choses. Comme Douglas l'a dit dans une de ses vidéos, il vous permet de n'utiliser que les bons bits de JavaScript

+0

+1 pour jslint. Particulièrement bon pour attraper des problèmes inhabituels dépendants du navigateur – Ken

+0

Merci pour la réponse! J'ai essayé jsLint, et je l'ai trouvé utile, mais parce que j'ai affaire à plusieurs fichiers JS et à des scripts dans les pages HTML elles-mêmes, il était difficile de travailler avec. L'outil idéal que je cherche prendrait une URL ou un fichier HTML en entrée, et retournerait tous les problèmes. – steve

+0

Steve utilisez-vous Visual Studio? J'ai trouvé un outil vraiment génial, qui fait JSLINT dans le cadre de votre processus de construction? –

1

ScriptManager.RegisterClientScriptInclude (Me, Page.GetType, "jstest", "test.js")

Questions connexes