2011-06-13 5 views
0

Comment utiliser jQuery pour lire le premier élément dans le contenu d'un fichier XML appelé music.xml, les afficher dans un DIV pendant cinq secondes, lire le prochain XML article et affiche que pendant cinq secondes, boucle dans le fichier XML, puis recommence depuis le début?Comment charger le contenu du fichier XML de manière séquentielle en HTML en utilisant jQuery

HTML:

<div id="music"> 
    <div id="albumcover"></div> 
    <div id="songdescription"></div> 
</div> 

music.xml

<songs> 
    <item> 
     <image>music_01.jpg</image> 
     <description>Description of first song</description> 
    </item> 
    <item> 
     <image>music_02.jpg</image> 
     <description>Description of second song</description> 
    </item> 
    <item> 
     <image>music_03.jpg</image> 
     <description>Description of third song</description> 
    </item> 
</songs> 
+0

Où se trouve ce fichier 'music.xml'? –

+0

il se trouve dans le même répertoire que le fichier HTML et tous les fichiers JPG –

Répondre

1

Tout d'abord, la façon dont je sais comment analyser ces utilisant jQuery donnera des problèmes avec le tag image (modifier: que si vous analysez le texte, XML se révèle être fine), comme une fois que vous l'envelopper dans jQuery va convertir <image>text</image> en <img>text. Vous pouvez faire face à cela, mais ce n'est pas joli. Supposons que vous avez renommé <image> en <cover>.

Fonction jsFiddle, moins la partie demande $.ajax.

var music = []; 
var musicIndex = -1; 
var delay = 5000; 
var intervalId; // in case you want to clearInterval 
var $cover = $("#albumcover"); 
var $desc = $("#songdescription"); 

function rotateMusic() { 
    // Loop back to the beginning if necessary 
    if (++musicIndex === music.length) { 
    musicIndex = 0; 
    } 
    console.log(music[musicIndex].cover); 

    // Create a new image, tell it to append itself and description 
    // once it's loaded, tell it to load 
    $("<img>").load(function() { 
    $cover.empty().append($(this)); 
    $desc.text(music[musicIndex].desc); 
    }).attr("src", music[musicIndex].cover); 
} 

$.ajax({ 
    type: "GET", 
    url: "music.xml", 
    dataType: "xml", 
    success: function(xml) { 
      // Parse each item as a node 
      $(xml).find('item').each(function() { 
       // Add contents of item to music array 
       var $item = $(this); 
       music.push({ 
       cover: $item.find('image').text(), 
       desc: $item.find('description').text() 
       }); 

      }); 
      // Start rotating music, then set it to a delay 
      rotateMusic(); 
      intervalId = setInterval(rotateMusic, delay); 
      } 
}); 
+0

Il y a un bogue quelque part, j'ai tout le JS à exécuter sous $ (document) .ready et il arrête la rotation sur la deuxième image et la troisième description. –

+1

J'ai fait quelques révisions qui devraient corriger les choses. Notamment, j'aurais dû déplacer l'appel vers 'rotateMusic' en dehors de l'instruction' $ (xml) ... each'. – brymck

+0

merveilleux, qui l'a réparé –

2

Essayez quelque chose comme ceci:

$.ajax({ 
    'dataType': 'xml', 
    'success': function(xml) 
    { 
    $(xml).find('item').each(function() 
    { 
     var image = $(this).find('image').text(); 
     var description = $(this).find('description').text(); 

     $('<div id="music" />') 
     .append($('<div id="albumcover" />').append($('<img />').attr('src', image))) 
     .append($('<div id="songdescription" />').text(description)) 
     .appendTo('body'); 
    }); 

    // Add the code for the carousel here. 
    }, 
    'type': 'get', 
    'url': 'music.xml' 
}); 

Vous devez ajuster les chemins (pour le fichier xml et où les images sont localisées) ainsi que l'endroit où vous voulez l'ajouter dans le document. Actuellement, il s'ajoutera juste avant l'élément BODY de fermeture.

Ensuite, je vous recommande de chercher un plugin jQuery carrousel qui va tourner à travers eux plutôt que de devoir faire face à cette partie de celui-ci. Vous devriez vérifier jCarousel Lite.

+0

Si le fichier xml se trouve dans le même dossier que le fichier HTML et les images, vous ne devriez pas avoir à modifier le chemin depuis le script ci-dessus. –

+0

Juste comme une note, jQuery analysera '$ (" text ")' comme '[," text "]'. C'est-à-dire, "" texte "' ne sera pas un enfant de '' (pas '', surtout) mais un frère ou une soeur. Donc, vous voudriez remplacer cela, même si c'est juste quelque chose comme 'xml.replace (/ image/i," cover ")'. Le reste fonctionne bien, je pense. – brymck

+0

@Brian: Je l'ai testé sur ma machine ici en utilisant le code ci-dessus et ça a bien fonctionné. jQuery n'a pas changé le '$ (" text ")' de la réponse comme vous l'avez suggéré. –

Questions connexes