2010-05-26 5 views
0

J'ai travaillé sur un projet Java dans lequel les rapports seront générés en HTML, donc j'implémente des méthodes pour créer ces rapports. Une fonctionnalité importante est de pouvoir avoir autant d'informations que possible dans les tableaux, mais toujours pas trop encombrer. En d'autres termes, les détails devraient être disponibles si l'utilisateur souhaite les voir mais pas nécessairement visibles par défaut.Problèmes javascript lors de la génération de rapports html depuis java

J'ai fait quelques recherches et tests et trouvé un modèle intéressant pour cacher/montrer du contenu avec l'utilisation de CSS et javascript, le problème est que lorsque j'essaie la page html résultante les scripts ne fonctionnent pas. Je ne suis pas sûr si c'est un problème dans Java ou dans le javascript lui-même. J'ai comparé le code html que java produit à la source où j'ai trouvé le template, ils semblent correspondre assez bien.

Voici des morceaux de mon code java qui génère le javascript et le contenu, je serais très heureux si quelqu'un peut indiquer les raisons possibles de ce problème:

// va à la tête

private void addShowHideScript() throws IOException{ 
    StringBuilder sb = new StringBuilder(); 
    sb.append("<script type=\"text/javascript\" language=\"JavaScript\">\n"); 
    sb.append("<!--function HideContent(d) {\n"); 
    sb.append("document.getElementById(d).style.display=\"none\";}\n"); 

    sb.append("function ShowContent(d) {\n"); 
    sb.append("document.getElementById(d).style.display=\"block\";}\n"); 

    sb.append("function ReverseDisplay(d) {\n"); 
    sb.append("if(document.getElementById(d).style.display==\"none\")\n"); 
    sb.append("{ document.getElementById(d).style.display=\"block\"; }\n"); 
    sb.append("else { document.getElementById(d).style.display=\"none\"; }\n}\n"); 
    sb.append("//--></script>\n"); 
    out.write(sb.toString()); 
    out.newLine(); 
} 

// corps

private String linkShowHideContent(String pathname, String divname){ 
    StringBuilder sb = new StringBuilder(); 
    sb.append("<a href=\"javascript:ReverseDisplay('"); 
    sb.append(divname); 
    sb.append("')\">"); 
    sb.append(pathname); 
    sb.append("</a>"); 
    return sb.toString(); 

} 

// contenu

out.write(linkShowHideContent("hidden content", "ex")); 
    out.write("<div id=\"ex\" style=\"display:block;\">"); 
    out.write("<p>Content goes here.</p></div>"); 

Mise à jour // un morceau du code html de la page qui reflète le problème

<html><head><style type="text/css"> 

#table {font-family:"Trebuchet MS", Arial, Helvetica, sans-serif; width:75%;border-collapse:collapse;} 
#table td, #table th {font-size:1em;border:1px solid #98bf21;padding:5px 8px 5px 10px;} 
#table th {font-size:1.2em;text-align:left;padding-top:5px;padding-bottom:4px;background-color:#A7C942;color:#fff;} 
#table tr.alt td {color:#000;background-color:#EAF2D3;} 
</style></head><body> 
<h2> QUERY RESULTS </h2> 
<script type="text/javascript" language="javascript"> 
<!--function HideContent(d) { 
document.getElementById(d).style.display="none";} 
function ShowContent(d) { 
document.getElementById(d).style.display="block";} 
function ReverseDisplay(d) { 
if(document.getElementById(d).style.display=="none") 
{ document.getElementById(d).style.display="block"; } 
else { document.getElementById(d).style.display="none"; } 
} 
//--></script> 
<a href="javascript:ReverseDisplay('ex')">hidden content</a> 
<div id="ex" style="display:block;"> 
<p>Content goes here.</p></div> 
+0

Que voulez-vous dire qu'ils ne Ne travaillez pas? Vous obtenez des erreurs JavaScript, actualisation de la page ... quoi exactement? –

+1

Que diriez-vous de nous donner le fichier HTML résultant au lieu du code Java. Il serait plus facile de suivre le bug de ce côté ... – ivans

+0

bien désolé pour l'ambiguïté: je n'obtiens aucune action, c'est le problème. Tout le texte statique est là mais les liens qui devraient montrer le contenu ne font pas cela. Je vais essayer d'ajouter le fichier HTML, mais je ne sais pas trop comment .. Ce n'est pas un serveur. Donc j'ai c/p: ed quelques parties de la source de la page. – posdef

Répondre

2

J'ai exécuté vos méthodes, ce qui a donné lieu (formatage non inclus: D):

<script type="text/javascript" language="JavaScript"> 
<!-- 
function HideContent(d) { 
    document.getElementById(d).style.display="none"; 
} 

function ShowContent(d) { 
    document.getElementById(d).style.display="block"; 
} 

function ReverseDisplay(d) { 
    if(document.getElementById(d).style.display=="none") { 
    document.getElementById(d).style.display="block"; } 
    else { 
    document.getElementById(d).style.display="none"; 
    } 
} 
//--> 
</script> 

<a href="javascript:ReverseDisplay('ex')">hidden content</a> 
<div id="ex" style="display:block;"> 
    <p>Content goes here.</p> 
</div> 

Il fonctionne très bien sur IE 8 et Firefox 3.6.

JavaScript désactivé dans votre navigateur ou certaines restrictions de sécurité qui réduisent l'exécution de vos scripts?

EDIT: Basé sur le code affiché, le problème semble être ceci:

<!--function HideContent(d) { 

Si vous écrivez comme ça cela fonctionne:

<!-- 
function HideContent(d) { 
+0

Odd .. J'ai récemment essayé avec SeaMonkey et Opera, toujours pas de magie .. Ils ont tous JS activé par le chemin .. La mise en forme pourrait avoir un rôle dans ce? Je ne suis pas un expert mais si ma mémoire me sert bien js ne devrait pas être trop pointilleux sur la syntaxe (formatage c'est) – posdef

+0

@posdef: voir le modifier à ma réponse. Cela a fonctionné initialement parce que j'ai formaté la chose. Sans le formatage, il ne peut pas trouver la fonction ReverseDisplay. –

+0

merci! Je suppose qu'il a fait l'affaire :) – posdef

1

Il semble droit à moi de ce que je peux dire, tant que vos identifiants sont uniques dans le code html .

Vous pouvez essayer d'utiliser firebug (firefox plugin), c'est un excellent outil de débogage javascript.

2

Quelques conseils:

  • Depuis le bloc JavaScript vous générez avec addShowHideScript() est statique, je vous suggère de ne pas écrire à chaque page, mais mettre dans un fichier séparé en inclure avec <script type="text/javascript" src="yourScript.js"></script>.

  • Vous pouvez supprimer language="JavaScript". C'est obsolète et inutile.

  • Ne pas "commenter" votre Javascript avec des commentaires HTML (<!-- ... -->). C'est aussi obsolète et inutile.

  • Habituellement, le nom des fonctions JavaScript commence par une petite lettre.

+0

merci pour les conseils, j'ai supprimé la langue = "" et commentaires .. Je me demandais juste pourquoi il est préférable de désactiver la fonction statique dans un fichier séparé? – posdef

+0

C'est plus une question d'organisation. Dans votre cas où vous générez un rapport autonome avec HTML (si je vous comprends bien), je suppose que cela ne ferait pas de grande différence. Les avantages seraient, par exemple, normalement que, si vous en avez besoin, vous pouvez changer le script une fois au même endroit et ne pas avoir besoin de toucher tous les scripts dans toutes les pages HTML que vous avez. – RoToRa

+0

+1 pour un bon conseil –

Questions connexes