11549 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je vais tacher de faire simple avec mon niveau en js:

Contexte (facultatif)
J'essaye d'écrire une routine pour afficher des flashmessage en cas d'erreur (erreur de login par exemple). J'utilise noty pour ce faire jusque là pas de pb.

Je récupère les message à afficher via mon php mais via la fonction flashdata du framework Code Igniter qui permet de stocker une var le temps d'une requete serveur via la session data.

La question of the dead
Mon code
try { 
  var message = <?php echo $this->session->flashdata('message'); ?> ;
  if (message){
    noty({text:'<?php echo $this->session->flashdata('message') ?>' });
  }
  catch(err) { }
}


Sachant que flashdata('message') risque d'être vide j'ai souhaiter limiter la génération d'erreur avec un try mais j'ai toujours une erreur dans firebug.

Ou ai-je fait une erreur ? Sachant que je ne code pas en js au quotidien Smiley cligne

Merci par avance de votre aide.
Modifié par perelk (30 Jul 2012 - 16:36)
Bonjour,
La structure d'un try/catch est la suivante :
try {
}
catch (e) {
}
et non
try {
    catch (e) {
    }
}
Merci de votre aide,
Oups erreur de frappe de ma part, corrigé mais toujours l'erreur dans ma console firebug

try { 
  var message = <?php echo $this->session->flashdata('message'); ?> ;
  if (message){
    noty({text:'<?php echo $this->session->flashdata('message') ?>' });
  }
  }
  catch(err) { }


Je repose ma question peut-être plus clairement encore :
est-ce normal d'avoir l'erreur dans la console firebug sur une fonction que l'on met dans un try car on sait qu'elle peut planter ?
Heu en fait le pb vient pour le moment de l'affectation de la valeur issu du php à la variable message car dans la plus part des cas cette fonctionne à le rendu suivant car je n'ai pas de message d'erreur à afficher :

try { 
  var message =  ;
  if (message){
    noty({text:'' });
  }
  }
  catch(err) { }


Or cette affectation vide génère une erreur. Cette erreur n'est pas bloquante mais je trouvai laid de la laisser ce produire donc je pensai qu'avec un try cela gérerai ce pb.
Je me réponds à moi même je sais c'est le mal ^^
Bon au final sauf erreur de ma part il semble que firefox/firebug génère une erreur dans la console si une erreur se produit dans le bloc try ^^.

Si qqun peut me confirmer cela avec un simple script try{ adddalert('alert');} catch{e} par exemple ? SI cela s'avère confirmer je passerai le sujet en résolut.
Bonjour,

Si je ne me trompe pas, try/catch n'attrapera qu'une erreur qui est "throw"


throw 'oh oh, problème';


Dans ton cas, c'est donc totalement inutile, et c'est un "anti-pattern" assez clair que d'utiliser un code du genre dans un try/catch (Déjà que try/catch...)

Tu devrais donc t'assurer qu'au moins une valeur par défaut soit passé par PHP.


echo isset( $this->session->flashdata('message') ) ? $this->session->flashdata('message') : 'false';


Une réflexion assez pertinente au sujet de l'utilisation de try/catch en javascript a été postée le groupe google de node: http://groups.google.com/forum/#!topic/nodejs/1ESsssIxrUU (Lecture très intéressante vraiment)

Pour plus de détails sur la syntaxe en elle même, la référence de MDN est la plus fiable:
http://developer.mozilla.org/en/JavaScript/Reference/Statements/try...catch
http://developer.mozilla.org/en/JavaScript/Reference/Statements/throw
Modifié par Vaxilart (01 Aug 2012 - 03:05)
Oui effectivement je peux tester avec un isset avant en php mais je voulais éviter de coller une ligne de php avant mon script 'juste pour tester' une variable.

Pour le fond je suis d'accord que le try/catch n'est la forme la plus classe d'un dev d'où ma question içi pour avoir l'avbis de personne plus expérimenté et qui doivent surement rencontrer ce type de questionnement régulièrement.

Merci encore de votre aide
Salut perelk,

Essaye avec ce code là :

//A noter : l'utilisation des apostrophes simples
var message = '<?php echo $this->session->flashdata('message'); ?>' ;
if (message){
   noty({text:message });
}


Je pense que l'erreur que tu détecte vient du rendu que tu décris :

var foo = ;

est syntaxiquement invalide, et génère une erreur de Javascript

Avec le premier morceau de code tu aura un rendu du type :

//Dans le cas d'un message vide
var message = '' ;
if (message){
   noty({text:message });
}
//Dans le cas d'un message renseigné
var message = 'Test message' ;
if (message){
   noty({text:message });
}


Je ne connais pas le framework que tu utilises, mais fais attention au cas où ton message contiendrait une apostrophe :
"L'information n'est pas connue à ce jour"

Si ton framework n'échappe pas les apostrophes (ce que j'imagine) tu auras également une erreur JS :

//Coupure et réouverture de string à cause des '
var message = 'L'information n'est pas connue à ce jour' ;
if (message){
   noty({text:message });
}


Deux solutions :
* Echapper les apostrophes (<?php echo addslashes($this->session->flashdata('message')); ?>)
* Utiliser des guillemets (var message = "<?php echo $this->session->flashdata('message'); ?>";)

Je te conseille la première Smiley cligne
Bien vu les apostrophes par défaut ! Simple et classe ^^

Je passe ca en résolut, merci encore.