IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

fonction qui ne demarre jamais


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Par défaut fonction qui ne demarre jamais
    j'ai ces fonctions qui me prennent la tête depuis plusieurs jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
    	function file(ur)
    {
    if(window.XMLHttpRequest) // FIREFOX
    xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // IE
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else
    return(false);
    xhr.open("POST", 'new2.php', true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  
    xhr.send(data);
    if(xhr_object.readyState == 4)
    return(xhr_object.responseText);
    else return(false);
    }
     
     
    </script> 
    <script language="JavaScript"> 
     
    	affiche2 = false; 
     
    	function AffichePub2() 
    		{ 
    		if(!affiche2) 
    			{ 
    			numimage2= Math.round(Math.random()*(imgurl.length-1)); 
    			urt = texte;
    			texte = file(urt);
    			document.getElementById('publicite').innerHTML = "<A HREF="+ imgurl[numimage2] +")><IMG SRC=" + imageurl[numimage2] + " BORDER=0 NAME=publi></A>" ;
    			affiche2 = true; 
    			} 
    		else 
    			{ 
    			document.publi.src=texte; 
    			do
    			{
    			urt=texte;
    			texte = file(urt);
    			} 
    			while (texte==false);
    			}
    		setTimeout("AffichePub2()",15000); 
    		} 
     
     
    	AffichePub2(); 
    </script><?
    quand je charge ma page , rien ne se passe ...
    Avec la fonction file je veut renvoyer ce que le fichier php appelé m'as fournis lors de l'appel précédent.
    et secondo de recevoir en retour l'url d'une autre image à charger
    new2.php calcule quelle image doit être affichée et envoi son url
    en recevant l'ancien url ca lui permet de primo ne pas renvoyer la même image et d’incrémenter un champ dans une base de donnée.

    quand je me contentais de recevoir par ce code l'url de la nouvelle image , ca fonctionnais mais en passant de GET a POST ca debloque complètement.
    la reponse de new2.php est sous cette forme :
    répertoire/image.extension
    par exemple :
    test/voiture.jpg

    ou est mon erreur dans ce code ? ( mon ou mes )

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Si tes scripts sont dans le head de ta page, c'est normal : tu appelles ta fonction avant que les éléments qu'elle utilise n'existent dans la page, forcément, ça marche moins bien !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre actif
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Par défaut
    en fait je charge ce sous ensemble de script dans mon pied de page .
    au départ j'utilisais un code trouve tout fait , et comme je m en servais a 2 endroits différents je les chargeais dans le div ou l'image devait etre affichée.
    il utilisais le document.write
    la je tente de faire une version perso qui elle utilise le dom.
    mais l'inclusion se fait tjs dans le div ou la précédente version était utilisée
    Dans ma page, quand le div se crée il est d'une couleur de fond différente du reste de ma page pour être sur qu'il existe.
    En fait c'est ma troisième version. la seconde marche bien, mais elle tourne avec un GET et pas un POST
    je pense que mon erreur est dans les modifications faites pour passer d'un GET a un POST
    soit c' est ma facon d'appeler la fonction en mettant le contenu de texte dans une autre variable pour l'envoyer en paramètre de la fonction file
    soit c'est dans la fonction file en elle même que ca coince au niveau des modifications apportées pour faire ma requête en POST
    je ne peut pas le jurer mais je suis pratiquement certain que c' est cette ligne ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    qui me cause mes soucis
    sauf si j'ai fait une co***rie a deux balles genre oublier un ";" ou je sais pas quoi d'autre

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Salut atc666,
    contrairement à ce que tu crois, ce n'est pas le setRequestHeader qui pose problème. Il est nécessaire pour que le serveur interprète correctement les données que tu lui envoies.
    Ton objet xhr semble être une variable globale. Où est-elle déclarée ? Sinon, il est possible que tu aies confondu avec xhr_object. As-tu pensé à examiner tes messages d'erreur ?

    Idem, je ne vois pas où est déclarée ta variable data.

    De plus, le code qui suit xhr.send(data); devra être placé dans la fonction de rappel de ton requêteur AJAX, pour être bien exécuté à la réception de la réponse, et pas avant.

    Pour finir, quelques remarques :
    • Indente proprement ton code, ça t'aidera à te relire.
    • utilise <script type="text/javascript"> au lieu de <script language="Javascript">.
    • Passer des chaînes à setTimeout est dangereux, car la fonction eval est appelée en interne. À la place, utilise setTimeout(AffichePub2, 15000);.
    • Aujourd'hui, les balises et attributs HTML s'écrivent en minuscules.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre actif
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Par défaut
    hummmm j avait bien plus de soucis que je ne pensais lol
    voici la version que j'ai réussi a faire tourner
    elle aussi zarb que l ancienne ptre même plus ...
    M'enfin ca tourne et ca tourne presque comme je le voulait ( ptre un peu lent au passage d'une image à l'autre mais bon quand j'ai voulu rajouter un préload ca débloquais à nouveau . Donc j'ai fait un retour arrière vite fait
    si vraiment ca rame trop au changement d'image j'y reviendrai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <script language="JavaScript"> 
    var texte = 'promo'
    function file(ur)
    {
    var xhr_object = null; 
    if(window.XMLHttpRequest) // FIREFOX
    xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // IE
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else
     alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    xhr_object.open("POST", 'new2.php', true);
    xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xhr_object.send("url="+texte);
    xhr_object.onreadystatechange = function() { 
    if(xhr_object.readyState == 4)
    	{
    	if (xhr_object.statut = 200)
    	{
    	texte=xhr_object.responseText;
    		document.getElementById('publicite').innerHTML = "<a><IMG SRC=" + texte + "></a>" ;
     
    	setTimeout("file(texte)",15000); 
    	}
    		}
    }
    }
     
     
    </script> 
    <script for=window event=onload language="JavaScript">
    {
    do
    {
    }
    while (typeof file != 'function')
    texte='promo'
    texte = file('start');
    }
    </script>
    effectivement mon soucis n'était pas la ou je pensais . Enfin pas tout a fait , comme l'ancien code était fait de petit bout piquer a gauche a droite dans différent cours j'avait dans une partie xhr. et dans une autre xhr_objet ... ca aide pas pour que ca marche lol

    deux questions : si je colle mon settimeout sans les 'info' de lancement de la procédure elle tournera quand même ? c est pas la qu'on la lance ?
    je fait du javascript que depuis maxi 48 h , j'avoue ne pas bien maitriser toutes les subtilités du language

    pour le send ,si je t ai bien compris , il doit être après que le readystate soit passé a 4 ? si c'est ca de un ca m'arrange pas de deux dans les exemples démo etc que j'ai trouvé sur google c’était à chaque fois l'inverse vu que l'on utilisais ce qu'il envoyais pour 'construire' la réponse qu'il devait faire.
    un exemple : une fonction vérifiant si le pseudo introduit est dispo ou pas
    un autre : le fichier appelé renvoie le texte qui lui est envoyé mais inversé.


    concernant le "setRequestHeader" j'avoue que je le désignais par pur ignorance je n'ai pas été foutu de trouver un seul site m'expliquant à quoi il sert et surtout pas quelles paramètres il prend à par celui qu'il a dans mon code

    quand au message d'erreur ... ben en fait y en avait pas ... d'ou ma conclusion que la function ne se lancait pas . alors qu'en fait au finish ma dernière sueur a été sur une requête mysql sous php qui plantait dans le fichier appelé. comme je suis super debutant dans le web programming je ne connais aucun outils de débogage ... je fait ca à coup d'echo etc et bien sur l'echo ne fonctionnais pas dans le cas présent vu que mes erreurs php . étaient dans le fichier appelé qui n'avait de ce fait aucune fenêtre d'affichage.

    je travaille au mieux sur notepad++ pour le codage "général" ensuite la "finition" je la fait à coup de code édit du cpanel.

    ceci étant provisoirement fini ( un code fini ca n'existe pas y a tjs moyen de faire mieux) je vais m'attaque a un mouseover sur un ensemble de map Area qui doivent déclencher des ptits scripts pour faire défiler verticalement et horizontalement un tableau. si t' as de bon lien sur le sujet fait moi signe
    et surtout un big merci de t'etre penché sur mes soucis de codage

    l'indentation faut vraiment que je m'y mette lol

  6. #6
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Citation Envoyé par atc666 Voir le message
    ceci étant provisoirement fini
    NOPE!

    Y'a des horreurs.

    Pour commencer, où as-tu pêché ça ?
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <script for=window event=onload language="JavaScript">
    {
    do
    {
    }
    while (typeof file != 'function')
    texte='promo'
    texte = file('start');
    }
    </script>
    Bon grâce à toi j'ai au moins appris un truc, je ne connaissais pas les attributs for et event de la balise <script>. Cependant, comme c'est bien marqué en gros ici, Don't use it! C'est une extension Microsoft, ça ne marche que sous MSIE. D'ailleurs, si on réorganise le code, on peut voir ça :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    do {} while (typeof file != 'function');
    C'est une boucle qui ne fait rien ! Ce type de boucle, qui monopolise le processeur en attendant qu'un certain évènement se produise, est appelé attente active. Et en général, c'est une mauvaise pratique ! Si par hasard, la fonction file n'est jamais définie (par exemple à cause d'une erreur de syntaxe), ton script va boucler à l'infini, et ça va occuper le processeur pour rien. Sous certains navigateurs, ça peut se terminer en freeze avec obligation de fermer la page, voire tuer le programme…

    D'autre part,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xhr_object.open("POST", 'new2.php', true);
    Pourquoi ce 3e paramètre true ? Tu sais que ça rend la requête synchrone ? Avec ça, la page et les scripts sont bloqués le temps que la réponse du serveur arrive. Tu perds tous les avantages de l'AJAX !
    Et puis, fais-moi le plaisir de retirer ces attributs language de tes balises <script>, je te l'ai déjà dit, ils sont obsolètes.



    Ensuite,
    Citation Envoyé par atc666 Voir le message
    si je colle mon settimeout sans les 'info' de lancement de la procédure elle tournera quand même ?
    Ça, tu devrais le savoir vu que c'est toi qui as codé la fonction. Enfin, je crois…
    En fait, tu n'utilises jamais le paramètre ur de ta fonction. Peut-être que la variable globale texte joue ce rôle à sa place.
    Note qu'il est recommandé d'utiliser des paramètres plutôt que des variables globales. En général, moins il y a de variables globales dans la mémoire, plus le script est efficace. Et puis ça fait du code mieux organisé, et donc plus facile à maintenir.
    Avec la syntaxe de setTimeout que je t'ai conseillée, en théorie tu peux passer des arguments supplémentaires, comme ceci :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(file, 15000, texte);
    Mais en pratique ça ne marche pas sous MSIE. Par contre, tu peux tout à fait envelopper l'appel dans une fonction anonyme :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(function() { file(texte); }, 15000);
    Il faudra que tu t'habitues à ce genre de syntaxe : en JavaScript les fonctions sont des variables comme les autres. Quand on les utilise en tant que variable, on ne les appelle pas, donc on ne met pas de parenthèses. Pour faire un exemple adapté à notre situation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function bidule() {
       if (this.readyState == 4) {
          if (this.status == 200) {
             alert(this.responseText);
          } else {
             alert("problème de connexion");
          }
       }
    }
     
    xhr.onreadystatechange = bidule;
    Voilà, j'ai utilisé la fonction bidule comme une variable.



    Citation Envoyé par atc666 Voir le message
    Pour le send ,si je t ai bien compris , il doit être après que le readystate soit passé a 4 ?
    Non, je voulais dire que pour que ça marche, il faut placer le code de traitement dans la fonction de rappel, puis appeler send. Cela dit, tu as bien corrigé ça dans ton nouveau code, à un détail près : dans le cas où la réponse est déjà dans le cache du navigateur, elle arrivera presque instantanément, et à ce moment-là, peut-être que ta fonction de rappel onreadystatechange ne sera pas encore attachée. Pour corriger cette légère erreur, place ton appel à send après avoir attaché la fonction. En clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    xhr.onreadystatechange = function() {
       ...
    }
    xhr.send(...);


    Citation Envoyé par atc666 Voir le message
    concernant le "setRequestHeader" j'avoue que je le désignais par pur ignorance je n'ai pas été foutu de trouver un seul site m'expliquant à quoi il sert et surtout pas quelles paramètres il prend à par celui qu'il a dans mon code
    C'est ce qu'on appelle un header HTTP. Un message HTTP est composé de deux parties : les en-têtes (headers) et le corps (body). À ne pas confondre avec le <head> et le <body> d'une page HTML, qui se trouvent tous deux dans le corps du message HTTP. Les en-têtes contiennent des informations telles que le type MIME (content-type), l'encodage (charset), la politique de cache (cache-control ou pragma), les cookies, etc.
    En théorie, une requête AJAX en mode post est capable d'envoyer tout type de contenu. Pour indiquer au serveur qu'il s'agit de variables de formulaire, on envoie le type application/x-www-form-urlencoded. C'est le même type MIME que les formulaires HTML classiques. Les données y sont représentées comme dans les requêtes get :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    param1=value1&param2=value2&param3=value3...


    Citation Envoyé par atc666 Voir le message
    comme je suis super debutant dans le web programming je ne connais aucun outils de débogage ...
    Pourtant, c'est pas ça qui manque Sous Firefox, il y a l'extension Firebug. Tu l'installes, tu relances Firefox et tu fais F12.
    Sous IE7+, c'est intégré, fais F12.
    Sous Safari, Chrome et Opera, c'est intégré aussi, je me souviens plus exactement mais il y a un menu qui s'appelle « outils de développement » ou quelque chose du genre.
    Bref. Tous ces outils sont disponibles pour JS sous la forme de la variable globale console, tu peux donc émettre des informations de déboguage avec la fonction console.log entre autres. Et si tu as déjà fait du déboguage pas-à-pas, ça existe aussi en JS ! Tu peux même forcer un breakpoint en utilisant le mot-clé debugger dans ton code source. Comme tu vois, ce ne sont pas les possiblités qui manquent
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [langage] Creer une fonction qui met en majuscule ?
    Par Cyber@l dans le forum Langage
    Réponses: 6
    Dernier message: 04/12/2003, 18h44
  2. fonction qui initialise a blanc zone de texte
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 27/11/2003, 16h36
  3. fonction qui en fait planter une autre
    Par ickis dans le forum C
    Réponses: 5
    Dernier message: 18/08/2003, 21h33
  4. Fonction qui s'active lorsqu'un Form bouge
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/05/2003, 12h54
  5. 2 fonctions qui tournent en même temps
    Par GOUGOU1 dans le forum C
    Réponses: 7
    Dernier message: 07/12/2002, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo