onchange="fonction()" basé sur la FAQ marche pas

Invité
Invité n'ayant pas de compte PHPfrance

16 août 2005, 23:03

Bonjour,

J'utilise easyphp 1.8 et j'essaie tant bien que mal de faire lancer un fonction javascript avec onchange. J'arrive à lancer un message d'alerte dans le onchange mais dès que j'appelle une fonction dans onchange ça ne marche pas.
Voici mon code:

multiple.js:
function multiple(idr)
{

var form_d = '<select name="test" id="test">';
/* On compte les départements de cette région */


form_d += ' <option value="'+ idr +'">'+ idr +" ("+ idr +')<\/option>';
form_d += '<\/select>';
document.getElementById("ici").innerHTML = form_d;
}
Dans index.php, en désactivant le php avec les balises, j'ai mis:
<script type="text/javascript" src="./multiple.js" charset="iso_8859-1"></script>
avec le fichier multiple.js dans le dossier du site (aussi dans les deux dossiers parents (dont la racine). Bref, j'ai quadrillé.

Ensuite le code du select toujours en désactivant le php:
<select name="Memoire" id="region" size="1" onchange="multiple(this.value);"">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
Et plus loin dans le code:
<span id="ici"></span><br />

Y'a t-il des règles à respecter pour la création de ma page en php. Du moment qu'au final on a bien créé le code html tout devrait bien se passer, non? Cette question me parait bête mais je vois rien d'autre.

Je répète que si je met
onchange="alert('coucou');"
ça marche.

Lo2.

Mammouth du PHP | 19672 Messages

16 août 2005, 23:45

As-tu un message d'erreur JavaScript ? Sinon, as-tu utilisé une console JavaScript ? (Il y en a une avec la barre webdevelopper de Firefox)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1885 Messages

17 août 2005, 00:44

Bonjour,
As-tu un message d'erreur JavaScript ? Sinon, as-tu utilisé une console JavaScript ? (Il y en a une avec la barre webdevelopper de Firefox)
La console Javascript est incluse à Firefox lors de son installation.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Lo2
Eléphanteau du PHP | 13 Messages

17 août 2005, 00:51

J'avais regarder dedans et là je retente (p'tre parceque j'ai relancé firefox) et je vois enfin un message d'erreur qui dit:
erreur: multiple is not an function
J'ai pas fait de faute d'orthographe, je ne comprend pas...

Lo2
Eléphanteau du PHP | 13 Messages

17 août 2005, 01:23

Du nouveau, j'ai mis multiple2(idr) dans le .js et dans la balise select et il me dit que:
document.getElementById("ici") has no properties

Lo2
Eléphanteau du PHP | 13 Messages

17 août 2005, 01:28

J'ai essayé de valider (validator) avec l'extension firefox et il me trouve une 20aine d'erreurs. Toutes sont un manque de balises fermantes.
Je regarde mon source et elles y sont...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html><head>

<script type="text/javascript" src="./multiple.js"></script>


</head>
<body>
<table border="3" width="100%"><form method="post" action="mailto:[email protected]"></table><table border="1" width="800"><tr><td width="10%"><center>PIECES</center></td><td width="6%"><center></td><td width="74%"><center>MODELES</center></td><td width="10%"><center>INFOS</center></td></tr><tr><td width="15%"><center>Memoire</center></td><td width="6%">
<select name="Memoire" id="region" size="1" onchange="multiple2(this.value);">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
</td><td width="64%"><center><select name=Memoire size="1"><option value="nil">------------------------------- Piece absente de la configuration -------------------------------</option>
<option value="Corsair Value Select 512 2">512 Mo Corsair Value Select DDR1 PC3200 CL2</option>
<option value="Corsair Value select 512 3">512 Mo Corsair Value select DDR1 PC3200 CL3</option>
<option value="Kingston ValueRam 1 4">1 Go Kingston ValueRam DRR2 PC4200 CL4</option>
<option value="Kingston ValueRam 256 4">256 Mo Kingston ValueRam DDR2 PC4200 CL4</option>
<span id="ici"></span><br /></center></td><td width="15%"></td></tr><tr><td></td><td></td><td><center>
<input value="Envoyer" type="submit"></center></td><td></td></tr></table></form></body></html>
Modifié en dernier par Lo2 le 17 août 2005, 01:35, modifié 1 fois.

Lo2
Eléphanteau du PHP | 13 Messages

17 août 2005, 01:34

Désolé de poster à répétition mais voici le résultat du validator

Eléphant du PHP | 417 Messages

17 août 2005, 06:40

Si tu tiens à coder en HTML strict (voir la première ligne de ton code), il va te falloir redoubler et même tripler de vigilance à l'égard de ton code.

Donc, avant de vouloir essayer des trucs en javascript et autres langages (ce qui est très bien en soi), portes avant tout un souci particulier à ton HTML. J'ai vu le résultat du Validateur. Tu as 20 erreurs et suggestions. Prend le temps de les étudier, elles sont très explicites: des balises non fermées, des balises qui se chevauchent, des guillements ou des signes <> manquants, etc...

Un petit exemple, tiré du code qu tu as posté plus haut (et je n'ai pas examiné en détail)...
<table border="3" width="100%"><form method="post" action="mailto:[email protected]"></table>
// ou encore la ligne suivante:
<td width="6%"><center></td>
Regarde ta table, elle ne contient ni <tr> ni <td>...et en plus, tu y emprisonnes un <form>...

Garde en tête que le plus beau code javascript ou php (ou peut importe le language) peut planter, non pas parce qu'il est forcément mal codé, mais par ce que tu le déposes dans un environnemnt déjà "malsain".

pjl, notre 'imageur'-maison te dirait probablement: «...c'est comme planter de jolies fleurs dans une fosse sceptique...» :wink:

Lo2
Eléphanteau du PHP | 13 Messages

17 août 2005, 08:35

Ok, je vais à la chasse à la propreté et je reviens quand mon validator est content.

Merci,
Laurent.

Lo2
Eléphanteau du PHP | 13 Messages

18 août 2005, 00:38

Tout d'abord merci car c'était effectivement un problème de balises.
J'apprend et je fais pas mal de modifs d'où des choses qui traine.
Là tout est clair (je crois) et j'ai un petit problème et j'ai beau me relire je ne vois pas le problème.

index.php:
<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> 

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<script type="text/javascript" src="./multiple.js"></script>
</head>

<body>
<form method="post" action="mailto:[email protected]">


<table border="1" width="800">
<?php
require_once ("functions.php");
require("connection.php");
@mysql_pconnect($server, $nom, $password) or die("Echec de la connexion au serveur");
@mysql_select_db($base) or die("Echec de la connexion de la base");
?>

      <?php
      include('entete.php');
      include('memoire.php');
      include('submit.php');
      ?>
</table>
</form>
</body>
</html>
Mon entete donc chaque ligne du tableau a quatres cellules:
<tr>
    <td width=10%>PIECES</td>
    <td width=6%></td>
    <td width=74%>MODELES</td>
    <td width=10%>INFOS</td>
</tr>
ma ligne mémoire:
<tr>
    <td width="15%">Memoire</td>
    <td width="6%">
      <select name="Memoire" onchange="multiple2(this.value);">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        </select>
    </td>

    <td width="74%">
      <select name="test">
<?php

//requete sql pour choper toutes les lignes du tableau "composant" dans la base sql
//resultat ci-dessous

$requet="SELECT * FROM memoire";

if ($result=mysql_query($requet)){
?>
  <option value="vide">------------------------------- Piece absente de la configuration -------------------------------</option>
<?php
	while ($ligne=mysql_fetch_array($result)){
 
  $marque = $ligne["marque"];
  $nom = $ligne["nom"];
	$capacite = $ligne["capacite"];
	$freq = $ligne["freq"];
	$type = $ligne["type"];
	$latence = $ligne["latence"];
?>	
<option value="<?php echo "$marque $nom $capacite $latence \">$capacite";
  
	if ( $capacite<10){echo " Go ";}
	else{ echo " Mo ";}

	echo "".$marque." ".$nom." ".$type." ".$freq." CL".$latence."";
  ?>
</option>


<?php	
	}//while
	
}//if

else{
	echo "Erreur de requête de base de données";
}//else
?>
</select>
</td>
<td width=10%></td>
</tr>

<span id="ici"></span><br />

J'ai beau recompté et vérifier les balises je ne vois pas de problème.

Et la fonction multiple2 qui est appelée dans memoire et resultat dans le span juste au-dessus d'où j'écris:
function multiple2(idr)
{
    if(idr != "1"){
    
var form_d =  '<tr>';
    form_d += '<td width="10%">qsrg<\/td>';
    form_d += '<td width="6%">dhg<\/td>';
    form_d += '<td width="74%">';
    form_d += '<select name="Memoire2">'; 
    form_d += '<option value="'+ idr +'">'+ idr +" ("+ idr +')<\/option>';
    form_d += '<\/select>';
    form_d += '<\/td>';
    form_d += '<td width="10%">qdf<\/td>';
    form_d += '<\/tr>';
    }
    
    else
    {
        form_d = "";
    }
    
    document.getElementById("ici").innerHTML = form_d;
    

}
Le source final:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> 

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<script type="text/javascript" src="./multiple.js"></script>
</head>

<body>
<form method="post" action="mailto:[email protected]">


<table border="1" width="800">

      

<tr>

    <td width=10%>PIECES</td>
    <td width=6%></td>
    <td width=74%>MODELES</td>
    <td width=10%>INFOS</td>
</tr>



<tr>
    <td width="15%">Memoire</td>

    <td width="6%">
      <select name="Memoire" onchange="multiple2(this.value);">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>

        <option value="6">6</option>
        <option value="7">7</option>
        </select>
    </td>

    <td width="74%">
      <select name="test">
  <option value="vide">------------------------------- Piece absente de la configuration -------------------------------</option>

	
<option value="Corsair Value Select 512 2 ">512 Mo Corsair Value Select DDR1 PC3200 CL2</option>


	
<option value="Corsair Value select 512 3 ">512 Mo Corsair Value select DDR1 PC3200 CL3</option>


	
<option value="Kingston ValueRam 1 4 ">1 Go Kingston ValueRam DRR2 PC4200 CL4</option>


	
<option value="Kingston ValueRam 256 4 ">256 Mo Kingston ValueRam DDR2 PC4200 CL4</option>


</select>
</td>
<td width=10%></td>
</tr>

<span id="ici"></span><br />





<tr>
  <td></td>
	<td></td>

  <td><input value="Envoyer" type="submit"></td>
  <td></td>
</tr>

</table>
</form>
</body>
</html>
Et une photo pour illustrer le resultat.
Donc ça n'ajoute pas de ligne ou du moins ça le fait en dehors du tableau.
J'ai regardé les TD, TR mais tout me parait OK.

Lo2.

Mammouth du PHP | 19672 Messages

18 août 2005, 09:29

... j'ai un petit problème et j'ai beau me relire je ne vois pas le problème....
C'est un peu insuffisant, on doit deviner ? Quel problème ? J'ai fait un test et ça a l'air de bien fonctionner, donc je ne sais pas de quel problème tu parle... :-k

Note : au lieu de [quote], utilise donc [php] quand tu mets du code, c'est quand même plus facile à suivre avec la coloration syntaxique et l'indentation.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

18 août 2005, 09:44

On peut voir le probleme sur la photo.
Tout se rajoute mais pas en-dessous du select memoire. Ca se rajoute en dehors du tableau.
L'impression que les balises ne sont pas prises en compte.

ok pour la balise php, je ne savais pas.

Ce matin j'ai changé le nom de l'attribut id de la balise span et enregistrer le .js et ca ne marche plus. Et j'obtiens un message d'erreur avec l'ancien nom de l'attribut id.

Je ne comprend rien. J'ai ouvert notepad et enregistrer par celui-ci et meme probleme donc c'est la faute de pas mon editeur (PSPad).
Ca me laisse dans un joli flou cette histoire.
Meme en fermant firefox et redemarrer easyphp (arrete puis redemarrer) j'ai le meme message d'erreur: get...("ici") has no properties

Si vous avez des tests à me proposer car si ca marche chez vous et pas chez moi je suis un peu degouté.

Lo2.

Mammouth du PHP | 19672 Messages

18 août 2005, 10:21

Ça vient de ce que le span (id="ici") n'a rien à faire là, il s'affiche donc en dehors du tableau.

J'aurais bien une solution, mais là, j'ai du mal avec IE qui n'affiche plus rien alors que ça fonctionne très bien avec Firefox. Je suis pas un spécialiste du JavaScript, mais voilà une solution d'attente à partir d'une page HTML (à toi d'Extraire les morceaux pour répartir ensuite:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<!--  <script type="text/javascript" src="./multiple.js"></script>  -->
<script type="text/javascript">
<!-- 
function multiple2(idr)
{
    var form_d = '';
    if(idr != "1")
    {
        form_d += '<td width="10%">qsrg<\/td>';
        form_d += '<td width="6%">dhg<\/td>';
        form_d += '<td width="74%">';
        form_d += '  <select name="Memoire2">';
        form_d += '    <option value="'+ idr +'">'+ idr +' ('+ idr +')<\/option>';
        form_d += '  <\/select>';
        form_d += '<\/td>';
        form_d += '<td width="10%">qdf<\/td>';
    }
    else
    {
        form_d += '<td colspan="4">&nbsp;<\/td>';
    }
    window.document.getElementById('ici').innerHTML = form_d;
}
// -->
</script>
</head>
<body onload="multiple2(1);">
<form method="post" action="mailto:[email protected]">
  <table border="1" width="800">
    <tr>
      <td width=10%>PIECES</td>
      <td width=6%>&nbsp;</td>
      <td width=74%>MODELES</td>
      <td width=10%>INFOS</td>
    </tr>
    <tr>
      <td width="15%">Memoire</td>
      <td width="6%">
        <select name="Memoire" onchange="multiple2(this.value);">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        </select>
      </td>
      <td width="74%">
        <select name="test">
        <option value="vide">------------------------------- Piece absente de la configuration -------------------------------</option>
        <option value="Corsair Value Select 512 2 ">512 Mo Corsair Value Select DDR1 PC3200 CL2</option>
        <option value="Corsair Value select 512 3 ">512 Mo Corsair Value select DDR1 PC3200 CL3</option>
        <option value="Kingston ValueRam 1 4 ">1 Go Kingston ValueRam DRR2 PC4200 CL4</option>
        <option value="Kingston ValueRam 256 4 ">256 Mo Kingston ValueRam DDR2 PC4200 CL4</option>
        </select>
      </td>
      <td width=10%>&nbsp;</td>
    </tr>
    <tr id="ici"></tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td><input value="Envoyer" type="submit"></td>
      <td>&nbsp;</td>
    </tr>
  </table>
</form>
</body>
</html>
Note l'ajout dans la balise <body> ensuite le remplacement de la balise <span> par un <tr> et enfin une alternative dans le JavaScript. Mais faudra trouver pourquoi IE n'accepte plus la commande du JavaScript, je n'ai pas trouvé pour le moment.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Lo2
Eléphanteau du PHP | 13 Messages

18 août 2005, 11:06

Ça vient de ce que le span (id="ici") n'a rien à faire là, il s'affiche donc en dehors du tableau.
Mais quel abru...
Désolé pour le dérangement.

Je vais réfléchir à ta proposition mais là je travaille alors je peux pas trop regarder :wink:

Encore merci !!

Lo2
Eléphanteau du PHP | 13 Messages

18 août 2005, 11:07

Comment on met le topic a résolu?

A+