11496 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous et merci d'avance pour votre aide.

Mon problème est l'appel de fonction qui génère l'erreur Firebug suivante Smiley biggol :
a écrit :
ReferenceError: ValidatefrmContact is not defined
if (ValidatefrmContact(document.forms.frmContact) == false)]


Possibilité de test

[*]La page en erreur est sur plpconsulting.free.fr/index.html Smiley bawling
[*]A contrario, un exemple qui fonctionne parfaitement bien Smiley lol sur le même structure est dispo sur plpconsulting.free.fr/ValidationRules/index.html. Le formulaire est par contre directement dans la page HTML


Objectif
j'envoie des données saisies dans un formulaire HTML au format XML via l'objet XMLHttpRequest (fichier SendMail.js) à un fichier PHP (SendMail.php) qui envoie par mail les données saisies dans le formulaire HTML.

Dans SendMail.js:

fonction InitValue
Test des contraintes de validation par appel de la fonction ValidatefrmContact qui est déclarée dans le Header de la page HTML (Voir dans Header)
[*]Récupération des données du formulaire si test validation OK
[*]Appel de CallScript

fonction CallScript
[*]envoi au format XML par méthode post des données saisies dans le formulaire au fichier phpSendMail.php

Dans SendMail.php
[*]Envoi d'un mail avec les données saisies dans le formulaire HTML

Info importante
le formulaire est intégré dans un objet Onglet JQuery (Voir code du Header)

Dans Header, il y a :

la référence au fichier JS
<script type="text/javascript" src="SendEmail.js"></script>


L'Onglet (tab) JQuery.
$(document).ready(function()
{
   var jQueryTabs1Opts =
   {  show: false, event: 'click',  collapsible: false  };
   $("#jQueryTabs1").tabs(jQueryTabs1Opts);
... Liste des autres contrôles JQuery



Une fonction de contrôle des règles de validations
function ValidatefrmContact(theForm)
{   var regexp;
   if (theForm.subject.selectedIndex < 0)
   {
      alert("Saisie incorrecte ou manquante");
      theForm.subject.focus();
      return false;
   }
... autres contrôles
}


Dans body, il y a :

la déclaration du contrôle Onglet avec tous les contrôles associés
<div id="jQueryTabs1" style="position:absolute;left:24px;top:66px;width:1391px;height:837px;z-index:176;"> 

........ Liste des autres contrôles associés

</div>



Et dans le 4ème onglet, un contrôle formulaire
<div id="wb_frmContact" style="position:absolute;left:49px;top:69px;width:438px;height:730px;z-index:101;">
<form name="frmContact" method="post" action="" enctype="text/plain" id="frmContact" onsubmit="return ValidatefrmContact(this)">
<input type="text" id="firstname" style="position:absolute;left:104px;top:45px;width:313px;height:23px;line-height:23px;z-index:59;" name="name" value="" tabindex="2">

... Liste des autres contrôles associés

...Et bien sûr le bouton avec even = onclick qui appelle une fonction InitValue() 

<input type="button" id="btSend" onclick="InitValue();return false;" name="" value="Envoyé" style="position:absolute;left:322px;top:693px;width:96px;height:25px;z-index:94;" tabindex="18">
</form>


La fonction InitValue.js appelle ValidatefrmContact(document.forms.frmContact) et passe en paramètre le formulaire le formulaire frmContact

function InitValue() {
	if (ValidatefrmContact(document.forms.frmContact) == false) 
	{	var alerte = "opération annulée. Données obligatoires non saisies ou problème de format";
		alert (alerte); 
		return false;
	}

	var _subject =  $("#subject option:selected").text();
	var _firstname = $("#firstname").val();
	var _name = $("#name").val();
	var _email = $("#email").val();
	var _message = $("#message").val();
	[... ]
	var _data = "name="+_name+"&firstname="+_firstname+"&email=" +_email+"&message="+_message
	[... ]
	
	// --- Appel au script PHP de traitement
	var _scriptName ="SendEmail.php";
	CallScript(_scriptName,_data);
	alert("Fin de traitement"); 
}

function CallScript(scriptName, data) {
	
	var xhr_object = null; 
	if (window.XMLHttpRequest) { xhr_object = new XMLHttpRequest(); }
	else if (window.ActiveXObject) { xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); }
	else
	{ alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
		return;
	}
	xhr_object.open("POST", scriptName, true);
	xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xhr_object.send(data);
}


Avec tout ça j'ai donc, je le répéte l'erreur Firebug suivante Smiley bawling :
a écrit :
ReferenceError: ValidatefrmContact is not defined
if (ValidatefrmContact(document.forms.frmContact) == false)


Or sur http://plpconsulting.free.fr/ValidationRules/index.html, j'ai fait le même exercice mais sans l'objet Onglet JQuery et ca fonctionne à la perfection d'où ma question sur la portée des fonctions JS? Smiley biggol
Modifié par informer (05 Dec 2013 - 23:14)
Modérateur
bonsoir, pour commencer, sur la première adresse (-http://plpconsulting.free.fr/index.html) je ne peux rien tester car il y a une grosse erreur javascript: le fichier jsSendMail.js commence par une balise HTML:
<SCRIPT type="text/javascript"> tout le code qui suit n'étant donc pas évalué.

des balises HTML n'ont rien à faire dans du javascript. C'est pour appeler le javascript dans un fichier HTML que tu as besoin de la balise <script>
Bonjour kustolovic,

Merci pour ton retour et c'est vrai que c'est un peu le binz dans mes fichiers.

J'ai trouvé l'erreur sur regexp. Maintenant ça fonctionne super ...

Mais nouveau problème sur la valeur du champ 'name' qui est 'undefined' quand on ne saisit rien alors que les autres champs n'ont pas cette erreur.

TypeError: theForm.name.value is undefined
if (theForm.name.value.length < 1)
Smiley biggol

La fonction de test est :
 regexp = /^[A-Za-zÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ0-9--]*$/;
   if (!regexp.test(theForm.name.value))
   {
      alert("Please enter only letter, digit and \"-\" characters in the \"name\" field.");
      theForm.name.focus();
      return false;
   }
   if (theForm.name.value == "")
   {
      alert("Please enter a value for the \"name\" field.");
      theForm.name.focus();
      return false;
   }
   if (theForm.name.value.length < 1)
   {
      alert("Please enter at least 1 characters in the \"name\" field.");
      theForm.name.focus();
      return false;
   }
   if (theForm.name.value.length > 10)
   {
      alert("Please enter at most 10 characters in the \"name\" field.");
      theForm.name.focus();
      return false;
   }


Et ça provoque pour le test :
if (theForm.name.value == "")  // => retourne False puisque undefined  => pas d'alerte

et bien sûr
if (theForm.name.value.length < 1) // est en erreur générant le message firebug 
Smiley bawling

Merci par avance
Modifié par informer (06 Dec 2013 - 15:10)