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

jQuery Discussion :

Exécution script externe


Sujet :

jQuery

  1. #1
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut Exécution script externe
    Bonjour, je suis novice en javascript / jQuery et je rencontre un problème.

    Je cherche à réaliser un formulaire ou les insertions / modifications / supressions seront dynamiques, j'ai plutôt bien avancé seulement j'ai quelques difficultés à inclure ou éxecuter mon script.

    Voici le début de mon script, celui-ci ne contient qu'une fonction mais je ne veux pas l'écrire dans toutes mes pages, donc j'ai choisi de l'inclure en tant que fichier externe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $(document).ready(function() 
    	{  
    	 $(".dynamic-edit-class").click(function()  
    	  { 
    	   if( $(this).attr("contenteditable") == "true") 
    	   {
    Le problème c'est que si je comprend bien, le script s'éxecute une fois que toute la page est bien chargée, et la fonction devrait s’exécuter au moment d'un clic sur un objet de la classe "dynamic-edit-class". Enfin c'est ce que je voudrais réaliser.

    C'est là le problème, si ma fonction avais été écrite directement dans ma page PHP contenant le formulaire, sa aurait fonctionné (j'ai développé sa avec une page de test ou tout était écrit, script/html/php).

    J'ai essayé d'encapsuler le code de mon fichier.js dans une fonction et de l'appeler via un OnClick sur mes éléments de classe "dynamic-edit-class", sans succès.

    Je ne sais pas si je suis très claire, en gros je veux que ma page charge l'intégralité du code de mon fichier.js, pour qu'a chaque clic sur un élément précis, le script s’exécute. J'voudrais pas avoir à utiliser les évènements OnClick, mais plutôt que mon script détecte quand je clic sur un élément de la classe cible.

    J'précise que j'ai déja demandé à google, testé diverses solutions mais sans succès !

  2. #2
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    je pense que tu lances bien le chargement du fichier lors du click, en revanche ce que tu n'as pas saisie c'est qu'il faut laisser le temps à ton navigateur de charger le script et de l'interpréter. En gros tu dois trouver un événement qui te diras "le script est prêt" et ensuite seulement effectuer les actions nécessaires.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  3. #3
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Hmm, je suis pas certain d'avoir bien saisi, je pense vraiment que mon code n'est même pas executé !

    Lors d'un clic sur un des champs modifiable, un alert devrait pop, sauf que même au bout de 5 ou 10secondes, rien du tout !

    J'ai même placé un alert tout en haut de mon script, donc des son chargement il devrait pop cet alerte, sauf que non :/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    alert('Script chargé');
    $(document).ready(function() 
    		{  
    		 $(".dynamic-edit-class").click(function()  
    		  { 
    		   if( $(this).attr("contenteditable") == "true") 
    		   {
    De même, lorsque le script est écris en dur dans une page de test contenant des champs modifiable et tout, sa fonctionne très bien, au clic sur un des champs de ma class dynamic-edit-class mon script s'execute très bien ! C'est juste pour moi un problème d'inclusion, y a quelque chose qui m'échappe, lorsque j'inclus un fichier .js, le code de clui-ci est chargé dans ma page l'incluant ou attend-il un évènement (ici un clic sur un élément de cla class 'dynamic-edit-class) pour s'éxecuter ?

  4. #4
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    peut tu mettre les codes correspondant au chargement du script ?
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  5. #5
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    A vrai dire j'utilise une simple inclusion, comme sa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>
    <script src="styles/js/ModifDynamique.js"></script>
    ...
    Le tout dans ma balise <head>

    Je ne sais pas si c'est la bonne méthode, j'apprend sur le tas, j'ai du manquer quelque chose...

    EDIT: Mon script en question, c'est ModifDynamique.js

  6. #6
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    Peut tu regarder l'ordre des chargements des scripts dans les outils de développements ? Sous chrome tu appuie sur F12 puis c'est dans l'onglet network, il faut toutefois ouvrir la console avant le chargement de ta page. De plus tu pourras constaté si tu as des erreurs JS qui font que ton script ne fonctionne pas.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  7. #7
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    J'ai résolu tout seul mon problème.

    Dans mon cas, c'était un simple problème de lien lors de l'inclusion. D'autre part, pour que cela soit utile à d'autres néophytes, une page javascript contenant une fonction anonyme, comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $(document).ready(function() 
    		{  
    		 $(".dynamic-edit-class").click(function()  
    		  { ...
    C'est à dire une fonction non nommée qui attend juste une action, ici un clic sur un élément de la classe dynamic-edit-class. Et bien ces fonctions s'éxecutent automatiquement, pas besoins d'appeler le fichier sur un évènement onclick ou autre, du moment que le fichier est inclu entre deux balises <script>, le code est interpreté et attend juste que sa fonction s'active ! Magique.

    Corrigez moi si je me trompe, mais dans mon cas c'est ce qu'il se passe, ou du moins ce que j'en déduis ^^

  8. #8
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    ces fonctions anonymes sont un peu moins magiques que ça
    il s'agit de fonction de callback, concrètement les méthodes ready & click peuvent avoir comme argument une fonction, cette fonction sera exécutée lorsque le gestionnaire aura gérer l'événement.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  9. #9
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Finalement j'ai rien résolu du tout !

    J'ai éssayé plein de combinaisons, d'appeler ma fonction sur mon js externe depuis différents évènements, de modifier ma fonction, je ne trouve pas ce qui fonctionne, un coup la modification fonctionne, l'autre coup d'apres sa fonctionne plus, dès fois un champ sur deux est modifié, ...
    Là, je sèche !
    Voici ma page html avec un léger formulaire, sur lequel je fais mes test
    Code html : 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
    <!DOCTYPE html> 
    <html> 
    <head> 
    <meta charset="utf-8"> 
    <script src="styles/js/jquery-2.1.1.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
    <script type="text/javascript" src="/svn/trunk/TPUSEP/styles/js/ModifDynamique.js"></script>
     
     
     </head> 
     
    <h2>Inscriptions des élèves au cross USEP 2015</h2>
    		<h3>Pour une école non membre de l'USEP</h3>
    		<input type="hidden" id="cpt" value="1">
     
    			<div id="insceleve">
    <div class="test" id="1">
    				<fieldset class='InfoEleve' >
    					<label for='nom'>Nom de l'élève  </label><input class="dynamic-edit-class" contenteditable='true' type='text' name='nom' id='nom' onchange="test()" onblur="test()" onfocus="test()">
    					<label for='telephone'>Date de naissance  </label><input class="dynamic-edit-class" contenteditable='true' type='text' name='telephone' onchange="test()" onblur="test()" onfocus="test()" id='telephone'>
     
    					<input type='checkbox' name='certificat' id='certificat' /> <label for='certificat'>Certificat d'apptitude</label>
    					<input type='checkbox' name='autorisationP' id='autorisationP' /> <label for='autorisationP'>Autorisation parentale</label>
    				</fieldset>
    </div>
    			</div>
     
     
     
     
     </body> 
     
    </html>

    Voici ici mon js externe, contenant le traitement

    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
    function test()
    {
    	alert('1');
    	$(document).ready(function() 
    	{  
    		$(".dynamic-edit-class").click(function()  
    		{ 
    			alert('2');
    			if( $(this).attr("contenteditable") == "true") 
    			{    
     
    				var contenu_avant = $(this).attr('value');
    				var id_bdd = $(this).closest('div').attr('id');
    				var champ_bdd = $(this).attr("name"); 
    				//alert("contenu avant = " + contenu_avant); 
    				alert(id_bdd);      
    				$(this).blur(function() 
    				{ 
    					var contenu_apres = $(this).attr('value');
    					if (contenu_avant != contenu_apres) 
    					{ 
    						parametre='id='+id_bdd+'&champ='+champ_bdd+'&contenu='+contenu_apres ; 
    						//alert(param) ; 
    						$.ajax(
    						{ 
    							url: "/svn/trunk/TPUSEP/TestModificationDynamiques/updatedynamique.php",  
    							type: "POST",  
    							data: parametre,  
    							success: function(html)
    							{  
    								// alert(html); 
    							} 
    						}); 
    					} 
    				}); 
     
    			}; 
    		};
    	};
    }
    et voici, pour compléter, un fichier php permettant l'échange avec mysql.

    Code php : 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
    <?php  
    // 14-01-2014 
    // $_POST[id]   contient l'id de la base de données 
    // $_POST[champ]  contient le nom du champ à modifier 
    // $_POST[contenu] contient la nouvelle valeur du champ 
    // la base de données s'appelle 'Agenda' et contient 1 table 'repertoire' contenant 2 champs 'nom' et 'telephone'  
     
      $id=($_POST["id"]);  
      $champ=($_POST["champ"]);  
      $contenu=($_POST["contenu"]);  
      $BDD="database"; 
      $table="nomtable";  
      print_r($champs);
      print_r($id);
      print_r($contenu);
      // accès BDD et UPDATE 
      // le code ci-dessous est mis en commentaire, le stockage dans un fichier servira de simulation. 
       $link=mysql_connect("host", "login", "password") or die(mysql_error()); 
       mysql_select_db($BDD); 
       mysql_query("SET NAMES 'utf8'");  
     
       $sql = "UPDATE $table SET `$champ`='$contenu' WHERE id=$id "; 
      	mysql_query($sql) or die(mysql_error());  
     	mysql_close($link); 
     
     	echo "success"; 
      // fin accès à la base de données 
     
      // début de simulation -> écriture dans le fichier 'simulation.txt' 
      /*$trace = "id= ".  $id. " champ= ".  $champ . "  contenu= " . $contenu."\n"; 
      $monfichier = fopen("simulation.txt", "a+"); 
      fputs($monfichier, $trace); 
      fclose($monfichier); */
    ?>

    Le but final est qu'au chargement du formulaire, les champs se remplissent avec les info issue de la base de donnée et qu'ensuite on puisse les modifier à la volée, en switchant de champs avec TAB ou à la souris, je veux que chaque changement de value soit aussitot porté en base de donnée.

  10. #10
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Ho que non, s'aurait été trop beau ^^

    Néamoins je galère à trouver la bonne combinaison entre ma fonction javascript et ses conditions de déclanchement et sur quel évènement placer cette fonction sur les champs de mon formulaire !

    Peut etre existe-il quelque chose comme les listener ? une fonction qui reste passive tant qu'un champ n'a été modifié ? J'suis à court d'idée !
    Merci encore de ton aide Darkaurora ^^

  11. #11
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Il suffit logiquement d'inclure dans votre page web le fichier JS contenant le code (corrigé) ci-dessous avec un banal <script src="monFichier.js"></script>

    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
    $( function(){
     
        /*
         * Code dynamique, on() avec deux sélecteurs
         */
        $( "body" ).on( "click", ".dynamic-edit-class", function(){
     
            /*
             * Propriété du DOM, retourne true ou false
             * Voir : http://api.jquery.com/prop/
             */
            if ( $( this ).prop( "contenteditable" ) ){
     
                // votre code
            }
        });
     
    });
    FAQ jQuery Différences entre on() avec 1 ou 2 sélecteurs

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  12. #12
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Merci beaucoup pour votre aide,

    J'ai corrigé mon code mais il y reste quelque chose que je ne comprend pas. Mon fichier js contient une fonction qui est sensé s'activer au moment d'un click sur un objet d'une certaine classe, seulement, sa semble ne pas fonctionner :/

    J'ai placé un alert, et je ne rentre même pas dans la fonction. Dois-je tout encapsuler dans une fonction nommée et l'appeler depuis mon html sur un onfocus ? Je préfererai pas :/

  13. #13
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Copier-coller ci-dessous, tester avec un clic dans la division éditable et une alerte il y aura.

    Code du fichier monCode.js :

    Code JavaScript : 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
    $( function(){
     
       /*
        * Code dynamique, on() avec deux sélecteurs
        */
       $( "body" ).on( "click", ".dynamic-edit-class", function(){
     
           /*
            * Propriété du DOM, retourne true ou false
            * Voir : <a href="http://api.jquery.com/prop/" target="_blank">http://api.jquery.com/prop/</a>
            */
           if ( $( this ).prop( "contenteditable" ) ){
     
               // votre code
     
               alert( "Mais si je fonctionne !");
           }
       });
     
    });

    Code de la page web :

    Code HTML : 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
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
        <meta http-equiv="cache-control" content="public, max-age=60">
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1.0">
        <meta name="author" content="Daniel Hagnoul">
        <title>Test</title>
        <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
        <script src="monCode.js"></script>
        <style>
            .dynamic-edit-class { margin: 12px; padding: 6px; width: 200px; height: 100px; border: 1px solid black; }
        </style>
    </head>
    <body>
     
    <div class="dynamic-edit-class" contenteditable>Hello</div>
     
    </body>
    </html>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  14. #14
    Membre régulier Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Merci pour votre aide, maintenant sa fonctionne, j'avais des erreurs de code, le votre a toujours fonctionné

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/06/2012, 09h07
  2. Réponses: 2
    Dernier message: 20/10/2010, 12h16
  3. Tomcat ne veut pas exécuter un script externe
    Par diamonds dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 14/03/2007, 21h01
  4. exécuter un script externe à java.
    Par diamonds dans le forum EDI et Outils pour Java
    Réponses: 2
    Dernier message: 05/03/2007, 17h46
  5. Réponses: 5
    Dernier message: 19/04/2005, 08h50

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